diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index 91035dd..fee062b 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -1459,6 +1459,7 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi //============================================================================ void CDockContainerWidget::dropWidget(QWidget* Widget, DockWidgetArea DropArea, CDockAreaWidget* TargetAreaWidget) { + std::cout << "dropWidget" << std::endl; CDockWidget* SingleDockWidget = topLevelDockWidget(); if (TargetAreaWidget) { @@ -1472,6 +1473,19 @@ void CDockContainerWidget::dropWidget(QWidget* Widget, DockWidgetArea DropArea, // If there was a top level widget before the drop, then it is not top // level widget anymore CDockWidget::emitTopLevelEventForWidget(SingleDockWidget, false); + CDockWidget* DockWidget = qobject_cast(Widget); + if (!DockWidget) + { + CDockAreaWidget* DockArea = qobject_cast(Widget); + auto OpenDockWidgets = DockArea->openedDockWidgets(); + if (OpenDockWidgets.count() == 1) + { + DockWidget = OpenDockWidgets[0]; + } + } + + this->window()->activateWindow(); + d->DockManager->emitWidgetDroppedSignals(Widget); } diff --git a/src/DockManager.cpp b/src/DockManager.cpp index f3168f1..557bb5f 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -153,6 +153,12 @@ struct DockManagerPrivate * Adds action to menu - optionally in sorted order */ void addActionToMenu(QAction* Action, QMenu* Menu, bool InsertSorted); + + /** + * This function updates the focus style of the given dock widget and + * the dock area that it belongs to + */ + void updateDockWidgetFocus(CDockWidget* DockWidget); }; // struct DockManagerPrivate @@ -425,6 +431,54 @@ void DockManagerPrivate::addActionToMenu(QAction* Action, QMenu* Menu, bool Inse } +//=========================================================================== +void updateDockWidgetFocusStyle(CDockWidget* DockWidget, bool Focused) +{ + DockWidget->setProperty("focused", Focused); + DockWidget->tabWidget()->setProperty("focused", Focused); + DockWidget->tabWidget()->updateStyle(); + internal::repolishStyle(DockWidget); +} + + +//=========================================================================== +void updateDockAreaFocusStyle(CDockAreaWidget* DockArea, bool Focused) +{ + DockArea->setProperty("focused", Focused); + internal::repolishStyle(DockArea); + internal::repolishStyle(DockArea->titleBar()); +} + + +//============================================================================ +void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) +{ + CDockAreaWidget* NewFocusedDockArea = nullptr; + if (FocusedDockWidget) + { + updateDockWidgetFocusStyle(FocusedDockWidget, false); + } + FocusedDockWidget = DockWidget; + updateDockWidgetFocusStyle(FocusedDockWidget, true); + NewFocusedDockArea = FocusedDockWidget->dockAreaWidget(); + if (!NewFocusedDockArea || (FocusedArea == NewFocusedDockArea)) + { + return; + } + + if (FocusedArea) + { + std::cout << "FocusedArea" << std::endl; + QObject::disconnect(FocusedArea, SIGNAL(viewToggled(bool)), _this, SLOT(onFocusedDockAreaViewToggled(bool))); + updateDockAreaFocusStyle(FocusedArea, false); + } + + FocusedArea = NewFocusedDockArea; + updateDockAreaFocusStyle(FocusedArea, true); + QObject::connect(FocusedArea, SIGNAL(viewToggled(bool)), _this, SLOT(onFocusedDockAreaViewToggled(bool))); +} + + //============================================================================ CDockManager::CDockManager(QWidget *parent) : CDockContainerWidget(this, parent), @@ -879,25 +933,6 @@ CIconProvider& CDockManager::iconProvider() } -//=========================================================================== -void updateDockWidgetFocusStyle(CDockWidget* DockWidget, bool Focused) -{ - DockWidget->setProperty("focused", Focused); - DockWidget->tabWidget()->setProperty("focused", Focused); - DockWidget->tabWidget()->updateStyle(); - internal::repolishStyle(DockWidget); -} - - -//=========================================================================== -void updateDockAreaFocusStyle(CDockAreaWidget* DockArea, bool Focused) -{ - DockArea->setProperty("focused", Focused); - internal::repolishStyle(DockArea); - internal::repolishStyle(DockArea->titleBar()); -} - - //=========================================================================== void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) { @@ -909,6 +944,7 @@ void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) CDockWidget* DockWidget = nullptr; auto DockWidgetTab = qobject_cast(focusedNow); + std::cout << "FocuseNow " << focusedNow->metaObject()->className() << std::endl; if (DockWidgetTab) { DockWidget = DockWidgetTab->dockWidget(); @@ -918,33 +954,13 @@ void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) DockWidget = internal::findParent(focusedNow); } - if (!DockWidget) + if (!DockWidget || !DockWidget->tabWidget()->isVisible()) { return; } - CDockAreaWidget* NewFocusedDockArea = nullptr; - if (d->FocusedDockWidget) - { - updateDockWidgetFocusStyle(d->FocusedDockWidget, false); - } - d->FocusedDockWidget = DockWidget; - updateDockWidgetFocusStyle(d->FocusedDockWidget, true); - NewFocusedDockArea = d->FocusedDockWidget->dockAreaWidget(); - if (!NewFocusedDockArea || (d->FocusedArea == NewFocusedDockArea)) - { - return; - } - - if (d->FocusedArea) - { - disconnect(d->FocusedArea, SIGNAL(viewToggled(bool)), this, SLOT(onFocusedDockAreaViewToggled(bool))); - updateDockAreaFocusStyle(d->FocusedArea, false); - } - - d->FocusedArea = NewFocusedDockArea; - updateDockAreaFocusStyle(d->FocusedArea, true); - connect(d->FocusedArea, SIGNAL(viewToggled(bool)), this, SLOT(onFocusedDockAreaViewToggled(bool))); + std::cout << "CDockManager::onFocusChanged " << DockWidget->tabWidget()->text().toStdString() << std::endl; + d->updateDockWidgetFocus(DockWidget); } @@ -967,6 +983,28 @@ void CDockManager::onFocusedDockAreaViewToggled(bool Open) } +//=========================================================================== +void CDockManager::emitWidgetDroppedSignals(QWidget* DroppedWidget) +{ + CDockWidget* DockWidget = qobject_cast(DroppedWidget); + if (DockWidget) + { + DockWidget->tabWidget()->setFocus(Qt::OtherFocusReason); + emit dockWidgetDropped(DockWidget); + return; + } + + CDockAreaWidget* DockArea = qobject_cast(DroppedWidget); + if (!DockArea) + { + return; + } + + DockWidget = DockArea->currentDockWidget(); + DockWidget->tabWidget()->setFocus(Qt::OtherFocusReason); +} + + } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockManager.h b/src/DockManager.h index e0983fb..a15753b 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -122,6 +122,12 @@ protected: */ CDockOverlay* dockAreaOverlay() const; + /** + * A container needs to call this function if a widget has been dropped + * into it + */ + void emitWidgetDroppedSignals(QWidget* DroppedWidget); + /** * Show the floating widgets that has been created floating */ @@ -483,6 +489,18 @@ signals: * docking system but it is not deleted yet. */ void dockWidgetRemoved(CDockWidget* DockWidget); + + /** + * This signal is emitted if a dock widget has been dropped into a new + * position + */ + void dockWidgetDropped(CDockWidget* DockWidget); + + /** + * This signal is emitted if a dock area has been dropped into a new + * position + */ + void dockAreaDropped(CDockAreaWidget* DockArea); }; // class DockManager } // namespace ads //-----------------------------------------------------------------------------