From 067338ef23687c0781a4cab9d55a2c4334c09822 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sun, 10 May 2020 19:30:34 +0200 Subject: [PATCH 01/28] Enable styling of focused dockwidget --- src/DockManager.cpp | 74 +++++++++++++++++++++++++++++++++++++ src/DockManager.h | 3 ++ src/DockWidgetTab.cpp | 16 ++++++-- src/DockWidgetTab.h | 7 ++++ src/ads_globals.cpp | 13 +++++++ src/ads_globals.h | 7 ++++ src/stylesheets/default.css | 44 ++++++++++++++++++++-- 7 files changed, 156 insertions(+), 8 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 3cda957..2394d85 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -45,6 +45,8 @@ #include #include #include +#include +#include #include "FloatingDockContainer.h" #include "DockOverlay.h" @@ -53,6 +55,7 @@ #include "DockAreaWidget.h" #include "IconProvider.h" #include "DockingStateReader.h" +#include "DockAreaTitleBar.h" /** @@ -91,6 +94,7 @@ struct DockManagerPrivate CDockManager::eViewMenuInsertionOrder MenuInsertionOrder = CDockManager::MenuAlphabeticallySorted; bool RestoringState = false; QVector UninitializedFloatingWidgets; + QPointer FocusedDockWidget; /** * Private data constructor @@ -437,6 +441,8 @@ CDockManager::CDockManager(QWidget *parent) : d->ContainerOverlay = new CDockOverlay(this, CDockOverlay::ModeContainerOverlay); d->Containers.append(this); d->loadStylesheet(); + connect(QGuiApplication::instance(), SIGNAL(focusObjectChanged(QObject*)), + this, SLOT(onFocusObjectChanged(QObject*))); } //============================================================================ @@ -872,6 +878,74 @@ CIconProvider& CDockManager::iconProvider() } +//=========================================================================== +void CDockManager::onFocusObjectChanged(QObject *focusObject) +{ + auto FocusWidget = qobject_cast(focusObject); + if (!FocusWidget) + { + return; + } + auto DockWidget = internal::findParent(FocusWidget); + if (!DockWidget) + { + return; + } + + if (d->FocusedDockWidget.data() == DockWidget) + { + return; + } + + QList DockWidgets; + CDockAreaWidget* OldFocusedDockArea = nullptr; + CDockAreaWidget* NewFocusedDockArea = nullptr; + if (d->FocusedDockWidget) + { + d->FocusedDockWidget->setProperty("focused", false); + d->FocusedDockWidget->tabWidget()->setProperty("focused", false); + OldFocusedDockArea = d->FocusedDockWidget->dockAreaWidget(); + if (OldFocusedDockArea) + { + OldFocusedDockArea->setProperty("focused", false); + } + DockWidgets.append(d->FocusedDockWidget); + } + d->FocusedDockWidget = DockWidget; + d->FocusedDockWidget->setProperty("focused", true); + d->FocusedDockWidget->tabWidget()->setProperty("focused", true); + NewFocusedDockArea = d->FocusedDockWidget->dockAreaWidget(); + if (NewFocusedDockArea) + { + NewFocusedDockArea->setProperty("focused", true); + } + DockWidgets.append(d->FocusedDockWidget); + + for (auto DockWidget : DockWidgets) + { + DockWidget->tabWidget()->updateStyle(); + internal::repolishStyle(DockWidget); + } + + if (OldFocusedDockArea == NewFocusedDockArea) + { + return; + } + + if (OldFocusedDockArea) + { + internal::repolishStyle(OldFocusedDockArea); + internal::repolishStyle(OldFocusedDockArea->titleBar()); + } + + if (NewFocusedDockArea) + { + internal::repolishStyle(NewFocusedDockArea); + internal::repolishStyle(NewFocusedDockArea->titleBar()); + } +} + + } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockManager.h b/src/DockManager.h index e556046..5de5fd6 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -84,6 +84,9 @@ private: friend struct FloatingDragPreviewPrivate; friend class CDockAreaTitleBar; +private slots: + void onFocusObjectChanged(QObject *focusObject); + protected: /** * Registers the given floating widget in the internal list of diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 2061997..d290104 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -160,6 +160,7 @@ struct DockWidgetTabPrivate GlobalDragStartMousePosition = GlobalPos; DragStartMousePosition = _this->mapFromGlobal(GlobalPos); } + }; // struct DockWidgetTabPrivate @@ -467,10 +468,7 @@ void CDockWidgetTab::setActiveTab(bool active) } d->IsActiveTab = active; - style()->unpolish(this); - style()->polish(this); - d->TitleLabel->style()->unpolish(d->TitleLabel); - d->TitleLabel->style()->polish(d->TitleLabel); + updateStyle(); update(); updateGeometry(); @@ -641,6 +639,16 @@ void CDockWidgetTab::setElideMode(Qt::TextElideMode mode) } +//============================================================================ +void CDockWidgetTab::updateStyle() +{ + this->style()->unpolish(this); + this->style()->polish(this); + d->TitleLabel->style()->unpolish(d->TitleLabel); + d->TitleLabel->style()->polish(d->TitleLabel); +} + + } // namespace ads diff --git a/src/DockWidgetTab.h b/src/DockWidgetTab.h index 3be47a3..70e379a 100644 --- a/src/DockWidgetTab.h +++ b/src/DockWidgetTab.h @@ -39,6 +39,7 @@ namespace ads class CDockWidget; class CDockAreaWidget; struct DockWidgetTabPrivate; +class CDockManager; /** * A dock widget tab that shows a title and an icon. @@ -54,6 +55,7 @@ private: DockWidgetTabPrivate* d; ///< private data (pimpl) friend struct DockWidgetTabPrivate; friend class CDockWidget; + friend class CDockManager; void onDockWidgetFeaturesChanged(); private slots: @@ -70,6 +72,11 @@ protected: */ virtual void mouseDoubleClickEvent(QMouseEvent *event) override; + /** + * Update stylesheet style if a property changes + */ + void updateStyle(); + public: using Super = QFrame; /** diff --git a/src/ads_globals.cpp b/src/ads_globals.cpp index 4310dd2..79ad9e1 100644 --- a/src/ads_globals.cpp +++ b/src/ads_globals.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include "DockSplitter.h" #include "DockManager.h" @@ -118,6 +119,18 @@ void setButtonIcon(QAbstractButton* Button, QStyle::StandardPixmap StandarPixmap #endif } + +//============================================================================ +void repolishStyle(QWidget* w) +{ + if (!w) + { + return; + } + w->style()->unpolish(w); + w->style()->polish(w); +} + } // namespace internal } // namespace ads diff --git a/src/ads_globals.h b/src/ads_globals.h index 201189c..abcc332 100644 --- a/src/ads_globals.h +++ b/src/ads_globals.h @@ -251,6 +251,13 @@ void setToolTip(QObjectPtr obj, const QString &tip) void setButtonIcon(QAbstractButton* Button, QStyle::StandardPixmap StandarPixmap, ads::eIcon CustomIconId); + +/** + * Calls unpolish() / polish for the style of the given widget to update + * stylesheet if a property changes + */ +void repolishStyle(QWidget* w); + } // namespace internal } // namespace ads diff --git a/src/stylesheets/default.css b/src/stylesheets/default.css index 5f7185d..5ace174 100644 --- a/src/stylesheets/default.css +++ b/src/stylesheets/default.css @@ -9,10 +9,6 @@ ads--CDockContainerWidget background: palette(dark); } -ads--CDockContainerWidget QSplitter::handle -{ - background: palette(dark); -} ads--CDockAreaWidget { @@ -92,3 +88,43 @@ QScrollArea#dockWidgetScrollArea } +ads--CDockSplitter::handle +{ + background-color: palette(dark); + /* uncomment the following line if you would like to change the size of + the splitter handles */ + /* height: 1px; */ +} + + + +ads--CDockWidgetTab[focused="true"] +{ + background: palette(highlight); + border-color: palette(highlight); +} + +ads--CDockWidgetTab[focused="true"] QLabel +{ + color: palette(light); +} + + +ads--CDockAreaTitleBar +{ + background: transparent; + border-bottom: 2px solid palette(light); + padding-bottom: 0px; +} + +ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar +{ + background: transparent; + border-bottom: 2px solid palette(highlight); + padding-bottom: 0px; +} + + + + + From f54869fbf7810092dd79f5fee8bd7573badaac91 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Mon, 11 May 2020 16:29:58 +0200 Subject: [PATCH 02/28] Improved setting of CDockWidgetTab focus --- src/DockManager.cpp | 19 +++++++++++++++++-- src/DockWidgetTab.cpp | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 2394d85..37a2cdc 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -879,14 +879,29 @@ CIconProvider& CDockManager::iconProvider() //=========================================================================== -void CDockManager::onFocusObjectChanged(QObject *focusObject) +void CDockManager::onFocusObjectChanged(QObject *focusObject) { auto FocusWidget = qobject_cast(focusObject); if (!FocusWidget) { return; } - auto DockWidget = internal::findParent(FocusWidget); + + CDockWidget* DockWidget = nullptr; + + std::cout << "CDockManager::onFocusObjectChanged " << focusObject->objectName().toStdString() + << " meta: " << focusObject->metaObject()->className() << std::endl; + + auto DockWidgetTab = qobject_cast(focusObject); + if (DockWidgetTab) + { + DockWidget = DockWidgetTab->dockWidget(); + } + else + { + DockWidget = internal::findParent(FocusWidget); + } + if (!DockWidget) { return; diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index d290104..7597d05 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -285,6 +285,7 @@ CDockWidgetTab::CDockWidgetTab(CDockWidget* DockWidget, QWidget *parent) : setAttribute(Qt::WA_NoMousePropagation, true); d->DockWidget = DockWidget; d->createLayout(); + setFocusPolicy(Qt::ClickFocus); } //============================================================================ From 056e1ef9474fcd47d766af87d0e4c645a2ca5e98 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Wed, 13 May 2020 11:17:43 +0200 Subject: [PATCH 03/28] Improved highlighting focused dock widget --- src/DockManager.cpp | 57 +++++++++++++++++++++++++------------------ src/DockManager.h | 1 + src/DockWidgetTab.cpp | 5 ++++ 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 37a2cdc..29e6237 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -94,7 +94,8 @@ struct DockManagerPrivate CDockManager::eViewMenuInsertionOrder MenuInsertionOrder = CDockManager::MenuAlphabeticallySorted; bool RestoringState = false; QVector UninitializedFloatingWidgets; - QPointer FocusedDockWidget; + QPointer FocusedDockWidget = nullptr; + QPointer FocusedArea = nullptr; /** * Private data constructor @@ -881,6 +882,12 @@ CIconProvider& CDockManager::iconProvider() //=========================================================================== void CDockManager::onFocusObjectChanged(QObject *focusObject) { + if (!focusObject) + { + return; + } + std::cout << "\n\nCDockManager::onFocusObjectChanged " << focusObject->metaObject()->className() << std::endl; + auto FocusWidget = qobject_cast(focusObject); if (!FocusWidget) { @@ -889,46 +896,39 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) CDockWidget* DockWidget = nullptr; - std::cout << "CDockManager::onFocusObjectChanged " << focusObject->objectName().toStdString() - << " meta: " << focusObject->metaObject()->className() << std::endl; - auto DockWidgetTab = qobject_cast(focusObject); if (DockWidgetTab) { DockWidget = DockWidgetTab->dockWidget(); + std::cout << "TabText: " << DockWidgetTab->text().toStdString() << std::endl; } else { DockWidget = internal::findParent(FocusWidget); } + std::cout << "Focus Object " << focusObject->objectName().toStdString() + << " meta: " << focusObject->metaObject()->className() << std::endl; if (!DockWidget) { - return; - } - - if (d->FocusedDockWidget.data() == DockWidget) - { + std::cout << "!DockWidget" << std::endl; return; } QList DockWidgets; - CDockAreaWidget* OldFocusedDockArea = nullptr; CDockAreaWidget* NewFocusedDockArea = nullptr; if (d->FocusedDockWidget) { + std::cout << "focuse = false: " << d->FocusedDockWidget->objectName().toStdString() << std::endl; d->FocusedDockWidget->setProperty("focused", false); d->FocusedDockWidget->tabWidget()->setProperty("focused", false); - OldFocusedDockArea = d->FocusedDockWidget->dockAreaWidget(); - if (OldFocusedDockArea) - { - OldFocusedDockArea->setProperty("focused", false); - } DockWidgets.append(d->FocusedDockWidget); } d->FocusedDockWidget = DockWidget; + std::cout << "d->FocusedDockWidget " << d->FocusedDockWidget->objectName().toStdString() << std::endl; d->FocusedDockWidget->setProperty("focused", true); d->FocusedDockWidget->tabWidget()->setProperty("focused", true); + connect(d->FocusedDockWidget, SIGNAL(closed()), this, SLOT(onFocusedDockWidgetClosed())); NewFocusedDockArea = d->FocusedDockWidget->dockAreaWidget(); if (NewFocusedDockArea) { @@ -942,22 +942,31 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) internal::repolishStyle(DockWidget); } - if (OldFocusedDockArea == NewFocusedDockArea) + if (!NewFocusedDockArea || (d->FocusedArea == NewFocusedDockArea)) { + std::cout << "d->FocusedArea == NewFocusedDockArea" << std::endl; return; } - if (OldFocusedDockArea) + if (d->FocusedArea) { - internal::repolishStyle(OldFocusedDockArea); - internal::repolishStyle(OldFocusedDockArea->titleBar()); + std::cout << "Repolish OldFocusedDockArea" << std::endl; + d->FocusedArea->setProperty("focused", false); + internal::repolishStyle(d->FocusedArea); + internal::repolishStyle(d->FocusedArea->titleBar()); } - if (NewFocusedDockArea) - { - internal::repolishStyle(NewFocusedDockArea); - internal::repolishStyle(NewFocusedDockArea->titleBar()); - } + std::cout << "Repolish NewFocusedDockArea" << std::endl; + NewFocusedDockArea->setProperty("focused", true); + internal::repolishStyle(NewFocusedDockArea); + internal::repolishStyle(NewFocusedDockArea->titleBar()); + d->FocusedArea = NewFocusedDockArea; +} + +//=========================================================================== +void CDockManager::onFocusedDockWidgetClosed() +{ + std::cout << "CDockManager::onFocusedDockWidgetClosed()" << std::endl; } diff --git a/src/DockManager.h b/src/DockManager.h index 5de5fd6..14932a7 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -86,6 +86,7 @@ private: private slots: void onFocusObjectChanged(QObject *focusObject); + void onFocusedDockWidgetClosed(); protected: /** diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 7597d05..167b2d7 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -468,6 +468,11 @@ void CDockWidgetTab::setActiveTab(bool active) return; } + if (active && !hasFocus()) + { + std::cout << "setFocus(Qt::OtherFocusReason);" << std::endl; + setFocus(Qt::OtherFocusReason); + } d->IsActiveTab = active; updateStyle(); update(); From 64a2024513762a4b0e7318c0d53efef685f74e9f Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Wed, 13 May 2020 11:20:32 +0200 Subject: [PATCH 04/28] Removed debug output --- src/DockManager.cpp | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 29e6237..a172364 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -886,7 +886,6 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) { return; } - std::cout << "\n\nCDockManager::onFocusObjectChanged " << focusObject->metaObject()->className() << std::endl; auto FocusWidget = qobject_cast(focusObject); if (!FocusWidget) @@ -900,18 +899,14 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) if (DockWidgetTab) { DockWidget = DockWidgetTab->dockWidget(); - std::cout << "TabText: " << DockWidgetTab->text().toStdString() << std::endl; } else { DockWidget = internal::findParent(FocusWidget); } - std::cout << "Focus Object " << focusObject->objectName().toStdString() - << " meta: " << focusObject->metaObject()->className() << std::endl; if (!DockWidget) { - std::cout << "!DockWidget" << std::endl; return; } @@ -919,16 +914,15 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) CDockAreaWidget* NewFocusedDockArea = nullptr; if (d->FocusedDockWidget) { - std::cout << "focuse = false: " << d->FocusedDockWidget->objectName().toStdString() << std::endl; + d->FocusedDockWidget->setProperty("focused", false); d->FocusedDockWidget->tabWidget()->setProperty("focused", false); DockWidgets.append(d->FocusedDockWidget); } d->FocusedDockWidget = DockWidget; - std::cout << "d->FocusedDockWidget " << d->FocusedDockWidget->objectName().toStdString() << std::endl; d->FocusedDockWidget->setProperty("focused", true); d->FocusedDockWidget->tabWidget()->setProperty("focused", true); - connect(d->FocusedDockWidget, SIGNAL(closed()), this, SLOT(onFocusedDockWidgetClosed())); + //connect(d->FocusedDockWidget, SIGNAL(closed()), this, SLOT(onFocusedDockWidgetClosed())); NewFocusedDockArea = d->FocusedDockWidget->dockAreaWidget(); if (NewFocusedDockArea) { @@ -944,19 +938,16 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) if (!NewFocusedDockArea || (d->FocusedArea == NewFocusedDockArea)) { - std::cout << "d->FocusedArea == NewFocusedDockArea" << std::endl; return; } if (d->FocusedArea) { - std::cout << "Repolish OldFocusedDockArea" << std::endl; d->FocusedArea->setProperty("focused", false); internal::repolishStyle(d->FocusedArea); internal::repolishStyle(d->FocusedArea->titleBar()); } - std::cout << "Repolish NewFocusedDockArea" << std::endl; NewFocusedDockArea->setProperty("focused", true); internal::repolishStyle(NewFocusedDockArea); internal::repolishStyle(NewFocusedDockArea->titleBar()); From 4c75168152b844648690bdf09eb4334a1c0faed3 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Wed, 13 May 2020 13:18:05 +0200 Subject: [PATCH 05/28] Improved focus setting when closing a dock area widget --- src/DockContainerWidget.h | 2 +- src/DockManager.cpp | 22 ++++++++++++++++++++++ src/DockManager.h | 1 + 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/DockContainerWidget.h b/src/DockContainerWidget.h index b23e017..c9a764f 100644 --- a/src/DockContainerWidget.h +++ b/src/DockContainerWidget.h @@ -193,7 +193,7 @@ public: bool isInFrontOf(CDockContainerWidget* Other) const; /** - * Returns the dock area at teh given global position or 0 if there is no + * Returns the dock area at the given global position or 0 if there is no * dock area at this position */ CDockAreaWidget* dockAreaAt(const QPoint& GlobalPos) const; diff --git a/src/DockManager.cpp b/src/DockManager.cpp index a172364..711e58a 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -943,6 +943,7 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) if (d->FocusedArea) { + disconnect(d->FocusedArea, SIGNAL(viewToggled(bool)), this, SLOT(onFocusedDockAreaViewToggled(bool))); d->FocusedArea->setProperty("focused", false); internal::repolishStyle(d->FocusedArea); internal::repolishStyle(d->FocusedArea->titleBar()); @@ -952,8 +953,10 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) internal::repolishStyle(NewFocusedDockArea); internal::repolishStyle(NewFocusedDockArea->titleBar()); d->FocusedArea = NewFocusedDockArea; + connect(d->FocusedArea, SIGNAL(viewToggled(bool)), this, SLOT(onFocusedDockAreaViewToggled(bool))); } + //=========================================================================== void CDockManager::onFocusedDockWidgetClosed() { @@ -961,6 +964,25 @@ void CDockManager::onFocusedDockWidgetClosed() } +//=========================================================================== +void CDockManager::onFocusedDockAreaViewToggled(bool Open) +{ + CDockAreaWidget* DockArea = qobject_cast(sender()); + if (!DockArea || Open) + { + return; + } + auto Container = DockArea->dockContainer(); + auto OpenedDockAreas = Container->openedDockAreas(); + if (OpenedDockAreas.isEmpty()) + { + return; + } + + OpenedDockAreas[0]->currentDockWidget()->tabWidget()->setFocus(Qt::OtherFocusReason); +} + + } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockManager.h b/src/DockManager.h index 14932a7..8999277 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -87,6 +87,7 @@ private: private slots: void onFocusObjectChanged(QObject *focusObject); void onFocusedDockWidgetClosed(); + void onFocusedDockAreaViewToggled(bool Open); protected: /** From 3a0c2a3113947dfc5e909e6f5b14c80205e6727c Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Wed, 13 May 2020 22:51:44 +0200 Subject: [PATCH 06/28] Some refactorings in onFocusChanged() to improve code readibility --- src/DockManager.cpp | 74 ++++++++++++++++++--------------------------- src/DockManager.h | 3 +- src/DockWidgetTab.h | 9 +++--- 3 files changed, 34 insertions(+), 52 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 711e58a..f3168f1 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -442,8 +442,8 @@ CDockManager::CDockManager(QWidget *parent) : d->ContainerOverlay = new CDockOverlay(this, CDockOverlay::ModeContainerOverlay); d->Containers.append(this); d->loadStylesheet(); - connect(QGuiApplication::instance(), SIGNAL(focusObjectChanged(QObject*)), - this, SLOT(onFocusObjectChanged(QObject*))); + connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), + this, SLOT(onFocusChanged(QWidget*, QWidget*))); } //============================================================================ @@ -880,29 +880,42 @@ CIconProvider& CDockManager::iconProvider() //=========================================================================== -void CDockManager::onFocusObjectChanged(QObject *focusObject) +void updateDockWidgetFocusStyle(CDockWidget* DockWidget, bool Focused) { - if (!focusObject) - { - return; - } + DockWidget->setProperty("focused", Focused); + DockWidget->tabWidget()->setProperty("focused", Focused); + DockWidget->tabWidget()->updateStyle(); + internal::repolishStyle(DockWidget); +} - auto FocusWidget = qobject_cast(focusObject); - if (!FocusWidget) + +//=========================================================================== +void updateDockAreaFocusStyle(CDockAreaWidget* DockArea, bool Focused) +{ + DockArea->setProperty("focused", Focused); + internal::repolishStyle(DockArea); + internal::repolishStyle(DockArea->titleBar()); +} + + +//=========================================================================== +void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) +{ + Q_UNUSED(focusedOld) + if (!focusedNow) { return; } CDockWidget* DockWidget = nullptr; - - auto DockWidgetTab = qobject_cast(focusObject); + auto DockWidgetTab = qobject_cast(focusedNow); if (DockWidgetTab) { DockWidget = DockWidgetTab->dockWidget(); } else { - DockWidget = internal::findParent(FocusWidget); + DockWidget = internal::findParent(focusedNow); } if (!DockWidget) @@ -910,32 +923,14 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) return; } - QList DockWidgets; CDockAreaWidget* NewFocusedDockArea = nullptr; if (d->FocusedDockWidget) { - - d->FocusedDockWidget->setProperty("focused", false); - d->FocusedDockWidget->tabWidget()->setProperty("focused", false); - DockWidgets.append(d->FocusedDockWidget); + updateDockWidgetFocusStyle(d->FocusedDockWidget, false); } d->FocusedDockWidget = DockWidget; - d->FocusedDockWidget->setProperty("focused", true); - d->FocusedDockWidget->tabWidget()->setProperty("focused", true); - //connect(d->FocusedDockWidget, SIGNAL(closed()), this, SLOT(onFocusedDockWidgetClosed())); + updateDockWidgetFocusStyle(d->FocusedDockWidget, true); NewFocusedDockArea = d->FocusedDockWidget->dockAreaWidget(); - if (NewFocusedDockArea) - { - NewFocusedDockArea->setProperty("focused", true); - } - DockWidgets.append(d->FocusedDockWidget); - - for (auto DockWidget : DockWidgets) - { - DockWidget->tabWidget()->updateStyle(); - internal::repolishStyle(DockWidget); - } - if (!NewFocusedDockArea || (d->FocusedArea == NewFocusedDockArea)) { return; @@ -944,26 +939,15 @@ void CDockManager::onFocusObjectChanged(QObject *focusObject) if (d->FocusedArea) { disconnect(d->FocusedArea, SIGNAL(viewToggled(bool)), this, SLOT(onFocusedDockAreaViewToggled(bool))); - d->FocusedArea->setProperty("focused", false); - internal::repolishStyle(d->FocusedArea); - internal::repolishStyle(d->FocusedArea->titleBar()); + updateDockAreaFocusStyle(d->FocusedArea, false); } - NewFocusedDockArea->setProperty("focused", true); - internal::repolishStyle(NewFocusedDockArea); - internal::repolishStyle(NewFocusedDockArea->titleBar()); d->FocusedArea = NewFocusedDockArea; + updateDockAreaFocusStyle(d->FocusedArea, true); connect(d->FocusedArea, SIGNAL(viewToggled(bool)), this, SLOT(onFocusedDockAreaViewToggled(bool))); } -//=========================================================================== -void CDockManager::onFocusedDockWidgetClosed() -{ - std::cout << "CDockManager::onFocusedDockWidgetClosed()" << std::endl; -} - - //=========================================================================== void CDockManager::onFocusedDockAreaViewToggled(bool Open) { diff --git a/src/DockManager.h b/src/DockManager.h index 8999277..ec9bc74 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -85,8 +85,7 @@ private: friend class CDockAreaTitleBar; private slots: - void onFocusObjectChanged(QObject *focusObject); - void onFocusedDockWidgetClosed(); + void onFocusChanged(QWidget *old, QWidget *now); void onFocusedDockAreaViewToggled(bool Open); protected: diff --git a/src/DockWidgetTab.h b/src/DockWidgetTab.h index 70e379a..3ed7df8 100644 --- a/src/DockWidgetTab.h +++ b/src/DockWidgetTab.h @@ -72,11 +72,6 @@ protected: */ virtual void mouseDoubleClickEvent(QMouseEvent *event) override; - /** - * Update stylesheet style if a property changes - */ - void updateStyle(); - public: using Super = QFrame; /** @@ -159,6 +154,10 @@ public: */ void setElideMode(Qt::TextElideMode mode); + /** + * Update stylesheet style if a property changes + */ + void updateStyle(); public slots: virtual void setVisible(bool visible) override; From e760d3e96752a6609f49272d3056073020294af7 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Thu, 14 May 2020 09:06:04 +0200 Subject: [PATCH 07/28] Improved focus handling when dropping a dock widget --- src/DockAreaWidget.cpp | 2 +- src/DockWidgetTab.cpp | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/DockAreaWidget.cpp b/src/DockAreaWidget.cpp index a6e6f1f..33aecbc 100644 --- a/src/DockAreaWidget.cpp +++ b/src/DockAreaWidget.cpp @@ -413,6 +413,7 @@ void CDockAreaWidget::insertDockWidget(int index, CDockWidget* DockWidget, bool Activate) { d->ContentsLayout->insertWidget(index, DockWidget); + DockWidget->setDockArea(this); DockWidget->tabWidget()->setDockAreaWidget(this); auto TabWidget = DockWidget->tabWidget(); // Inserting the tab will change the current index which in turn will @@ -428,7 +429,6 @@ void CDockAreaWidget::insertDockWidget(int index, CDockWidget* DockWidget, { setCurrentIndex(index); } - DockWidget->setDockArea(this); d->updateTitleBarButtonStates(); } diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 167b2d7..c907ee0 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -463,15 +463,21 @@ void CDockWidgetTab::setActiveTab(bool active) bool AllTabsHaveCloseButton = d->testConfigFlag(CDockManager::AllTabsHaveCloseButton); bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton; d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton); - if (d->IsActiveTab == active) - { - return; - } + bool UpdateFocusStyle = false; if (active && !hasFocus()) { - std::cout << "setFocus(Qt::OtherFocusReason);" << std::endl; setFocus(Qt::OtherFocusReason); + UpdateFocusStyle = true; + } + + if (d->IsActiveTab == active) + { + if (UpdateFocusStyle) + { + updateStyle(); + } + return; } d->IsActiveTab = active; updateStyle(); From 79cb889d8389ac4cb60be8f04e8014001219d9a0 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sun, 17 May 2020 08:51:58 +0200 Subject: [PATCH 08/28] Improved focus style handling --- src/DockContainerWidget.cpp | 14 +++++ src/DockManager.cpp | 122 +++++++++++++++++++++++------------- src/DockManager.h | 18 ++++++ 3 files changed, 112 insertions(+), 42 deletions(-) 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 //----------------------------------------------------------------------------- From 819f1effc5a61047d330c8029990c83efe207a84 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Tue, 19 May 2020 22:53:52 +0200 Subject: [PATCH 09/28] Added support for focus styling of CFloatingWidgetTitleBra --- src/DockManager.cpp | 38 +++++++++++++++++++++++++++- src/FloatingDockContainer.h | 3 +-- src/linux/FloatingWidgetTitleBar.cpp | 12 ++++++++- src/linux/FloatingWidgetTitleBar.h | 9 +++++-- src/stylesheets/default.css | 7 +---- src/stylesheets/default_linux.css | 37 +++++++++++++++++++++++++++ 6 files changed, 94 insertions(+), 12 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 557bb5f..b5d4677 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -57,6 +57,10 @@ #include "DockingStateReader.h" #include "DockAreaTitleBar.h" +#ifdef Q_OS_LINUX +#include "linux/FloatingWidgetTitleBar.h" +#endif + /** * Initializes the resources specified by the .qrc file with the specified base @@ -96,6 +100,7 @@ struct DockManagerPrivate QVector UninitializedFloatingWidgets; QPointer FocusedDockWidget = nullptr; QPointer FocusedArea = nullptr; + QPointer FloatingWidget = nullptr; /** * Private data constructor @@ -450,6 +455,19 @@ void updateDockAreaFocusStyle(CDockAreaWidget* DockArea, bool Focused) } +//=========================================================================== +void updateFloatingWidgetFocusStyle(CFloatingDockContainer* FloatingWidget, bool Focused) +{ + auto TitleBar = qobject_cast(FloatingWidget->titleBarWidget()); + if (!TitleBar) + { + return; + } + TitleBar->setProperty("focused", Focused); + TitleBar->updateStyle(); +} + + //============================================================================ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) { @@ -476,6 +494,24 @@ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) FocusedArea = NewFocusedDockArea; updateDockAreaFocusStyle(FocusedArea, true); QObject::connect(FocusedArea, SIGNAL(viewToggled(bool)), _this, SLOT(onFocusedDockAreaViewToggled(bool))); + + // Linux specific focus stuff + auto NewFloatingWidget = FocusedDockWidget->dockContainer()->floatingWidget(); + if (FloatingWidget == NewFloatingWidget) + { + return; + } + + if (FloatingWidget) + { + updateFloatingWidgetFocusStyle(FloatingWidget, false); + } + FloatingWidget = NewFloatingWidget; + + if (FloatingWidget) + { + updateFloatingWidgetFocusStyle(FloatingWidget, true); + } } @@ -954,7 +990,7 @@ void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) DockWidget = internal::findParent(focusedNow); } - if (!DockWidget || !DockWidget->tabWidget()->isVisible()) + if (!DockWidget /*|| !DockWidget->tabWidget()->isVisible()*/) { return; } diff --git a/src/FloatingDockContainer.h b/src/FloatingDockContainer.h index 7defca3..fc92f7d 100644 --- a/src/FloatingDockContainer.h +++ b/src/FloatingDockContainer.h @@ -172,8 +172,7 @@ protected: /** * Call this function to update the window title */ - void updateWindowTitle(); - + void updateWindowTitle(); protected: // reimplements QWidget virtual void changeEvent(QEvent *event) override; diff --git a/src/linux/FloatingWidgetTitleBar.cpp b/src/linux/FloatingWidgetTitleBar.cpp index babcaaa..7b81cac 100644 --- a/src/linux/FloatingWidgetTitleBar.cpp +++ b/src/linux/FloatingWidgetTitleBar.cpp @@ -115,7 +115,7 @@ void FloatingWidgetTitleBarPrivate::createLayout() //============================================================================ CFloatingWidgetTitleBar::CFloatingWidgetTitleBar(CFloatingDockContainer *parent) : - QWidget(parent), + QFrame(parent), d(new FloatingWidgetTitleBarPrivate(this)) { d->FloatingWidget = parent; @@ -172,16 +172,26 @@ void CFloatingWidgetTitleBar::mouseMoveEvent(QMouseEvent *ev) Super::mouseMoveEvent(ev); } + //============================================================================ void CFloatingWidgetTitleBar::enableCloseButton(bool Enable) { d->CloseButton->setEnabled(Enable); } + //============================================================================ void CFloatingWidgetTitleBar::setTitle(const QString &Text) { d->TitleLabel->setText(Text); } + +//============================================================================ +void CFloatingWidgetTitleBar::updateStyle() +{ + internal::repolishStyle(this); + internal::repolishStyle(d->TitleLabel); +} + } // namespace ads diff --git a/src/linux/FloatingWidgetTitleBar.h b/src/linux/FloatingWidgetTitleBar.h index d09ed38..13914db 100644 --- a/src/linux/FloatingWidgetTitleBar.h +++ b/src/linux/FloatingWidgetTitleBar.h @@ -29,7 +29,7 @@ //============================================================================ // INCLUDES //============================================================================ -#include +#include namespace ads { @@ -45,7 +45,7 @@ struct FloatingWidgetTitleBarPrivate; * for the docking system to work properly, we use our own titlebar here to * capture the required mouse events. */ -class CFloatingWidgetTitleBar : public QWidget +class CFloatingWidgetTitleBar : public QFrame { Q_OBJECT private: @@ -75,6 +75,11 @@ public: */ void setTitle(const QString &Text); + /** + * Update stylesheet style if a property changes + */ + void updateStyle(); + signals: /** * This signal is emitted, if the close button is clicked. diff --git a/src/stylesheets/default.css b/src/stylesheets/default.css index 5ace174..0909d1d 100644 --- a/src/stylesheets/default.css +++ b/src/stylesheets/default.css @@ -97,7 +97,7 @@ ads--CDockSplitter::handle } - +/* Focus related styling */ ads--CDockWidgetTab[focused="true"] { background: palette(highlight); @@ -123,8 +123,3 @@ ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar border-bottom: 2px solid palette(highlight); padding-bottom: 0px; } - - - - - diff --git a/src/stylesheets/default_linux.css b/src/stylesheets/default_linux.css index 7a184be..7e8abd7 100644 --- a/src/stylesheets/default_linux.css +++ b/src/stylesheets/default_linux.css @@ -93,4 +93,41 @@ QScrollArea#dockWidgetScrollArea background: rgba(0, 0, 0, 32); } +/* Focus related styling */ +ads--CDockWidgetTab[focused="true"] +{ + background: palette(highlight); + border-color: palette(highlight); +} +ads--CDockWidgetTab[focused="true"] QLabel +{ + color: palette(light); +} + + +ads--CDockAreaTitleBar +{ + background: transparent; + border-bottom: 2px solid palette(light); + padding-bottom: 0px; +} + +ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar +{ + background: transparent; + border-bottom: 2px solid palette(highlight); + padding-bottom: 0px; +} + + +ads--CFloatingDockContainer[isActiveWindow="true"] ads--CFloatingWidgetTitleBar +{ + background: palette(highlight); +} + + +ads--CFloatingDockContainer[isActiveWindow="true"] ads--CFloatingWidgetTitleBar > QLabel +{ + color: palette(light); +} From 4da810ba7c0b6ce055a8320575fc9218ace7abde Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Wed, 20 May 2020 14:20:27 +0200 Subject: [PATCH 10/28] Added window()->activateWindow() dropFloatingWidget() function --- src/DockContainerWidget.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index 14a3cb4..d10ce15 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -1459,6 +1459,8 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi // level widget anymore CDockWidget::emitTopLevelEventForWidget(SingleDockWidget, false); } + + window()->activateWindow(); } @@ -1490,7 +1492,7 @@ void CDockContainerWidget::dropWidget(QWidget* Widget, DockWidgetArea DropArea, } } - this->window()->activateWindow(); + window()->activateWindow(); d->DockManager->emitWidgetDroppedSignals(Widget); } From 3b2f940efadda3f23940aa1c8853f9e201455cc1 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Thu, 21 May 2020 10:32:31 +0200 Subject: [PATCH 11/28] Fixed windows build --- src/DockManager.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index b5d4677..5fe0df7 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -458,6 +458,7 @@ void updateDockAreaFocusStyle(CDockAreaWidget* DockArea, bool Focused) //=========================================================================== void updateFloatingWidgetFocusStyle(CFloatingDockContainer* FloatingWidget, bool Focused) { +#ifdef Q_OS_LINUX auto TitleBar = qobject_cast(FloatingWidget->titleBarWidget()); if (!TitleBar) { @@ -465,6 +466,10 @@ void updateFloatingWidgetFocusStyle(CFloatingDockContainer* FloatingWidget, bool } TitleBar->setProperty("focused", Focused); TitleBar->updateStyle(); +#else + Q_UNUSED(FloatingWidget) + Q_UNUSED(Focused) +#endif } @@ -495,7 +500,9 @@ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) updateDockAreaFocusStyle(FocusedArea, true); QObject::connect(FocusedArea, SIGNAL(viewToggled(bool)), _this, SLOT(onFocusedDockAreaViewToggled(bool))); - // Linux specific focus stuff +#ifdef Q_OS_LINUX + // This code is required for styling the floating widget titlebar for linux + // depending on the current focus state auto NewFloatingWidget = FocusedDockWidget->dockContainer()->floatingWidget(); if (FloatingWidget == NewFloatingWidget) { @@ -512,6 +519,7 @@ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) { updateFloatingWidgetFocusStyle(FloatingWidget, true); } +#endif } @@ -990,10 +998,17 @@ void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) DockWidget = internal::findParent(focusedNow); } - if (!DockWidget /*|| !DockWidget->tabWidget()->isVisible()*/) +#ifdef Q_OS_LINUX + if (!DockWidget) { return; } +#else + if (!DockWidget || !DockWidget->tabWidget()->isVisible()) + { + return; + } +#endif std::cout << "CDockManager::onFocusChanged " << DockWidget->tabWidget()->text().toStdString() << std::endl; d->updateDockWidgetFocus(DockWidget); From 25eb02d07cb3d4e30a935d04e30d21a656761423 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Tue, 19 May 2020 22:53:52 +0200 Subject: [PATCH 12/28] Added support for focus styling of CFloatingWidgetTitleBra --- src/DockManager.cpp | 38 +++++++++++++++++++++++++++- src/FloatingDockContainer.h | 3 +-- src/linux/FloatingWidgetTitleBar.cpp | 12 ++++++++- src/linux/FloatingWidgetTitleBar.h | 9 +++++-- src/stylesheets/default.css | 7 +---- src/stylesheets/default_linux.css | 37 +++++++++++++++++++++++++++ 6 files changed, 94 insertions(+), 12 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 557bb5f..b5d4677 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -57,6 +57,10 @@ #include "DockingStateReader.h" #include "DockAreaTitleBar.h" +#ifdef Q_OS_LINUX +#include "linux/FloatingWidgetTitleBar.h" +#endif + /** * Initializes the resources specified by the .qrc file with the specified base @@ -96,6 +100,7 @@ struct DockManagerPrivate QVector UninitializedFloatingWidgets; QPointer FocusedDockWidget = nullptr; QPointer FocusedArea = nullptr; + QPointer FloatingWidget = nullptr; /** * Private data constructor @@ -450,6 +455,19 @@ void updateDockAreaFocusStyle(CDockAreaWidget* DockArea, bool Focused) } +//=========================================================================== +void updateFloatingWidgetFocusStyle(CFloatingDockContainer* FloatingWidget, bool Focused) +{ + auto TitleBar = qobject_cast(FloatingWidget->titleBarWidget()); + if (!TitleBar) + { + return; + } + TitleBar->setProperty("focused", Focused); + TitleBar->updateStyle(); +} + + //============================================================================ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) { @@ -476,6 +494,24 @@ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) FocusedArea = NewFocusedDockArea; updateDockAreaFocusStyle(FocusedArea, true); QObject::connect(FocusedArea, SIGNAL(viewToggled(bool)), _this, SLOT(onFocusedDockAreaViewToggled(bool))); + + // Linux specific focus stuff + auto NewFloatingWidget = FocusedDockWidget->dockContainer()->floatingWidget(); + if (FloatingWidget == NewFloatingWidget) + { + return; + } + + if (FloatingWidget) + { + updateFloatingWidgetFocusStyle(FloatingWidget, false); + } + FloatingWidget = NewFloatingWidget; + + if (FloatingWidget) + { + updateFloatingWidgetFocusStyle(FloatingWidget, true); + } } @@ -954,7 +990,7 @@ void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) DockWidget = internal::findParent(focusedNow); } - if (!DockWidget || !DockWidget->tabWidget()->isVisible()) + if (!DockWidget /*|| !DockWidget->tabWidget()->isVisible()*/) { return; } diff --git a/src/FloatingDockContainer.h b/src/FloatingDockContainer.h index 7defca3..fc92f7d 100644 --- a/src/FloatingDockContainer.h +++ b/src/FloatingDockContainer.h @@ -172,8 +172,7 @@ protected: /** * Call this function to update the window title */ - void updateWindowTitle(); - + void updateWindowTitle(); protected: // reimplements QWidget virtual void changeEvent(QEvent *event) override; diff --git a/src/linux/FloatingWidgetTitleBar.cpp b/src/linux/FloatingWidgetTitleBar.cpp index babcaaa..7b81cac 100644 --- a/src/linux/FloatingWidgetTitleBar.cpp +++ b/src/linux/FloatingWidgetTitleBar.cpp @@ -115,7 +115,7 @@ void FloatingWidgetTitleBarPrivate::createLayout() //============================================================================ CFloatingWidgetTitleBar::CFloatingWidgetTitleBar(CFloatingDockContainer *parent) : - QWidget(parent), + QFrame(parent), d(new FloatingWidgetTitleBarPrivate(this)) { d->FloatingWidget = parent; @@ -172,16 +172,26 @@ void CFloatingWidgetTitleBar::mouseMoveEvent(QMouseEvent *ev) Super::mouseMoveEvent(ev); } + //============================================================================ void CFloatingWidgetTitleBar::enableCloseButton(bool Enable) { d->CloseButton->setEnabled(Enable); } + //============================================================================ void CFloatingWidgetTitleBar::setTitle(const QString &Text) { d->TitleLabel->setText(Text); } + +//============================================================================ +void CFloatingWidgetTitleBar::updateStyle() +{ + internal::repolishStyle(this); + internal::repolishStyle(d->TitleLabel); +} + } // namespace ads diff --git a/src/linux/FloatingWidgetTitleBar.h b/src/linux/FloatingWidgetTitleBar.h index d09ed38..13914db 100644 --- a/src/linux/FloatingWidgetTitleBar.h +++ b/src/linux/FloatingWidgetTitleBar.h @@ -29,7 +29,7 @@ //============================================================================ // INCLUDES //============================================================================ -#include +#include namespace ads { @@ -45,7 +45,7 @@ struct FloatingWidgetTitleBarPrivate; * for the docking system to work properly, we use our own titlebar here to * capture the required mouse events. */ -class CFloatingWidgetTitleBar : public QWidget +class CFloatingWidgetTitleBar : public QFrame { Q_OBJECT private: @@ -75,6 +75,11 @@ public: */ void setTitle(const QString &Text); + /** + * Update stylesheet style if a property changes + */ + void updateStyle(); + signals: /** * This signal is emitted, if the close button is clicked. diff --git a/src/stylesheets/default.css b/src/stylesheets/default.css index 5ace174..0909d1d 100644 --- a/src/stylesheets/default.css +++ b/src/stylesheets/default.css @@ -97,7 +97,7 @@ ads--CDockSplitter::handle } - +/* Focus related styling */ ads--CDockWidgetTab[focused="true"] { background: palette(highlight); @@ -123,8 +123,3 @@ ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar border-bottom: 2px solid palette(highlight); padding-bottom: 0px; } - - - - - diff --git a/src/stylesheets/default_linux.css b/src/stylesheets/default_linux.css index 7a184be..7e8abd7 100644 --- a/src/stylesheets/default_linux.css +++ b/src/stylesheets/default_linux.css @@ -93,4 +93,41 @@ QScrollArea#dockWidgetScrollArea background: rgba(0, 0, 0, 32); } +/* Focus related styling */ +ads--CDockWidgetTab[focused="true"] +{ + background: palette(highlight); + border-color: palette(highlight); +} +ads--CDockWidgetTab[focused="true"] QLabel +{ + color: palette(light); +} + + +ads--CDockAreaTitleBar +{ + background: transparent; + border-bottom: 2px solid palette(light); + padding-bottom: 0px; +} + +ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar +{ + background: transparent; + border-bottom: 2px solid palette(highlight); + padding-bottom: 0px; +} + + +ads--CFloatingDockContainer[isActiveWindow="true"] ads--CFloatingWidgetTitleBar +{ + background: palette(highlight); +} + + +ads--CFloatingDockContainer[isActiveWindow="true"] ads--CFloatingWidgetTitleBar > QLabel +{ + color: palette(light); +} From 5652c8440ec61b7932f4f8e158d752aa657b5e3d Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sat, 23 May 2020 11:10:03 +0200 Subject: [PATCH 13/28] Added new CDockManger config flag FocusStyling --- src/DockManager.cpp | 14 +++++++++----- src/DockManager.h | 17 ++++++++++++++++- src/ads_globals.h | 1 + 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 5fe0df7..8e56373 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -540,8 +540,12 @@ CDockManager::CDockManager(QWidget *parent) : d->ContainerOverlay = new CDockOverlay(this, CDockOverlay::ModeContainerOverlay); d->Containers.append(this); d->loadStylesheet(); - connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), - this, SLOT(onFocusChanged(QWidget*, QWidget*))); + + if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) + { + connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), + this, SLOT(onFocusChanged(QWidget*, QWidget*))); + } } //============================================================================ @@ -1030,7 +1034,7 @@ void CDockManager::onFocusedDockAreaViewToggled(bool Open) return; } - OpenedDockAreas[0]->currentDockWidget()->tabWidget()->setFocus(Qt::OtherFocusReason); + CDockManager::setWidgetFocus(OpenedDockAreas[0]->currentDockWidget()->tabWidget()); } @@ -1040,7 +1044,7 @@ void CDockManager::emitWidgetDroppedSignals(QWidget* DroppedWidget) CDockWidget* DockWidget = qobject_cast(DroppedWidget); if (DockWidget) { - DockWidget->tabWidget()->setFocus(Qt::OtherFocusReason); + CDockManager::setWidgetFocus(DockWidget->tabWidget()); emit dockWidgetDropped(DockWidget); return; } @@ -1052,7 +1056,7 @@ void CDockManager::emitWidgetDroppedSignals(QWidget* DroppedWidget) } DockWidget = DockArea->currentDockWidget(); - DockWidget->tabWidget()->setFocus(Qt::OtherFocusReason); + CDockManager::setWidgetFocus(DockWidget->tabWidget()); } diff --git a/src/DockManager.h b/src/DockManager.h index a15753b..7702713 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -171,7 +171,7 @@ public: FloatingContainerHasWidgetIcon = 0x80000, //!< If set, the Floating Widget icon reflects the icon of the current dock widget otherwise it displays application icon HideSingleCentralWidgetTitleBar = 0x100000, //!< If there is only one single visible dock widget in the main dock container (the dock manager) and if this flag is set, then the titlebar of this dock widget will be hidden //!< this only makes sense for non draggable and non floatable widgets and enables the creation of some kind of "central" widget - + FocusStyling = 0x200000, //!< enables styling of focused dock widget tabs or floating widget titlebar DefaultDockAreaButtons = DockAreaHasCloseButton | DockAreaHasUndockButton @@ -415,6 +415,21 @@ public: */ static int startDragDistance(); + /** + * Helper function to set focus depending on the configuration of the + * FocusStyling flag + */ + template + static void setWidgetFocus(QWidgetPtr widget) + { + if (!CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) + { + return; + } + + widget->setFocus(Qt::OtherFocusReason); + } + public slots: /** * Opens the perspective with the given name. diff --git a/src/ads_globals.h b/src/ads_globals.h index e7dee67..f538bbe 100644 --- a/src/ads_globals.h +++ b/src/ads_globals.h @@ -258,6 +258,7 @@ void setButtonIcon(QAbstractButton* Button, QStyle::StandardPixmap StandarPixmap */ void repolishStyle(QWidget* w); + } // namespace internal } // namespace ads From 9aa958e8b028d9c7611c107e2ab599bf2b60eaed Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sat, 23 May 2020 11:17:31 +0200 Subject: [PATCH 14/28] Made all focus related code optional - only if FocusStyling flag is enabled --- demo/MainWindow.cpp | 2 ++ src/DockManager.cpp | 1 + src/DockWidgetTab.cpp | 33 ++++++++++++++++++++------------- src/FloatingDockContainer.cpp | 2 ++ 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index 35d814d..fa87277 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -571,6 +571,8 @@ CMainWindow::CMainWindow(QWidget *parent) : // dock widget. // CDockManager::setConfigFlag(CDockManager::HideSingleCentralWidgetTitleBar, true); + CDockManager::setConfigFlag(CDockManager::FocusStyling, true); + // Now create the dock manager and its content d->DockManager = new CDockManager(this); diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 8e56373..c0efc46 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -984,6 +984,7 @@ CIconProvider& CDockManager::iconProvider() //=========================================================================== void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) { + std::cout << "CDockManager::onFocusChanged" << std::endl; Q_UNUSED(focusedOld) if (!focusedNow) { diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 8d892c4..378cc59 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -285,7 +285,10 @@ CDockWidgetTab::CDockWidgetTab(CDockWidget* DockWidget, QWidget *parent) : setAttribute(Qt::WA_NoMousePropagation, true); d->DockWidget = DockWidget; d->createLayout(); - setFocusPolicy(Qt::ClickFocus); + if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) + { + setFocusPolicy(Qt::ClickFocus); + } } //============================================================================ @@ -464,21 +467,25 @@ void CDockWidgetTab::setActiveTab(bool active) bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton; d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton); - bool UpdateFocusStyle = false; - if (active && !hasFocus()) + if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) { - setFocus(Qt::OtherFocusReason); - UpdateFocusStyle = true; + bool UpdateFocusStyle = false; + if (active && !hasFocus()) + { + setFocus(Qt::OtherFocusReason); + UpdateFocusStyle = true; + } + + if (d->IsActiveTab == active) + { + if (UpdateFocusStyle) + { + updateStyle(); + } + return; + } } - if (d->IsActiveTab == active) - { - if (UpdateFocusStyle) - { - updateStyle(); - } - return; - } d->IsActiveTab = active; updateStyle(); update(); diff --git a/src/FloatingDockContainer.cpp b/src/FloatingDockContainer.cpp index fa2510b..3c458a2 100644 --- a/src/FloatingDockContainer.cpp +++ b/src/FloatingDockContainer.cpp @@ -57,6 +57,7 @@ namespace ads { #ifdef Q_OS_WIN +#if 0 /** * Just for debuging to convert windows message identifiers to strings */ @@ -350,6 +351,7 @@ static const char* windowsMessageString(int MessageId) return "unknown WM_ message"; } #endif +#endif static unsigned int zOrderCounter = 0; From ae999f132edc86a330ffe8dfd7672b527a404744 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sat, 23 May 2020 14:45:49 +0200 Subject: [PATCH 15/28] Improved focus styling --- examples/deleteonclose/main.cpp | 1 + src/DockContainerWidget.cpp | 6 ++++++ src/DockManager.cpp | 30 +++++++++++++++++++++++++++++- src/DockManager.h | 8 ++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/examples/deleteonclose/main.cpp b/examples/deleteonclose/main.cpp index 0d60fc1..f217dd0 100644 --- a/examples/deleteonclose/main.cpp +++ b/examples/deleteonclose/main.cpp @@ -10,6 +10,7 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); QMainWindow w; + ads::CDockManager::setConfigFlag(ads::CDockManager::FocusStyling, true); auto dockManager = new ads::CDockManager(&w); QAction *action = new QAction("New Delete On Close", &w); diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index d10ce15..b3525e4 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -1461,6 +1461,12 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi } window()->activateWindow(); + if (SingleDroppedDockWidget) + { + std::cout << "SingleDockWidget dropped" << std::endl; + d->DockManager->emitWidgetDroppedSignals(SingleDroppedDockWidget); + } + d->DockManager->endFloatingWidgetDrop(FloatingWidget); } diff --git a/src/DockManager.cpp b/src/DockManager.cpp index c0efc46..049db8a 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -500,10 +500,16 @@ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) updateDockAreaFocusStyle(FocusedArea, true); QObject::connect(FocusedArea, SIGNAL(viewToggled(bool)), _this, SLOT(onFocusedDockAreaViewToggled(bool))); + auto NewFloatingWidget = FocusedDockWidget->dockContainer()->floatingWidget(); + if (NewFloatingWidget) + { + NewFloatingWidget->setProperty("FocusedDockWidget", QVariant::fromValue(DockWidget)); + } + + #ifdef Q_OS_LINUX // This code is required for styling the floating widget titlebar for linux // depending on the current focus state - auto NewFloatingWidget = FocusedDockWidget->dockContainer()->floatingWidget(); if (FloatingWidget == NewFloatingWidget) { return; @@ -1061,6 +1067,28 @@ void CDockManager::emitWidgetDroppedSignals(QWidget* DroppedWidget) } +//=========================================================================== +void CDockManager::endFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget) +{ + if (!FloatingWidget) + { + return; + } + + auto vDockWidget = FloatingWidget->property("FocusedDockWidget"); + if (!vDockWidget.isValid()) + { + return; + } + auto DockWidget = vDockWidget.value(); + if (DockWidget) + { + std::cout << "Dropped focus dock widget " << DockWidget->objectName().toStdString() << std::endl; + CDockManager::setWidgetFocus(DockWidget->tabWidget()); + } +} + + } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockManager.h b/src/DockManager.h index 7702713..c6085b6 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -128,6 +128,14 @@ protected: */ void emitWidgetDroppedSignals(QWidget* DroppedWidget); + /** + * This function is called, if a floating widget has been dropped into + * an new position. + * When this function is called, all dock widgets of the FloatingWidget + * are already inserted into its new position + */ + void endFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget); + /** * Show the floating widgets that has been created floating */ From a3e979a8ad32a256a587addcf961165e60686e5e Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Wed, 3 Jun 2020 19:49:57 +0200 Subject: [PATCH 16/28] Disabled setFocus in CDockWidget::setActiveTab --- demo/MainWindow.cpp | 3 ++- src/DockManager.cpp | 29 ++++++++++++++++++++++------- src/DockManager.h | 2 +- src/DockWidgetTab.cpp | 2 +- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index fa87277..56b59a0 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -571,6 +571,7 @@ CMainWindow::CMainWindow(QWidget *parent) : // dock widget. // CDockManager::setConfigFlag(CDockManager::HideSingleCentralWidgetTitleBar, true); + //CDockManager::setConfigFlag(CDockManager::AlwaysShowTabs, true); CDockManager::setConfigFlag(CDockManager::FocusStyling, true); // Now create the dock manager and its content @@ -664,7 +665,7 @@ void CMainWindow::onViewVisibilityChanged(bool Visible) return; } - qDebug() << DockWidget->objectName() << " visibilityChanged(" << Visible << ")"; + //qDebug() << DockWidget->objectName() << " visibilityChanged(" << Visible << ")"; } diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 207d264..b9b2e2d 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -267,10 +267,15 @@ bool DockManagerPrivate::restoreStateFromXml(const QByteArray &state, int versi } ADS_PRINT(s.attributes().value("UserVersion")); - v = s.attributes().value("UserVersion").toInt(&ok); - if (!ok || v != version) + // Older files do not support UserVersion so we skip this if the file does + // not have this attribute + if (!s.attributes().value("UserVersion").isEmpty()) { - return false; + v = s.attributes().value("UserVersion").toInt(&ok); + if (!ok || v != version) + { + return false; + } } s.setFileVersion(v); @@ -498,6 +503,12 @@ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) { updateDockWidgetFocusStyle(FocusedDockWidget, false); } + + if (DockWidget != FocusedDockWidget) + { + std::cout << "!!!!!!!!!!!! focusedDockWidgetChanged " << (FocusedDockWidget ? FocusedDockWidget->objectName().toStdString() : "-") + << " -> " << (DockWidget ? DockWidget->objectName().toStdString() : "-") << std::endl; + } FocusedDockWidget = DockWidget; updateDockWidgetFocusStyle(FocusedDockWidget, true); NewFocusedDockArea = FocusedDockWidget->dockAreaWidget(); @@ -567,7 +578,7 @@ CDockManager::CDockManager(QWidget *parent) : if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) { connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), - this, SLOT(onFocusChanged(QWidget*, QWidget*))); + this, SLOT(onApplicationFocusChanged(QWidget*, QWidget*))); } } @@ -1006,7 +1017,7 @@ CIconProvider& CDockManager::iconProvider() //=========================================================================== -void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) +void CDockManager::onApplicationFocusChanged(QWidget* focusedOld, QWidget* focusedNow) { std::cout << "CDockManager::onFocusChanged" << std::endl; Q_UNUSED(focusedOld) @@ -1033,9 +1044,11 @@ void CDockManager::onFocusChanged(QWidget* focusedOld, QWidget* focusedNow) return; } #else - if (!DockWidget || !DockWidget->tabWidget()->isVisible()) + if (!DockWidget || DockWidget->tabWidget()->isHidden()) { - return; + std::cout << "!DockWidget || !DockWidget->tabWidget()->isVisible() " << (DockWidget ? DockWidget->objectName().toStdString() : "0") << std::endl; + std::cout << "DockWidget->tabWidget()->isHidden() " << (DockWidget ? DockWidget->tabWidget()->isHidden() : false) << std::endl; + return; } #endif @@ -1066,9 +1079,11 @@ void CDockManager::onFocusedDockAreaViewToggled(bool Open) //=========================================================================== void CDockManager::emitWidgetDroppedSignals(QWidget* DroppedWidget) { + std::cout << "CDockManager::emitWidgetDroppedSignals" << std::endl; CDockWidget* DockWidget = qobject_cast(DroppedWidget); if (DockWidget) { + std::cout << "CDockManager::setWidgetFocus " << DockWidget->objectName().toStdString() << std::endl; CDockManager::setWidgetFocus(DockWidget->tabWidget()); emit dockWidgetDropped(DockWidget); return; diff --git a/src/DockManager.h b/src/DockManager.h index 9eda33d..e8b854a 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -85,7 +85,7 @@ private: friend class CDockAreaTitleBar; private slots: - void onFocusChanged(QWidget *old, QWidget *now); + void onApplicationFocusChanged(QWidget *old, QWidget *now); void onFocusedDockAreaViewToggled(bool Open); protected: diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 21fb63d..9905a24 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -472,7 +472,7 @@ void CDockWidgetTab::setActiveTab(bool active) bool UpdateFocusStyle = false; if (active && !hasFocus()) { - setFocus(Qt::OtherFocusReason); + //setFocus(Qt::OtherFocusReason); UpdateFocusStyle = true; } From 45390506dd5d979ec142f145e8105074302d7554 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Thu, 4 Jun 2020 20:40:23 +0200 Subject: [PATCH 17/28] Continued implementation --- src/DockContainerWidget.cpp | 2 +- src/DockManager.cpp | 17 ++++++++++++++++- src/DockManager.h | 14 +++++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index b3525e4..920dc38 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -1466,7 +1466,7 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi std::cout << "SingleDockWidget dropped" << std::endl; d->DockManager->emitWidgetDroppedSignals(SingleDroppedDockWidget); } - d->DockManager->endFloatingWidgetDrop(FloatingWidget); + d->DockManager->notifyFloatingWidgetDrop(FloatingWidget); } diff --git a/src/DockManager.cpp b/src/DockManager.cpp index b9b2e2d..9467992 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -1101,7 +1101,7 @@ void CDockManager::emitWidgetDroppedSignals(QWidget* DroppedWidget) //=========================================================================== -void CDockManager::endFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget) +void CDockManager::notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget) { if (!FloatingWidget) { @@ -1122,6 +1122,21 @@ void CDockManager::endFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget) } +//=========================================================================== +void CDockManager::notifyDockWidgetRelocation(CDockWidget* DockWidget, CDockContainerWidget* ContainerOld) +{ + +} + + + +//=========================================================================== +void CDockManager::notifyDockAreaRelocation(CDockAreaWidget* DockArea, CDockContainerWidget* ContainerOld) +{ + +} + + } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockManager.h b/src/DockManager.h index e8b854a..6f79c73 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -134,7 +134,19 @@ protected: * When this function is called, all dock widgets of the FloatingWidget * are already inserted into its new position */ - void endFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget); + void notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget); + + /** + * This function is called, if the given DockWidget has been relocated from + * the old container ContainerOld to the new container DockWidget->dockContainer() + */ + void notifyDockWidgetRelocation(CDockWidget* DockWidget, CDockContainerWidget* ContainerOld); + + /** + * This function is called, if the given DockAreahas been relocated from + * the old container ContainerOld to the new container DockArea->dockContainer() + */ + void notifyDockAreaRelocation(CDockAreaWidget* DockArea, CDockContainerWidget* ContainerOld); /** * Show the floating widgets that has been created floating From a65b1bdcaf84ed6f35ca883c0efcbb7d7f5dc2b0 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 5 Jun 2020 07:27:44 +0200 Subject: [PATCH 18/28] Removed new dropped signals --- src/DockContainerWidget.cpp | 4 ++-- src/DockManager.cpp | 4 ++-- src/DockManager.h | 14 +------------- src/DockWidgetTab.cpp | 19 ++----------------- src/FloatingDockContainer.cpp | 4 ++++ 5 files changed, 11 insertions(+), 34 deletions(-) diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index 6af4b5f..e249906 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -1464,7 +1464,7 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi if (SingleDroppedDockWidget) { std::cout << "SingleDockWidget dropped" << std::endl; - d->DockManager->notifyWidgetDrop(SingleDroppedDockWidget); + d->DockManager->notifyWidgetOrAreaRelocation(SingleDroppedDockWidget); } d->DockManager->notifyFloatingWidgetDrop(FloatingWidget); } @@ -1499,7 +1499,7 @@ void CDockContainerWidget::dropWidget(QWidget* Widget, DockWidgetArea DropArea, } window()->activateWindow(); - d->DockManager->notifyWidgetDrop(Widget); + d->DockManager->notifyWidgetOrAreaRelocation(Widget); } diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 3807f70..7ce21f3 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -530,6 +530,7 @@ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) auto NewFloatingWidget = FocusedDockWidget->dockContainer()->floatingWidget(); if (NewFloatingWidget) { + std::cout << "NewFloatingWidget->setProperty(FocusedDockWidget)" << std::endl; NewFloatingWidget->setProperty("FocusedDockWidget", QVariant::fromValue(DockWidget)); } @@ -1076,7 +1077,7 @@ void CDockManager::onFocusedDockAreaViewToggled(bool Open) //=========================================================================== -void CDockManager::notifyWidgetDrop(QWidget* DroppedWidget) +void CDockManager::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget) { std::cout << "\n\nCDockManager::notifyWidgetDrop" << std::endl; CDockWidget* DockWidget = qobject_cast(DroppedWidget); @@ -1084,7 +1085,6 @@ void CDockManager::notifyWidgetDrop(QWidget* DroppedWidget) { std::cout << "CDockManager::setWidgetFocus " << DockWidget->objectName().toStdString() << std::endl; CDockManager::setWidgetFocus(DockWidget->tabWidget()); - emit dockWidgetDropped(DockWidget); return; } diff --git a/src/DockManager.h b/src/DockManager.h index e90a7d7..8242df4 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -126,7 +126,7 @@ protected: * A container needs to call this function if a widget has been dropped * into it */ - void notifyWidgetDrop(QWidget* DroppedWidget); + void notifyWidgetOrAreaRelocation(QWidget* RelocatedWidget); /** * This function is called, if a floating widget has been dropped into @@ -517,18 +517,6 @@ 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 //----------------------------------------------------------------------------- diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 21fb63d..bb8a381 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -466,24 +466,9 @@ void CDockWidgetTab::setActiveTab(bool active) bool AllTabsHaveCloseButton = d->testConfigFlag(CDockManager::AllTabsHaveCloseButton); bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton; d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton); - - if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) + if (d->IsActiveTab == active) { - bool UpdateFocusStyle = false; - if (active && !hasFocus()) - { - setFocus(Qt::OtherFocusReason); - UpdateFocusStyle = true; - } - - if (d->IsActiveTab == active) - { - if (UpdateFocusStyle) - { - updateStyle(); - } - return; - } + return; } d->IsActiveTab = active; diff --git a/src/FloatingDockContainer.cpp b/src/FloatingDockContainer.cpp index 3ab5c17..059523c 100644 --- a/src/FloatingDockContainer.cpp +++ b/src/FloatingDockContainer.cpp @@ -637,6 +637,8 @@ CFloatingDockContainer::CFloatingDockContainer(CDockAreaWidget *DockArea) : { TopLevelDockWidget->emitTopLevelChanged(true); } + + d->DockManager->notifyWidgetOrAreaRelocation(DockArea); } //============================================================================ @@ -652,6 +654,8 @@ CFloatingDockContainer::CFloatingDockContainer(CDockWidget *DockWidget) : { TopLevelDockWidget->emitTopLevelChanged(true); } + + d->DockManager->notifyWidgetOrAreaRelocation(DockWidget); } //============================================================================ From f90f0b04279d7d31126259fc202f76f36e400721 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 5 Jun 2020 12:14:26 +0200 Subject: [PATCH 19/28] Properly implemented focusedDockWidgetChanged() signal --- src/DockManager.cpp | 25 ++++++++++++++++++++++++- src/DockManager.h | 7 +++++++ src/DockWidgetTab.cpp | 26 +++++++++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 0064ba1..0ddb1cc 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -504,6 +504,7 @@ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) updateDockWidgetFocusStyle(FocusedDockWidget, false); } + CDockWidget* old = FocusedDockWidget; if (DockWidget != FocusedDockWidget) { std::cout << "!!!!!!!!!!!! focusedDockWidgetChanged " << (FocusedDockWidget ? FocusedDockWidget->objectName().toStdString() : "-") @@ -554,6 +555,11 @@ void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) updateFloatingWidgetFocusStyle(FloatingWidget, true); } #endif + + if (old != DockWidget) + { + emit _this->focusedDockWidgetChanged(old, DockWidget); + } } @@ -720,6 +726,10 @@ bool CDockManager::restoreState(const QByteArray &state, int version) show(); } + if (d->FocusedDockWidget) + { + updateDockWidgetFocusStyle(d->FocusedDockWidget, false); + } return Result; } @@ -1019,6 +1029,10 @@ CIconProvider& CDockManager::iconProvider() //=========================================================================== void CDockManager::onApplicationFocusChanged(QWidget* focusedOld, QWidget* focusedNow) { + if (isRestoringState()) + { + return; + } std::cout << "CDockManager::onFocusChanged" << std::endl; Q_UNUSED(focusedOld) if (!focusedNow) @@ -1060,6 +1074,11 @@ void CDockManager::onApplicationFocusChanged(QWidget* focusedOld, QWidget* focus //=========================================================================== void CDockManager::onFocusedDockAreaViewToggled(bool Open) { + if (isRestoringState()) + { + return; + } + CDockAreaWidget* DockArea = qobject_cast(sender()); if (!DockArea || Open) { @@ -1079,6 +1098,10 @@ void CDockManager::onFocusedDockAreaViewToggled(bool Open) //=========================================================================== void CDockManager::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget) { + if (isRestoringState()) + { + return; + } std::cout << "\n\nCDockManager::notifyWidgetDrop" << std::endl; CDockWidget* DockWidget = qobject_cast(DroppedWidget); if (DockWidget) @@ -1104,7 +1127,7 @@ void CDockManager::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget) void CDockManager::notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget) { std::cout << "\n\nCDockManager::notifyFloatingWidgetDrop" << std::endl; - if (!FloatingWidget) + if (!FloatingWidget || isRestoringState()) { return; } diff --git a/src/DockManager.h b/src/DockManager.h index 8242df4..05f4c82 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -517,6 +517,13 @@ signals: * docking system but it is not deleted yet. */ void dockWidgetRemoved(CDockWidget* DockWidget); + + /** + * This signal is emitted if the focused dock widget changed. + * Both old and now can be nullptr. + * The focused dock widget is the one that is highlighted in the GUI + */ + void focusedDockWidgetChanged(CDockWidget* old, CDockWidget* now); }; // class DockManager } // namespace ads //----------------------------------------------------------------------------- diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index bb8a381..f4bbde5 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -466,7 +466,31 @@ void CDockWidgetTab::setActiveTab(bool active) bool AllTabsHaveCloseButton = d->testConfigFlag(CDockManager::AllTabsHaveCloseButton); bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton; d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton); - if (d->IsActiveTab == active) + + /*if (d->IsActiveTab == active) + { + return; + }*/ + + if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling) && !d->DockWidget->dockManager()->isRestoringState()) + { + bool UpdateFocusStyle = false; + if (active && !hasFocus()) + { + setFocus(Qt::OtherFocusReason); + UpdateFocusStyle = true; + } + + if (d->IsActiveTab == active) + { + if (UpdateFocusStyle) + { + updateStyle(); + } + return; + } + } + else if (d->IsActiveTab == active) { return; } From c4d2d72e9272a413ddcf2fea066aa700d2734729 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 5 Jun 2020 13:40:36 +0200 Subject: [PATCH 20/28] Added activateWindow() call in CFloatingDockCiontainer::showEvent This is required to properly style the floating widget that contains the currently focused widget --- src/DockManager.cpp | 1 + src/FloatingDockContainer.cpp | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 0ddb1cc..e1c85c3 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -1034,6 +1034,7 @@ void CDockManager::onApplicationFocusChanged(QWidget* focusedOld, QWidget* focus return; } std::cout << "CDockManager::onFocusChanged" << std::endl; + std::cout << "focusedNow " << focusedNow << std::endl; Q_UNUSED(focusedOld) if (!focusedNow) { diff --git a/src/FloatingDockContainer.cpp b/src/FloatingDockContainer.cpp index 059523c..cbc0f96 100644 --- a/src/FloatingDockContainer.cpp +++ b/src/FloatingDockContainer.cpp @@ -804,10 +804,17 @@ void CFloatingDockContainer::hideEvent(QHideEvent *event) d->Hiding = false; } + //============================================================================ void CFloatingDockContainer::showEvent(QShowEvent *event) { Super::showEvent(event); +#ifdef Q_OS_LINUX + if (CDockManager::testConfigFlag(CDockManager::FocusStyling)) + { + this->window()->activateWindow(); + } +#endif } From f5c4b26aab34f8a307164b4255fd617731cdca10 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 5 Jun 2020 20:42:43 +0200 Subject: [PATCH 21/28] Moved focus related functionality into CDockFocusController class to keep the dock manager code clean --- demo/MainWindow.cpp | 2 +- src/CMakeLists.txt | 2 + src/DockManager.cpp | 240 ++---------------------------------------- src/DockManager.h | 5 +- src/DockWidgetTab.cpp | 6 +- src/src.pro | 6 +- 6 files changed, 18 insertions(+), 243 deletions(-) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index 60691ce..56b59a0 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -571,7 +571,7 @@ CMainWindow::CMainWindow(QWidget *parent) : // dock widget. // CDockManager::setConfigFlag(CDockManager::HideSingleCentralWidgetTitleBar, true); - CDockManager::setConfigFlag(CDockManager::AlwaysShowTabs, true); + //CDockManager::setConfigFlag(CDockManager::AlwaysShowTabs, true); CDockManager::setConfigFlag(CDockManager::FocusStyling, true); // Now create the dock manager and its content diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7893cce..b0bae44 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -17,6 +17,7 @@ set(ads_SRCS DockWidget.cpp DockWidgetTab.cpp DockingStateReader.cpp + DockFocusController.cpp ElidingLabel.cpp FloatingDockContainer.cpp FloatingDragPreview.cpp @@ -37,6 +38,7 @@ set(ads_INSTALL_INCLUDE DockWidget.h DockWidgetTab.h DockingStateReader.h + DockFocusController.h ElidingLabel.h FloatingDockContainer.h FloatingDragPreview.h diff --git a/src/DockManager.cpp b/src/DockManager.cpp index e1c85c3..9ff7a08 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -45,8 +45,6 @@ #include #include #include -#include -#include #include "FloatingDockContainer.h" #include "DockOverlay.h" @@ -56,6 +54,7 @@ #include "IconProvider.h" #include "DockingStateReader.h" #include "DockAreaTitleBar.h" +#include "DockFocusController.h" #ifdef Q_OS_LINUX #include "linux/FloatingWidgetTitleBar.h" @@ -108,9 +107,7 @@ struct DockManagerPrivate CDockManager::eViewMenuInsertionOrder MenuInsertionOrder = CDockManager::MenuAlphabeticallySorted; bool RestoringState = false; QVector UninitializedFloatingWidgets; - QPointer FocusedDockWidget = nullptr; - QPointer FocusedArea = nullptr; - QPointer FloatingWidget = nullptr; + CDockFocusController* FocusController = nullptr; /** * Private data constructor @@ -168,12 +165,6 @@ 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 @@ -458,111 +449,6 @@ 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 updateFloatingWidgetFocusStyle(CFloatingDockContainer* FloatingWidget, bool Focused) -{ -#ifdef Q_OS_LINUX - auto TitleBar = qobject_cast(FloatingWidget->titleBarWidget()); - if (!TitleBar) - { - return; - } - TitleBar->setProperty("focused", Focused); - TitleBar->updateStyle(); -#else - Q_UNUSED(FloatingWidget) - Q_UNUSED(Focused) -#endif -} - - -//============================================================================ -void DockManagerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) -{ - CDockAreaWidget* NewFocusedDockArea = nullptr; - if (FocusedDockWidget) - { - updateDockWidgetFocusStyle(FocusedDockWidget, false); - } - - CDockWidget* old = FocusedDockWidget; - if (DockWidget != FocusedDockWidget) - { - std::cout << "!!!!!!!!!!!! focusedDockWidgetChanged " << (FocusedDockWidget ? FocusedDockWidget->objectName().toStdString() : "-") - << " -> " << (DockWidget ? DockWidget->objectName().toStdString() : "-") << std::endl; - } - FocusedDockWidget = DockWidget; - updateDockWidgetFocusStyle(FocusedDockWidget, true); - NewFocusedDockArea = FocusedDockWidget->dockAreaWidget(); - if (NewFocusedDockArea && (FocusedArea != NewFocusedDockArea)) - { - 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))); - } - - - auto NewFloatingWidget = FocusedDockWidget->dockContainer()->floatingWidget(); - if (NewFloatingWidget) - { - std::cout << "NewFloatingWidget->setProperty(FocusedDockWidget)" << std::endl; - NewFloatingWidget->setProperty("FocusedDockWidget", QVariant::fromValue(DockWidget)); - } - - -#ifdef Q_OS_LINUX - // This code is required for styling the floating widget titlebar for linux - // depending on the current focus state - if (FloatingWidget == NewFloatingWidget) - { - return; - } - - if (FloatingWidget) - { - updateFloatingWidgetFocusStyle(FloatingWidget, false); - } - FloatingWidget = NewFloatingWidget; - - if (FloatingWidget) - { - updateFloatingWidgetFocusStyle(FloatingWidget, true); - } -#endif - - if (old != DockWidget) - { - emit _this->focusedDockWidgetChanged(old, DockWidget); - } -} - - //============================================================================ CDockManager::CDockManager(QWidget *parent) : CDockContainerWidget(this, parent), @@ -583,8 +469,7 @@ CDockManager::CDockManager(QWidget *parent) : if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) { - connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), - this, SLOT(onApplicationFocusChanged(QWidget*, QWidget*))); + d->FocusController = new CDockFocusController(this); } } @@ -720,16 +605,11 @@ bool CDockManager::restoreState(const QByteArray &state, int version) emit restoringState(); bool Result = d->restoreState(state, version); d->RestoringState = false; - emit stateRestored(); if (!IsHidden) { show(); } - - if (d->FocusedDockWidget) - { - updateDockWidgetFocusStyle(d->FocusedDockWidget, false); - } + emit stateRestored(); return Result; } @@ -1026,127 +906,23 @@ CIconProvider& CDockManager::iconProvider() } -//=========================================================================== -void CDockManager::onApplicationFocusChanged(QWidget* focusedOld, QWidget* focusedNow) -{ - if (isRestoringState()) - { - return; - } - std::cout << "CDockManager::onFocusChanged" << std::endl; - std::cout << "focusedNow " << focusedNow << std::endl; - Q_UNUSED(focusedOld) - if (!focusedNow) - { - return; - } - - CDockWidget* DockWidget = nullptr; - auto DockWidgetTab = qobject_cast(focusedNow); - std::cout << "FocuseNow " << focusedNow->metaObject()->className() << std::endl; - if (DockWidgetTab) - { - DockWidget = DockWidgetTab->dockWidget(); - } - else - { - DockWidget = internal::findParent(focusedNow); - } - -#ifdef Q_OS_LINUX - if (!DockWidget) - { - return; - } -#else - if (!DockWidget || DockWidget->tabWidget()->isHidden()) - { - std::cout << "!DockWidget || !DockWidget->tabWidget()->isVisible() " << (DockWidget ? DockWidget->objectName().toStdString() : "0") << std::endl; - std::cout << "DockWidget->tabWidget()->isHidden() " << (DockWidget ? DockWidget->tabWidget()->isHidden() : false) << std::endl; - return; - } -#endif - - std::cout << "CDockManager::onFocusChanged " << DockWidget->tabWidget()->text().toStdString() << std::endl; - d->updateDockWidgetFocus(DockWidget); -} - - -//=========================================================================== -void CDockManager::onFocusedDockAreaViewToggled(bool Open) -{ - if (isRestoringState()) - { - return; - } - - CDockAreaWidget* DockArea = qobject_cast(sender()); - if (!DockArea || Open) - { - return; - } - auto Container = DockArea->dockContainer(); - auto OpenedDockAreas = Container->openedDockAreas(); - if (OpenedDockAreas.isEmpty()) - { - return; - } - - CDockManager::setWidgetFocus(OpenedDockAreas[0]->currentDockWidget()->tabWidget()); -} - - //=========================================================================== void CDockManager::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget) { - if (isRestoringState()) + if (d->FocusController) { - return; + d->FocusController->notifyWidgetOrAreaRelocation(DroppedWidget); } - std::cout << "\n\nCDockManager::notifyWidgetDrop" << std::endl; - CDockWidget* DockWidget = qobject_cast(DroppedWidget); - if (DockWidget) - { - std::cout << "CDockManager::setWidgetFocus " << DockWidget->objectName().toStdString() << std::endl; - CDockManager::setWidgetFocus(DockWidget->tabWidget()); - return; - } - - CDockAreaWidget* DockArea = qobject_cast(DroppedWidget); - if (!DockArea) - { - return; - } - - DockWidget = DockArea->currentDockWidget(); - CDockManager::setWidgetFocus(DockWidget->tabWidget()); - std::cout << "\n\n" << std::endl; } //=========================================================================== void CDockManager::notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget) { - std::cout << "\n\nCDockManager::notifyFloatingWidgetDrop" << std::endl; - if (!FloatingWidget || isRestoringState()) + if (d->FocusController) { - return; + d->FocusController->notifyFloatingWidgetDrop(FloatingWidget); } - - auto vDockWidget = FloatingWidget->property("FocusedDockWidget"); - if (!vDockWidget.isValid()) - { - return; - } - std::cout << "vDockWidget.isValid()" << std::endl; - auto DockWidget = vDockWidget.value(); - if (DockWidget) - { - std::cout << "Dropped focus dock widget " << DockWidget->objectName().toStdString() << std::endl; - DockWidget->dockAreaWidget()->setCurrentDockWidget(DockWidget); - CDockManager::setWidgetFocus(DockWidget->tabWidget()); - } - std::cout << "\n\n" << std::endl; } diff --git a/src/DockManager.h b/src/DockManager.h index 05f4c82..1a5fc2c 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -84,9 +84,6 @@ private: friend struct FloatingDragPreviewPrivate; friend class CDockAreaTitleBar; -private slots: - void onApplicationFocusChanged(QWidget *old, QWidget *now); - void onFocusedDockAreaViewToggled(bool Open); protected: /** @@ -122,6 +119,7 @@ protected: */ CDockOverlay* dockAreaOverlay() const; + /** * A container needs to call this function if a widget has been dropped * into it @@ -136,6 +134,7 @@ protected: */ void notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget); + /** * Show the floating widgets that has been created floating */ diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index f4bbde5..28a0448 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -467,11 +467,7 @@ void CDockWidgetTab::setActiveTab(bool active) bool TabHasCloseButton = (ActiveTabHasCloseButton && active) | AllTabsHaveCloseButton; d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton); - /*if (d->IsActiveTab == active) - { - return; - }*/ - + // Focus related stuff if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling) && !d->DockWidget->dockManager()->isRestoringState()) { bool UpdateFocusStyle = false; diff --git a/src/src.pro b/src/src.pro index b54cbeb..fba3562 100644 --- a/src/src.pro +++ b/src/src.pro @@ -45,7 +45,8 @@ HEADERS += \ DockAreaTitleBar.h \ ElidingLabel.h \ IconProvider.h \ - DockComponentsFactory.h + DockComponentsFactory.h \ + DockFocusController.h SOURCES += \ @@ -64,7 +65,8 @@ SOURCES += \ DockAreaTitleBar.cpp \ ElidingLabel.cpp \ IconProvider.cpp \ - DockComponentsFactory.cpp + DockComponentsFactory.cpp \ + DockFocusController.cpp unix { From 2fc8bbe9c94d02e3e82c43bd4daa9f2a9cc8f2c9 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Fri, 5 Jun 2020 21:03:47 +0200 Subject: [PATCH 22/28] Added mising DockFocusController files --- src/DockFocusController.cpp | 320 ++++++++++++++++++++++++++++++++++++ src/DockFocusController.h | 83 ++++++++++ 2 files changed, 403 insertions(+) create mode 100644 src/DockFocusController.cpp create mode 100644 src/DockFocusController.h diff --git a/src/DockFocusController.cpp b/src/DockFocusController.cpp new file mode 100644 index 0000000..ea81d1b --- /dev/null +++ b/src/DockFocusController.cpp @@ -0,0 +1,320 @@ +//============================================================================ +/// \file DockFocusController.cpp +/// \author Uwe Kindler +/// \date 05.06.2020 +/// \brief Implementation of CDockFocusController class +//============================================================================ + +//============================================================================ +// INCLUDES +//============================================================================ +#include "DockFocusController.h" + +#include +#include + +#include +#include + +#include "DockWidget.h" +#include "DockAreaWidget.h" +#include "DockWidgetTab.h" +#include "DockContainerWidget.h" +#include "FloatingDockContainer.h" +#include "DockManager.h" +#include "DockAreaTitleBar.h" + +namespace ads +{ +/** + * Private data class of CDockFocusController class (pimpl) + */ +struct DockFocusControllerPrivate +{ + CDockFocusController *_this; + QPointer FocusedDockWidget = nullptr; + QPointer FocusedArea = nullptr; + CDockManager* DockManager; + + /** + * Private data constructor + */ + DockFocusControllerPrivate(CDockFocusController *_public); + + /** + * This function updates the focus style of the given dock widget and + * the dock area that it belongs to + */ + void updateDockWidgetFocus(CDockWidget* DockWidget); +}; +// struct DockFocusControllerPrivate + + +//=========================================================================== +static void updateDockWidgetFocusStyle(CDockWidget* DockWidget, bool Focused) +{ + DockWidget->setProperty("focused", Focused); + DockWidget->tabWidget()->setProperty("focused", Focused); + DockWidget->tabWidget()->updateStyle(); + internal::repolishStyle(DockWidget); +} + + +//=========================================================================== +static void updateDockAreaFocusStyle(CDockAreaWidget* DockArea, bool Focused) +{ + DockArea->setProperty("focused", Focused); + internal::repolishStyle(DockArea); + internal::repolishStyle(DockArea->titleBar()); +} + + +//=========================================================================== +#ifdef Q_OS_LINUX +static void updateFloatingWidgetFocusStyle(CFloatingDockContainer* FloatingWidget, bool Focused) +{ + auto TitleBar = qobject_cast(FloatingWidget->titleBarWidget()); + if (!TitleBar) + { + return; + } + TitleBar->setProperty("focused", Focused); + TitleBar->updateStyle(); +} +#endif + + +//============================================================================ +DockFocusControllerPrivate::DockFocusControllerPrivate( + CDockFocusController *_public) : + _this(_public) +{ + +} + + +//============================================================================ +void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) +{ + CDockAreaWidget* NewFocusedDockArea = nullptr; + if (FocusedDockWidget) + { + updateDockWidgetFocusStyle(FocusedDockWidget, false); + } + + CDockWidget* old = FocusedDockWidget; + if (DockWidget != FocusedDockWidget) + { + std::cout << "!!!!!!!!!!!! focusedDockWidgetChanged " << (FocusedDockWidget ? FocusedDockWidget->objectName().toStdString() : "-") + << " -> " << (DockWidget ? DockWidget->objectName().toStdString() : "-") << std::endl; + } + FocusedDockWidget = DockWidget; + updateDockWidgetFocusStyle(FocusedDockWidget, true); + NewFocusedDockArea = FocusedDockWidget->dockAreaWidget(); + if (NewFocusedDockArea && (FocusedArea != NewFocusedDockArea)) + { + 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))); + } + + + auto NewFloatingWidget = FocusedDockWidget->dockContainer()->floatingWidget(); + if (NewFloatingWidget) + { + std::cout << "NewFloatingWidget->setProperty(FocusedDockWidget)" << std::endl; + NewFloatingWidget->setProperty("FocusedDockWidget", QVariant::fromValue(DockWidget)); + } + + +#ifdef Q_OS_LINUX + // This code is required for styling the floating widget titlebar for linux + // depending on the current focus state + if (FloatingWidget == NewFloatingWidget) + { + return; + } + + if (FloatingWidget) + { + updateFloatingWidgetFocusStyle(FloatingWidget, false); + } + FloatingWidget = NewFloatingWidget; + + if (FloatingWidget) + { + updateFloatingWidgetFocusStyle(FloatingWidget, true); + } +#endif + + if (old != DockWidget) + { + emit DockManager->focusedDockWidgetChanged(old, DockWidget); + } +} + + + +//============================================================================ +CDockFocusController::CDockFocusController(CDockManager* DockManager) : + Super(DockManager), + d(new DockFocusControllerPrivate(this)) +{ + d->DockManager = DockManager; + connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), + this, SLOT(onApplicationFocusChanged(QWidget*, QWidget*))); + connect(d->DockManager, SIGNAL(stateRestored()), SLOT(onStateRestored())); +} + +//============================================================================ +CDockFocusController::~CDockFocusController() +{ + delete d; +} + + +//=========================================================================== +void CDockFocusController::onApplicationFocusChanged(QWidget* focusedOld, QWidget* focusedNow) +{ + if (d->DockManager->isRestoringState()) + { + return; + } + std::cout << "CDockManager::onFocusChanged" << std::endl; + std::cout << "focusedNow " << focusedNow << std::endl; + Q_UNUSED(focusedOld) + if (!focusedNow) + { + return; + } + + CDockWidget* DockWidget = nullptr; + auto DockWidgetTab = qobject_cast(focusedNow); + std::cout << "FocuseNow " << focusedNow->metaObject()->className() << std::endl; + if (DockWidgetTab) + { + DockWidget = DockWidgetTab->dockWidget(); + } + else + { + DockWidget = internal::findParent(focusedNow); + } + +#ifdef Q_OS_LINUX + if (!DockWidget) + { + return; + } +#else + if (!DockWidget || DockWidget->tabWidget()->isHidden()) + { + std::cout << "!DockWidget || !DockWidget->tabWidget()->isVisible() " << (DockWidget ? DockWidget->objectName().toStdString() : "0") << std::endl; + std::cout << "DockWidget->tabWidget()->isHidden() " << (DockWidget ? DockWidget->tabWidget()->isHidden() : false) << std::endl; + return; + } +#endif + + std::cout << "CDockManager::onFocusChanged " << DockWidget->tabWidget()->text().toStdString() << std::endl; + d->updateDockWidgetFocus(DockWidget); +} + + +//=========================================================================== +void CDockFocusController::onFocusedDockAreaViewToggled(bool Open) +{ + if (d->DockManager->isRestoringState()) + { + return; + } + + CDockAreaWidget* DockArea = qobject_cast(sender()); + if (!DockArea || Open) + { + return; + } + auto Container = DockArea->dockContainer(); + auto OpenedDockAreas = Container->openedDockAreas(); + if (OpenedDockAreas.isEmpty()) + { + return; + } + + CDockManager::setWidgetFocus(OpenedDockAreas[0]->currentDockWidget()->tabWidget()); +} + + +//=========================================================================== +void CDockFocusController::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget) +{ + if (d->DockManager->isRestoringState()) + { + return; + } + std::cout << "\n\nCDockManager::notifyWidgetDrop" << std::endl; + CDockWidget* DockWidget = qobject_cast(DroppedWidget); + if (DockWidget) + { + std::cout << "CDockManager::setWidgetFocus " << DockWidget->objectName().toStdString() << std::endl; + CDockManager::setWidgetFocus(DockWidget->tabWidget()); + return; + } + + CDockAreaWidget* DockArea = qobject_cast(DroppedWidget); + if (!DockArea) + { + return; + } + + DockWidget = DockArea->currentDockWidget(); + CDockManager::setWidgetFocus(DockWidget->tabWidget()); + std::cout << "\n\n" << std::endl; +} + + +//=========================================================================== +void CDockFocusController::notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget) +{ + std::cout << "\n\nCDockManager::notifyFloatingWidgetDrop" << std::endl; + if (!FloatingWidget || d->DockManager->isRestoringState()) + { + return; + } + + auto vDockWidget = FloatingWidget->property("FocusedDockWidget"); + if (!vDockWidget.isValid()) + { + return; + } + std::cout << "vDockWidget.isValid()" << std::endl; + auto DockWidget = vDockWidget.value(); + if (DockWidget) + { + std::cout << "Dropped focus dock widget " << DockWidget->objectName().toStdString() << std::endl; + DockWidget->dockAreaWidget()->setCurrentDockWidget(DockWidget); + CDockManager::setWidgetFocus(DockWidget->tabWidget()); + } + std::cout << "\n\n" << std::endl; +} + + +//========================================================================== +void CDockFocusController::onStateRestored() +{ + std::cout << "CDockFocusController::onStateRestored()" << std::endl; + if (d->FocusedDockWidget) + { + updateDockWidgetFocusStyle(d->FocusedDockWidget, false); + } +} + +} // namespace ads + +//--------------------------------------------------------------------------- +// EOF DockFocusController.cpp diff --git a/src/DockFocusController.h b/src/DockFocusController.h new file mode 100644 index 0000000..cff65bf --- /dev/null +++ b/src/DockFocusController.h @@ -0,0 +1,83 @@ +#ifndef DockFocusControllerH +#define DockFocusControllerH +//============================================================================ +/// \file DockFocusController.h +/// \author Uwe Kindler +/// \date 05.06.2020 +/// \brief Declaration of CDockFocusController class +//============================================================================ + +//============================================================================ +// INCLUDES +//============================================================================ +#include +#include "ads_globals.h" +#include "DockManager.h" + +namespace ads +{ +struct DockFocusControllerPrivate; +class CDockManager; +class CFloatingDockContainer; + +/** + * Manages focus styling of dock widgets and handling of focus changes + */ +class ADS_EXPORT CDockFocusController : public QObject +{ + Q_OBJECT +private: + DockFocusControllerPrivate* d; ///< private data (pimpl) + friend class DockFocusControllerPrivate; + +private slots: + void onApplicationFocusChanged(QWidget *old, QWidget *now); + void onFocusedDockAreaViewToggled(bool Open); + void onStateRestored(); + +public: + using Super = QObject; + /** + * Default Constructor + */ + CDockFocusController(CDockManager* DockManager); + + /** + * Virtual Destructor + */ + virtual ~CDockFocusController(); + + /** + * Helper function to set focus depending on the configuration of the + * FocusStyling flag + */ + template + static void setWidgetFocus(QWidgetPtr widget) + { + if (!CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) + { + return; + } + + widget->setFocus(Qt::OtherFocusReason); + } + + /** + * A container needs to call this function if a widget has been dropped + * into it + */ + void notifyWidgetOrAreaRelocation(QWidget* RelocatedWidget); + + /** + * This function is called, if a floating widget has been dropped into + * an new position. + * When this function is called, all dock widgets of the FloatingWidget + * are already inserted into its new position + */ + void notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget); +}; // class DockFocusController +} + // namespace ads +//----------------------------------------------------------------------------- +#endif // DockFocusControllerH + From 312a8cf5001e1a43493daa7ff805332cfc2e770d Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sat, 6 Jun 2020 14:59:03 +0200 Subject: [PATCH 23/28] Enabled ClickFocus for CDockWidget to support focussing in case the content does not support it Renamed FocusStyling to FocusHighlighting --- demo/MainWindow.cpp | 6 +++++- examples/deleteonclose/main.cpp | 2 +- src/DockAreaTitleBar.cpp | 6 ++++++ src/DockFocusController.cpp | 15 ++++++++++++++- src/DockFocusController.h | 8 +++++++- src/DockManager.cpp | 12 +++++++++++- src/DockManager.h | 11 +++++++++-- src/DockWidget.cpp | 5 +++++ src/DockWidgetTab.cpp | 4 ++-- 9 files changed, 60 insertions(+), 9 deletions(-) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index 56b59a0..c9016a4 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -196,6 +196,9 @@ static ads::CDockWidget* createFileSystemTreeDockWidget(QMenu* ViewMenu) .arg(FileSystemCount++)); DockWidget->setWidget(w); ViewMenu->addAction(DockWidget->toggleViewAction()); + // We disable focus to test focus highlighting if the dock widget content + // does not support focus + w->setFocusPolicy(Qt::NoFocus); return DockWidget; } @@ -572,7 +575,7 @@ CMainWindow::CMainWindow(QWidget *parent) : // CDockManager::setConfigFlag(CDockManager::HideSingleCentralWidgetTitleBar, true); //CDockManager::setConfigFlag(CDockManager::AlwaysShowTabs, true); - CDockManager::setConfigFlag(CDockManager::FocusStyling, true); + CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); // Now create the dock manager and its content d->DockManager = new CDockManager(this); @@ -659,6 +662,7 @@ void CMainWindow::onViewToggled(bool Open) //============================================================================ void CMainWindow::onViewVisibilityChanged(bool Visible) { + Q_UNUSED(Visible); auto DockWidget = qobject_cast(sender()); if (!DockWidget) { diff --git a/examples/deleteonclose/main.cpp b/examples/deleteonclose/main.cpp index f217dd0..2f08ffe 100644 --- a/examples/deleteonclose/main.cpp +++ b/examples/deleteonclose/main.cpp @@ -10,7 +10,7 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); QMainWindow w; - ads::CDockManager::setConfigFlag(ads::CDockManager::FocusStyling, true); + ads::CDockManager::setConfigFlag(ads::CDockManager::FocusHighlighting, true); auto dockManager = new ads::CDockManager(&w); QAction *action = new QAction("New Delete On Close", &w); diff --git a/src/DockAreaTitleBar.cpp b/src/DockAreaTitleBar.cpp index aec4cc9..61142e1 100644 --- a/src/DockAreaTitleBar.cpp +++ b/src/DockAreaTitleBar.cpp @@ -465,6 +465,11 @@ void CDockAreaTitleBar::mousePressEvent(QMouseEvent* ev) ev->accept(); d->DragStartMousePos = ev->pos(); d->DragState = DraggingMousePressed; + + if (CDockManager::configFlags().testFlag(CDockManager::FocusHighlighting)) + { + d->TabBar->currentTab()->setFocus(Qt::OtherFocusReason); + } return; } Super::mousePressEvent(ev); @@ -485,6 +490,7 @@ void CDockAreaTitleBar::mouseReleaseEvent(QMouseEvent* ev) { d->FloatingWidget->finishDragging(); } + return; } Super::mouseReleaseEvent(ev); diff --git a/src/DockFocusController.cpp b/src/DockFocusController.cpp index ea81d1b..409d854 100644 --- a/src/DockFocusController.cpp +++ b/src/DockFocusController.cpp @@ -202,7 +202,13 @@ void CDockFocusController::onApplicationFocusChanged(QWidget* focusedOld, QWidge { DockWidget = DockWidgetTab->dockWidget(); } - else + + if (!DockWidget) + { + DockWidget = qobject_cast(focusedNow); + } + + if (!DockWidget) { DockWidget = internal::findParent(focusedNow); } @@ -226,6 +232,13 @@ void CDockFocusController::onApplicationFocusChanged(QWidget* focusedOld, QWidge } +//=========================================================================== +void CDockFocusController::setDockWidgetFocused(CDockWidget* focusedNow) +{ + d->updateDockWidgetFocus(focusedNow); +} + + //=========================================================================== void CDockFocusController::onFocusedDockAreaViewToggled(bool Open) { diff --git a/src/DockFocusController.h b/src/DockFocusController.h index cff65bf..f93b485 100644 --- a/src/DockFocusController.h +++ b/src/DockFocusController.h @@ -54,7 +54,7 @@ public: template static void setWidgetFocus(QWidgetPtr widget) { - if (!CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) + if (!CDockManager::configFlags().testFlag(CDockManager::FocusHighlighting)) { return; } @@ -75,6 +75,12 @@ public: * are already inserted into its new position */ void notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget); + +public slots: + /** + * Request a focus change to the given dock widget + */ + void setDockWidgetFocused(CDockWidget* focusedNow); }; // class DockFocusController } // namespace ads diff --git a/src/DockManager.cpp b/src/DockManager.cpp index 9ff7a08..84b97f2 100644 --- a/src/DockManager.cpp +++ b/src/DockManager.cpp @@ -467,7 +467,7 @@ CDockManager::CDockManager(QWidget *parent) : d->Containers.append(this); d->loadStylesheet(); - if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) + if (CDockManager::configFlags().testFlag(CDockManager::FocusHighlighting)) { d->FocusController = new CDockFocusController(this); } @@ -926,6 +926,16 @@ void CDockManager::notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidg } +//=========================================================================== +void CDockManager::setDockWidgetFocused(CDockWidget* DockWidget) +{ + if (d->FocusController) + { + d->FocusController->setDockWidgetFocused(DockWidget); + } +} + + } // namespace ads //--------------------------------------------------------------------------- diff --git a/src/DockManager.h b/src/DockManager.h index 1a5fc2c..6a9fb1f 100644 --- a/src/DockManager.h +++ b/src/DockManager.h @@ -178,7 +178,7 @@ public: FloatingContainerHasWidgetIcon = 0x80000, //!< If set, the Floating Widget icon reflects the icon of the current dock widget otherwise it displays application icon HideSingleCentralWidgetTitleBar = 0x100000, //!< If there is only one single visible dock widget in the main dock container (the dock manager) and if this flag is set, then the titlebar of this dock widget will be hidden //!< this only makes sense for non draggable and non floatable widgets and enables the creation of some kind of "central" widget - FocusStyling = 0x200000, //!< enables styling of focused dock widget tabs or floating widget titlebar + FocusHighlighting = 0x200000, //!< enables styling of focused dock widget tabs or floating widget titlebar DefaultDockAreaButtons = DockAreaHasCloseButton | DockAreaHasUndockButton @@ -434,7 +434,7 @@ public: template static void setWidgetFocus(QWidgetPtr widget) { - if (!CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) + if (!CDockManager::configFlags().testFlag(CDockManager::FocusHighlighting)) { return; } @@ -448,6 +448,13 @@ public slots: */ void openPerspective(const QString& PerspectiveName); + /** + * Request a focus change to the given dock widget. + * This function only has an effect, if the flag CDockManager::FocusStyling + * is enabled + */ + void setDockWidgetFocused(CDockWidget* DockWidget); + signals: /** * This signal is emitted if the list of perspectives changed diff --git a/src/DockWidget.cpp b/src/DockWidget.cpp index 0c5c2a2..3dba01b 100644 --- a/src/DockWidget.cpp +++ b/src/DockWidget.cpp @@ -235,6 +235,11 @@ CDockWidget::CDockWidget(const QString &title, QWidget *parent) : connect(d->ToggleViewAction, SIGNAL(triggered(bool)), this, SLOT(toggleView(bool))); setToolbarFloatingStyle(false); + + if (CDockManager::configFlags().testFlag(CDockManager::FocusHighlighting)) + { + setFocusPolicy(Qt::ClickFocus); + } } //============================================================================ diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 28a0448..2341a1a 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -285,7 +285,7 @@ CDockWidgetTab::CDockWidgetTab(CDockWidget* DockWidget, QWidget *parent) : setAttribute(Qt::WA_NoMousePropagation, true); d->DockWidget = DockWidget; d->createLayout(); - if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling)) + if (CDockManager::configFlags().testFlag(CDockManager::FocusHighlighting)) { setFocusPolicy(Qt::ClickFocus); } @@ -468,7 +468,7 @@ void CDockWidgetTab::setActiveTab(bool active) d->CloseButton->setVisible(DockWidgetClosable && TabHasCloseButton); // Focus related stuff - if (CDockManager::configFlags().testFlag(CDockManager::FocusStyling) && !d->DockWidget->dockManager()->isRestoringState()) + if (CDockManager::configFlags().testFlag(CDockManager::FocusHighlighting) && !d->DockWidget->dockManager()->isRestoringState()) { bool UpdateFocusStyle = false; if (active && !hasFocus()) From cd495a14ecda91e6a8a4b7065d49cb49d74ded06 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sun, 7 Jun 2020 15:20:08 +0200 Subject: [PATCH 24/28] Fixed MSVC compiler warning --- src/DockFocusController.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DockFocusController.h b/src/DockFocusController.h index f93b485..d98d9d4 100644 --- a/src/DockFocusController.h +++ b/src/DockFocusController.h @@ -28,7 +28,7 @@ class ADS_EXPORT CDockFocusController : public QObject Q_OBJECT private: DockFocusControllerPrivate* d; ///< private data (pimpl) - friend class DockFocusControllerPrivate; + friend struct DockFocusControllerPrivate; private slots: void onApplicationFocusChanged(QWidget *old, QWidget *now); From 227037e42ab5efe9a626b971afb2cc0141d2e2db Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sun, 7 Jun 2020 15:20:24 +0200 Subject: [PATCH 25/28] Added new close button SVG icon --- src/ads.qrc | 1 + src/images/close-button2.svg | 139 +++++++++++++++++++++++++++++++++++ src/stylesheets/default.css | 20 ++++- 3 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 src/images/close-button2.svg diff --git a/src/ads.qrc b/src/ads.qrc index ecb2a6e..e636379 100644 --- a/src/ads.qrc +++ b/src/ads.qrc @@ -4,5 +4,6 @@ images/close-button.svg images/close-button-disabled.svg stylesheets/default_linux.css + images/close-button2.svg diff --git a/src/images/close-button2.svg b/src/images/close-button2.svg new file mode 100644 index 0000000..c772029 --- /dev/null +++ b/src/images/close-button2.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Jemis Mali + + + + + image/svg+xml + + + + + + diff --git a/src/stylesheets/default.css b/src/stylesheets/default.css index 0909d1d..7adac0a 100644 --- a/src/stylesheets/default.css +++ b/src/stylesheets/default.css @@ -78,13 +78,19 @@ QScrollArea#dockWidgetScrollArea #tabCloseButton:hover { - border: 1px solid rgba(0, 0, 0, 32); - background: rgba(0, 0, 0, 16); + /*border: 1px solid rgba(0, 0, 0, 32);*/ + background: rgba(0, 0, 0, 24); } #tabCloseButton:pressed { - background: rgba(0, 0, 0, 32); + background: rgba(0, 0, 0, 48); +} + +#tabCloseButton +{ + qproperty-icon: url(:/ads/images/close-button2.svg); + qproperty-iconSize: 16px; } @@ -104,6 +110,13 @@ ads--CDockWidgetTab[focused="true"] border-color: palette(highlight); } + +ads--CDockWidgetTab[focused="true"] > #tabCloseButton:hover +{ + background: rgba(255, 255, 255, 24); +} + + ads--CDockWidgetTab[focused="true"] QLabel { color: palette(light); @@ -123,3 +136,4 @@ ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar border-bottom: 2px solid palette(highlight); padding-bottom: 0px; } + From 0227bd178664695cd01a63c4565ba54a6972aa5a Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sun, 7 Jun 2020 17:19:07 +0200 Subject: [PATCH 26/28] Added icon for proper styling of focused close icon --- demo/MainWindow.cpp | 1 + src/DockWidgetTab.cpp | 5 +- src/ads.qrc | 2 +- src/ads_globals.cpp | 15 +- src/ads_globals.h | 9 +- src/images/close-button-disabled.svg | 241 ++++++++++-------- ...e-button2.svg => close-button-focused.svg} | 154 +++++------ src/images/close-button.svg | 238 +++++++++-------- src/stylesheets/default.css | 18 +- 9 files changed, 375 insertions(+), 308 deletions(-) rename src/images/{close-button2.svg => close-button-focused.svg} (83%) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index c9016a4..115277b 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -576,6 +576,7 @@ CMainWindow::CMainWindow(QWidget *parent) : //CDockManager::setConfigFlag(CDockManager::AlwaysShowTabs, true); CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); + CDockManager::setConfigFlag(CDockManager::AllTabsHaveCloseButton, true); // Now create the dock manager and its content d->DockManager = new CDockManager(this); diff --git a/src/DockWidgetTab.cpp b/src/DockWidgetTab.cpp index 2341a1a..e14fffe 100644 --- a/src/DockWidgetTab.cpp +++ b/src/DockWidgetTab.cpp @@ -666,10 +666,7 @@ void CDockWidgetTab::setElideMode(Qt::TextElideMode mode) //============================================================================ void CDockWidgetTab::updateStyle() { - this->style()->unpolish(this); - this->style()->polish(this); - d->TitleLabel->style()->unpolish(d->TitleLabel); - d->TitleLabel->style()->polish(d->TitleLabel); + internal::repolishStyle(this, internal::RepolishDirectChildren); } diff --git a/src/ads.qrc b/src/ads.qrc index e636379..33157a2 100644 --- a/src/ads.qrc +++ b/src/ads.qrc @@ -4,6 +4,6 @@ images/close-button.svg images/close-button-disabled.svg stylesheets/default_linux.css - images/close-button2.svg + images/close-button-focused.svg diff --git a/src/ads_globals.cpp b/src/ads_globals.cpp index 79ad9e1..b185e5e 100644 --- a/src/ads_globals.cpp +++ b/src/ads_globals.cpp @@ -121,7 +121,7 @@ void setButtonIcon(QAbstractButton* Button, QStyle::StandardPixmap StandarPixmap //============================================================================ -void repolishStyle(QWidget* w) +void repolishStyle(QWidget* w, eRepolishChildOptions Options) { if (!w) { @@ -129,6 +129,19 @@ void repolishStyle(QWidget* w) } w->style()->unpolish(w); w->style()->polish(w); + + if (RepolishIgnoreChildren == Options) + { + return; + } + + QList Children = w->findChildren(QString(), + (RepolishDirectChildren == Options) ? Qt::FindDirectChildrenOnly: Qt::FindChildrenRecursively); + for (auto Widget : Children) + { + Widget->style()->unpolish(Widget); + Widget->style()->polish(Widget); + } } } // namespace internal diff --git a/src/ads_globals.h b/src/ads_globals.h index 93430b9..3523be5 100644 --- a/src/ads_globals.h +++ b/src/ads_globals.h @@ -245,11 +245,18 @@ void setButtonIcon(QAbstractButton* Button, QStyle::StandardPixmap StandarPixmap ads::eIcon CustomIconId); +enum eRepolishChildOptions +{ + RepolishIgnoreChildren, + RepolishDirectChildren, + RepolishChildrenRecursively +}; + /** * Calls unpolish() / polish for the style of the given widget to update * stylesheet if a property changes */ -void repolishStyle(QWidget* w); +void repolishStyle(QWidget* w, eRepolishChildOptions Options = RepolishIgnoreChildren); } // namespace internal diff --git a/src/images/close-button-disabled.svg b/src/images/close-button-disabled.svg index 7bce2a8..e213ca7 100644 --- a/src/images/close-button-disabled.svg +++ b/src/images/close-button-disabled.svg @@ -1,6 +1,4 @@ - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + inkscape:version="1.0 (4035a4fb49, 2020-05-01)" + version="1.1" + id="svg2" + viewBox="0 0 16 16" + height="16px" + width="16px"> + + + + + + + + + + + + + + + + + + + + + + + + + Jemis Mali + + + + + image/svg+xml + + + + + + diff --git a/src/images/close-button2.svg b/src/images/close-button-focused.svg similarity index 83% rename from src/images/close-button2.svg rename to src/images/close-button-focused.svg index c772029..b9a6fad 100644 --- a/src/images/close-button2.svg +++ b/src/images/close-button-focused.svg @@ -7,120 +7,120 @@ xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="16px" - height="16px" - viewBox="0 0 16 16" - id="svg2" - version="1.1" + sodipodi:docname="close-button-focused.svg" inkscape:version="1.0 (4035a4fb49, 2020-05-01)" - sodipodi:docname="close-button2.svg"> + version="1.1" + id="svg2" + viewBox="0 0 16 16" + height="16px" + width="16px"> + width="6" + height="6" + x="0" + y="0" /> + width="6" + height="6" + x="0" + y="0" /> + width="6" + height="6" + x="0" + y="0" /> + width="6" + height="6" + x="0" + y="0" /> + inkscape:document-rotation="0" + inkscape:snap-global="true" + inkscape:snap-bbox-midpoints="true" + inkscape:snap-bbox-edge-midpoints="true" + inkscape:bbox-nodes="true" + inkscape:bbox-paths="true" + inkscape:snap-bbox="true" + inkscape:window-maximized="1" + inkscape:window-y="-8" + inkscape:window-x="-8" + inkscape:window-height="1017" + inkscape:window-width="1920" + units="px" + showgrid="true" + inkscape:current-layer="g5228" + inkscape:document-units="px" + inkscape:cy="13.17691" + inkscape:cx="6.2316889" + inkscape:zoom="22.627417" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + borderopacity="1.0" + bordercolor="#666666" + pagecolor="#ffffff" + id="base"> + id="grid3336" + type="xygrid" /> + position="4,10" /> + position="10,12" /> + position="12,2" /> + position="14,4" /> + inkscape:groupmode="layer" + inkscape:label="Layer 1"> + id="g5228" + transform="translate(628,-140.49998)"> + transform="translate(-628,1176.8622)" /> + dc:date="2016-12-14" + dc:publisher="Iconscout" + dc:description="Menu, Bar, Lines, Option, List, Hamburger, Web" + dc:title="Menu, Bar, Lines, Option, List, Hamburger, Web" + about="https://iconscout.com/legal#licenses"> Jemis Mali @@ -132,7 +132,7 @@ image/svg+xml - + diff --git a/src/images/close-button.svg b/src/images/close-button.svg index e6254df..c772029 100644 --- a/src/images/close-button.svg +++ b/src/images/close-button.svg @@ -1,6 +1,4 @@ - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + inkscape:version="1.0 (4035a4fb49, 2020-05-01)" + sodipodi:docname="close-button2.svg"> + + + + + + + + + + + + + + + + + + + + + + + + + Jemis Mali + + + + + image/svg+xml + + + + + + diff --git a/src/stylesheets/default.css b/src/stylesheets/default.css index 7adac0a..23e23be 100644 --- a/src/stylesheets/default.css +++ b/src/stylesheets/default.css @@ -89,7 +89,7 @@ QScrollArea#dockWidgetScrollArea #tabCloseButton { - qproperty-icon: url(:/ads/images/close-button2.svg); + qproperty-icon: url(:/ads/images/close-button.svg); qproperty-iconSize: 16px; } @@ -105,15 +105,27 @@ ads--CDockSplitter::handle /* Focus related styling */ ads--CDockWidgetTab[focused="true"] -{ +{; background: palette(highlight); border-color: palette(highlight); } +ads--CDockWidgetTab[focused="true"] > #tabCloseButton +{ + qproperty-icon: url(:/ads/images/close-button-focused.svg) +} + + ads--CDockWidgetTab[focused="true"] > #tabCloseButton:hover { - background: rgba(255, 255, 255, 24); + background: rgba(255, 255, 255, 48); +} + + +ads--CDockWidgetTab[focused="true"] > #tabCloseButton:pressed +{ + background: rgba(255, 255, 255, 92); } From a9268e6bf70f48a41989abe5223ba78496fdca47 Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Sun, 7 Jun 2020 17:28:23 +0200 Subject: [PATCH 27/28] Fixed build issues and improved styling Improved styling of close buttons and focused close buttons --- src/DockFocusController.cpp | 7 +++++++ src/FloatingDockContainer.cpp | 2 +- src/stylesheets/default_linux.css | 30 +++++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/src/DockFocusController.cpp b/src/DockFocusController.cpp index 409d854..82fdb95 100644 --- a/src/DockFocusController.cpp +++ b/src/DockFocusController.cpp @@ -24,6 +24,10 @@ #include "DockManager.h" #include "DockAreaTitleBar.h" +#ifdef Q_OS_LINUX +#include "linux/FloatingWidgetTitleBar.h" +#endif + namespace ads { /** @@ -34,6 +38,9 @@ struct DockFocusControllerPrivate CDockFocusController *_this; QPointer FocusedDockWidget = nullptr; QPointer FocusedArea = nullptr; +#ifdef Q_OS_LINUX + QPointer FloatingWidget = nullptr; +#endif CDockManager* DockManager; /** diff --git a/src/FloatingDockContainer.cpp b/src/FloatingDockContainer.cpp index cbc0f96..45b9832 100644 --- a/src/FloatingDockContainer.cpp +++ b/src/FloatingDockContainer.cpp @@ -810,7 +810,7 @@ void CFloatingDockContainer::showEvent(QShowEvent *event) { Super::showEvent(event); #ifdef Q_OS_LINUX - if (CDockManager::testConfigFlag(CDockManager::FocusStyling)) + if (CDockManager::testConfigFlag(CDockManager::FocusHighlighting)) { this->window()->activateWindow(); } diff --git a/src/stylesheets/default_linux.css b/src/stylesheets/default_linux.css index 7e8abd7..0eb6717 100644 --- a/src/stylesheets/default_linux.css +++ b/src/stylesheets/default_linux.css @@ -84,13 +84,19 @@ QScrollArea#dockWidgetScrollArea #tabCloseButton:hover { - border: 1px solid rgba(0, 0, 0, 32); - background: rgba(0, 0, 0, 16); + /*border: 1px solid rgba(0, 0, 0, 32);*/ + background: rgba(0, 0, 0, 24); } #tabCloseButton:pressed { - background: rgba(0, 0, 0, 32); + background: rgba(0, 0, 0, 48); +} + +#tabCloseButton +{ + qproperty-icon: url(:/ads/images/close-button.svg); + qproperty-iconSize: 16px; } /* Focus related styling */ @@ -100,6 +106,24 @@ ads--CDockWidgetTab[focused="true"] border-color: palette(highlight); } +ads--CDockWidgetTab[focused="true"] > #tabCloseButton +{ + qproperty-icon: url(:/ads/images/close-button-focused.svg) +} + + + +ads--CDockWidgetTab[focused="true"] > #tabCloseButton:hover +{ + background: rgba(255, 255, 255, 48); +} + + +ads--CDockWidgetTab[focused="true"] > #tabCloseButton:pressed +{ + background: rgba(255, 255, 255, 92); +} + ads--CDockWidgetTab[focused="true"] QLabel { color: palette(light); From ff3fcdcacd94664c4355ecb8bffd3d763c9ab9ca Mon Sep 17 00:00:00 2001 From: Uwe Kindler Date: Tue, 9 Jun 2020 14:40:13 +0200 Subject: [PATCH 28/28] Removed debug output --- demo/MainWindow.cpp | 1 - src/DockContainerWidget.cpp | 2 -- src/DockFocusController.cpp | 24 +++--------------------- 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/demo/MainWindow.cpp b/demo/MainWindow.cpp index 115277b..c9016a4 100644 --- a/demo/MainWindow.cpp +++ b/demo/MainWindow.cpp @@ -576,7 +576,6 @@ CMainWindow::CMainWindow(QWidget *parent) : //CDockManager::setConfigFlag(CDockManager::AlwaysShowTabs, true); CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true); - CDockManager::setConfigFlag(CDockManager::AllTabsHaveCloseButton, true); // Now create the dock manager and its content d->DockManager = new CDockManager(this); diff --git a/src/DockContainerWidget.cpp b/src/DockContainerWidget.cpp index e249906..b91ab53 100644 --- a/src/DockContainerWidget.cpp +++ b/src/DockContainerWidget.cpp @@ -1463,7 +1463,6 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi window()->activateWindow(); if (SingleDroppedDockWidget) { - std::cout << "SingleDockWidget dropped" << std::endl; d->DockManager->notifyWidgetOrAreaRelocation(SingleDroppedDockWidget); } d->DockManager->notifyFloatingWidgetDrop(FloatingWidget); @@ -1473,7 +1472,6 @@ void CDockContainerWidget::dropFloatingWidget(CFloatingDockContainer* FloatingWi //============================================================================ void CDockContainerWidget::dropWidget(QWidget* Widget, DockWidgetArea DropArea, CDockAreaWidget* TargetAreaWidget) { - std::cout << "dropWidget" << std::endl; CDockWidget* SingleDockWidget = topLevelDockWidget(); if (TargetAreaWidget) { diff --git a/src/DockFocusController.cpp b/src/DockFocusController.cpp index 82fdb95..43acc96 100644 --- a/src/DockFocusController.cpp +++ b/src/DockFocusController.cpp @@ -110,11 +110,6 @@ void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) } CDockWidget* old = FocusedDockWidget; - if (DockWidget != FocusedDockWidget) - { - std::cout << "!!!!!!!!!!!! focusedDockWidgetChanged " << (FocusedDockWidget ? FocusedDockWidget->objectName().toStdString() : "-") - << " -> " << (DockWidget ? DockWidget->objectName().toStdString() : "-") << std::endl; - } FocusedDockWidget = DockWidget; updateDockWidgetFocusStyle(FocusedDockWidget, true); NewFocusedDockArea = FocusedDockWidget->dockAreaWidget(); @@ -122,7 +117,6 @@ void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) { if (FocusedArea) { - std::cout << "FocusedArea" << std::endl; QObject::disconnect(FocusedArea, SIGNAL(viewToggled(bool)), _this, SLOT(onFocusedDockAreaViewToggled(bool))); updateDockAreaFocusStyle(FocusedArea, false); } @@ -136,7 +130,6 @@ void DockFocusControllerPrivate::updateDockWidgetFocus(CDockWidget* DockWidget) auto NewFloatingWidget = FocusedDockWidget->dockContainer()->floatingWidget(); if (NewFloatingWidget) { - std::cout << "NewFloatingWidget->setProperty(FocusedDockWidget)" << std::endl; NewFloatingWidget->setProperty("FocusedDockWidget", QVariant::fromValue(DockWidget)); } @@ -194,8 +187,7 @@ void CDockFocusController::onApplicationFocusChanged(QWidget* focusedOld, QWidge { return; } - std::cout << "CDockManager::onFocusChanged" << std::endl; - std::cout << "focusedNow " << focusedNow << std::endl; + Q_UNUSED(focusedOld) if (!focusedNow) { @@ -204,7 +196,6 @@ void CDockFocusController::onApplicationFocusChanged(QWidget* focusedOld, QWidge CDockWidget* DockWidget = nullptr; auto DockWidgetTab = qobject_cast(focusedNow); - std::cout << "FocuseNow " << focusedNow->metaObject()->className() << std::endl; if (DockWidgetTab) { DockWidget = DockWidgetTab->dockWidget(); @@ -228,13 +219,10 @@ void CDockFocusController::onApplicationFocusChanged(QWidget* focusedOld, QWidge #else if (!DockWidget || DockWidget->tabWidget()->isHidden()) { - std::cout << "!DockWidget || !DockWidget->tabWidget()->isVisible() " << (DockWidget ? DockWidget->objectName().toStdString() : "0") << std::endl; - std::cout << "DockWidget->tabWidget()->isHidden() " << (DockWidget ? DockWidget->tabWidget()->isHidden() : false) << std::endl; return; } #endif - std::cout << "CDockManager::onFocusChanged " << DockWidget->tabWidget()->text().toStdString() << std::endl; d->updateDockWidgetFocus(DockWidget); } @@ -277,11 +265,10 @@ void CDockFocusController::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget) { return; } - std::cout << "\n\nCDockManager::notifyWidgetDrop" << std::endl; + CDockWidget* DockWidget = qobject_cast(DroppedWidget); if (DockWidget) { - std::cout << "CDockManager::setWidgetFocus " << DockWidget->objectName().toStdString() << std::endl; CDockManager::setWidgetFocus(DockWidget->tabWidget()); return; } @@ -294,14 +281,12 @@ void CDockFocusController::notifyWidgetOrAreaRelocation(QWidget* DroppedWidget) DockWidget = DockArea->currentDockWidget(); CDockManager::setWidgetFocus(DockWidget->tabWidget()); - std::cout << "\n\n" << std::endl; } //=========================================================================== void CDockFocusController::notifyFloatingWidgetDrop(CFloatingDockContainer* FloatingWidget) { - std::cout << "\n\nCDockManager::notifyFloatingWidgetDrop" << std::endl; if (!FloatingWidget || d->DockManager->isRestoringState()) { return; @@ -312,22 +297,19 @@ void CDockFocusController::notifyFloatingWidgetDrop(CFloatingDockContainer* Floa { return; } - std::cout << "vDockWidget.isValid()" << std::endl; + auto DockWidget = vDockWidget.value(); if (DockWidget) { - std::cout << "Dropped focus dock widget " << DockWidget->objectName().toStdString() << std::endl; DockWidget->dockAreaWidget()->setCurrentDockWidget(DockWidget); CDockManager::setWidgetFocus(DockWidget->tabWidget()); } - std::cout << "\n\n" << std::endl; } //========================================================================== void CDockFocusController::onStateRestored() { - std::cout << "CDockFocusController::onStateRestored()" << std::endl; if (d->FocusedDockWidget) { updateDockWidgetFocusStyle(d->FocusedDockWidget, false);