From 310c052134cf728249cc24c8af3db657e9289c6d Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 14 Oct 2023 12:59:10 +0200 Subject: [PATCH] Gui: implement option to disable overlay management --- src/Gui/DockWindowManager.cpp | 57 ++++++++++++++----- src/Gui/DockWindowManager.h | 3 + .../PreferencePages/DlgSettingsGeneral.cpp | 6 ++ src/Gui/PreferencePages/DlgSettingsGeneral.ui | 19 +++++++ src/Gui/Workbench.cpp | 12 +++- 5 files changed, 81 insertions(+), 16 deletions(-) diff --git a/src/Gui/DockWindowManager.cpp b/src/Gui/DockWindowManager.cpp index 8ae9bb88cf..69eb85409c 100644 --- a/src/Gui/DockWindowManager.cpp +++ b/src/Gui/DockWindowManager.cpp @@ -154,6 +154,7 @@ struct DockWindowManagerP boost::signals2::scoped_connection _connParam; QTimer _timer; DockWidgetEventFilter _dockWidgetEventFilter; + QPointer overlayManager; }; } // namespace Gui @@ -175,9 +176,31 @@ void DockWindowManager::destruct() DockWindowManager::DockWindowManager() { d = new DockWindowManagerP; + d->_hPref = App::GetApplication().GetUserParameter().GetGroup("BaseApp/MainWindow/DockWindows"); + + auto grp = App::GetApplication().GetUserParameter().GetGroup("BaseApp/Preferences/DockWindows"); + if (grp->GetBool("ActivateOverlay", true)) { + setupOverlayManagement(); + } +} + +DockWindowManager::~DockWindowManager() +{ + d->_dockedWindows.clear(); + delete d; +} + +bool DockWindowManager::isOverlayActivated() const +{ + return (d->overlayManager != nullptr); +} + +void DockWindowManager::setupOverlayManagement() +{ + d->overlayManager = OverlayManager::instance(); + qApp->installEventFilter(&d->_dockWidgetEventFilter); - d->_hPref = App::GetApplication().GetUserParameter().GetGroup( - "BaseApp/MainWindow/DockWindows"); + d->_dockWidgetEventFilter.cursorMargin = d->_hPref->GetInt("CursorMargin", 5); d->_connParam = d->_hPref->Manager()->signalParamChanged.connect( [this](ParameterGrp *Param, ParameterGrp::ParamType Type, const char *name, const char *) { @@ -210,12 +233,6 @@ DockWindowManager::DockWindowManager() }); } -DockWindowManager::~DockWindowManager() -{ - d->_dockedWindows.clear(); - delete d; -} - /** * Adds a new dock window to the main window and embeds the given \a widget. */ @@ -230,7 +247,10 @@ QDockWidget* DockWindowManager::addDockWindow(const char* name, QWidget* widget, // creates the dock widget as container to embed this widget MainWindow* mw = getMainWindow(); dw = new QDockWidget(mw); - OverlayManager::instance()->setupTitleBar(dw); + + if (d->overlayManager) { + d->overlayManager->setupTitleBar(dw); + } // Note: By default all dock widgets are hidden but the user can show them manually in the view menu. // First, hide immediately the dock widget to avoid flickering, after setting up the dock widgets @@ -266,7 +286,9 @@ QDockWidget* DockWindowManager::addDockWindow(const char* name, QWidget* widget, d->_dockedWindows.push_back(dw); - OverlayManager::instance()->initDockWidget(dw); + if (d->overlayManager) { + d->overlayManager->initDockWidget(dw); + } connect(dw->toggleViewAction(), &QAction::triggered, [this, dw](){ Base::ConnectionBlocker block(d->_connParam); @@ -329,7 +351,11 @@ QWidget* DockWindowManager::removeDockWindow(const char* name) if ((*it)->objectName() == QString::fromUtf8(name)) { QDockWidget* dw = *it; d->_dockedWindows.erase(it); - OverlayManager::instance()->unsetupDockWidget(dw); + + if (d->overlayManager) { + d->overlayManager->unsetupDockWidget(dw); + } + getMainWindow()->removeDockWidget(dw); // avoid to destruct the embedded widget widget = dw->widget(); @@ -359,7 +385,9 @@ void DockWindowManager::removeDockWindow(QWidget* widget) if ((*it)->widget() == widget) { QDockWidget* dw = *it; d->_dockedWindows.erase(it); - OverlayManager::instance()->unsetupDockWidget(dw); + if (d->overlayManager) { + d->overlayManager->unsetupDockWidget(dw); + } getMainWindow()->removeDockWidget(dw); // avoid to destruct the embedded widget widget->setParent(nullptr); @@ -491,8 +519,9 @@ void DockWindowManager::setup(DockWindowItems* items) docked.removeAt(index); } - if(dw && visible) - OverlayManager::instance()->setupDockWidget(dw); + if (d->overlayManager && dw && visible) { + d->overlayManager->setupDockWidget(dw); + } } tabifyDockWidgets(items); diff --git a/src/Gui/DockWindowManager.h b/src/Gui/DockWindowManager.h index 38de218e46..c6ceb9440c 100644 --- a/src/Gui/DockWindowManager.h +++ b/src/Gui/DockWindowManager.h @@ -97,6 +97,8 @@ public: void loadState(); void retranslate(); + bool isOverlayActivated() const; + private Q_SLOTS: /** * \internal @@ -110,6 +112,7 @@ private Q_SLOTS: private: QDockWidget* findDockWidget(const QList&, const QString&) const; void tabifyDockWidgets(DockWindowItems*); + void setupOverlayManagement(); DockWindowManager(); ~DockWindowManager() override; diff --git a/src/Gui/PreferencePages/DlgSettingsGeneral.cpp b/src/Gui/PreferencePages/DlgSettingsGeneral.cpp index 4d0e342a92..c3f39a073b 100644 --- a/src/Gui/PreferencePages/DlgSettingsGeneral.cpp +++ b/src/Gui/PreferencePages/DlgSettingsGeneral.cpp @@ -230,6 +230,10 @@ void DlgSettingsGeneral::saveSettings() ui->RecentFiles->onSave(); ui->EnableCursorBlinking->onSave(); ui->SplashScreen->onSave(); + ui->ActivateOverlay->onSave(); + if (property("ActivateOverlay").toBool() != ui->ActivateOverlay->isChecked()) { + requireRestart(); + } setRecentFileSize(); bool force = setLanguage(); @@ -297,6 +301,8 @@ void DlgSettingsGeneral::loadSettings() ui->RecentFiles->onRestore(); ui->EnableCursorBlinking->onRestore(); ui->SplashScreen->onRestore(); + ui->ActivateOverlay->onRestore(); + setProperty("ActivateOverlay", ui->ActivateOverlay->isChecked()); // search for the language files ParameterGrp::handle hGrp = WindowParameter::getDefaultParameter()->GetGroup("General"); diff --git a/src/Gui/PreferencePages/DlgSettingsGeneral.ui b/src/Gui/PreferencePages/DlgSettingsGeneral.ui index e457b417c4..fe2eafe4cc 100644 --- a/src/Gui/PreferencePages/DlgSettingsGeneral.ui +++ b/src/Gui/PreferencePages/DlgSettingsGeneral.ui @@ -360,6 +360,25 @@ display the splash screen + + + + Activate overlay handling of dock windows + + + Activate overlay handling + + + true + + + ActivateOverlay + + + DockWindows + + + diff --git a/src/Gui/Workbench.cpp b/src/Gui/Workbench.cpp index 612bb62b8b..81d5d3c8fd 100644 --- a/src/Gui/Workbench.cpp +++ b/src/Gui/Workbench.cpp @@ -698,8 +698,16 @@ MenuItem* StdWorkbench::setupMenuBar() const #endif << "Separator" << visu << "Std_ToggleNavigation" - << "Std_SetAppearance" << "Std_RandomColor" << "Separator" - << "Std_Workbench" << "Std_ToolBarMenu" << "Std_DockViewMenu" << "Std_DockOverlay" << "Separator" + << "Std_SetAppearance" + << "Std_RandomColor" + << "Separator" + << "Std_Workbench" + << "Std_ToolBarMenu" + << "Std_DockViewMenu"; + if (DockWindowManager::instance()->isOverlayActivated()) { + *view << "Std_DockOverlay"; + } + *view << "Separator" << "Std_LinkSelectActions" << "Std_TreeViewActions" << "Std_ViewStatusBar";