From 2e1f3d862dc50fdb4905a1a22ccf68d41c9cbb0d Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 29 Sep 2023 12:48:28 +0200 Subject: [PATCH] Gui: several minor improvements: * replace C array with std::array * use range-based loop * activate the first of tabified dock widgets * refactor DockWindowManager::setup --- src/Gui/DockWindowManager.cpp | 59 +++++++++++++++++++++++------------ src/Gui/DockWindowManager.h | 1 + 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/src/Gui/DockWindowManager.cpp b/src/Gui/DockWindowManager.cpp index c6cacf0e3e..cf1b6a1f5c 100644 --- a/src/Gui/DockWindowManager.cpp +++ b/src/Gui/DockWindowManager.cpp @@ -23,6 +23,7 @@ #include "PreCompiled.h" #ifndef _PreComp_ +# include # include # include # include @@ -337,18 +338,17 @@ void DockWindowManager::setup(DockWindowItems* items) ->GetGroup("MainWindow")->GetGroup("DockWindows"); QList docked = d->_dockedWindows; const QList& dws = items->dockWidgets(); - QList areas[4]; - for (QList::ConstIterator it = dws.begin(); it != dws.end(); ++it) { - QDockWidget* dw = findDockWidget(docked, it->name); - QByteArray dockName = it->name.toLatin1(); - bool visible = hPref->GetBool(dockName.constData(), it->visibility); + for (const auto& it : dws) { + QDockWidget* dw = findDockWidget(docked, it.name); + QByteArray dockName = it.name.toLatin1(); + bool visible = hPref->GetBool(dockName.constData(), it.visibility); if (!dw) { - QMap >::Iterator jt = d->_dockWindows.find(it->name); + QMap >::Iterator jt = d->_dockWindows.find(it.name); if (jt != d->_dockWindows.end()) { - dw = addDockWindow(jt.value()->objectName().toUtf8(), jt.value(), it->pos); + dw = addDockWindow(jt.value()->objectName().toUtf8(), jt.value(), it.pos); jt.value()->show(); - dw->toggleViewAction()->setData(it->name); + dw->toggleViewAction()->setData(it.name); dw->setVisible(visible); } } @@ -358,8 +358,27 @@ void DockWindowManager::setup(DockWindowItems* items) int index = docked.indexOf(dw); docked.removeAt(index); } + } - if (it->tabbed && dw) { + tabifyDockWidgets(items); +} + +void DockWindowManager::tabifyDockWidgets(DockWindowItems* items) +{ + // Tabify dock widgets only once to avoid to override the current layout + // in case it was modified by the user. The user shouldn't be forced to + // restore a possibly changed layout after switching to another workbench. + static bool tabify = false; + if (tabify) { + return; + } + + std::array, 4> areas; + const QList& dws = items->dockWidgets(); + QList docked = d->_dockedWindows; + for (const auto& it : dws) { + QDockWidget* dw = findDockWidget(docked, it.name); + if (it.tabbed && dw) { Qt::DockWidgetArea pos = getMainWindow()->dockWidgetArea(dw); switch (pos) { case Qt::LeftDockWidgetArea: @@ -380,19 +399,19 @@ void DockWindowManager::setup(DockWindowItems* items) } } - // Don't always tabify after switching the workbench - static bool tabify = false; - if (!tabify) { - // tabify dock widgets for which "tabbed" is true and which have the same position - for (int i=0; i<4; i++) { - const QList& dws = areas[i]; - for (QList::ConstIterator it = dws.begin(); it != dws.end(); ++it) { - if (*it != dws.front()) { - getMainWindow()->tabifyDockWidget(dws.front(), *it); - tabify = true; - } + // tabify dock widgets for which "tabbed" is true and which have the same position + for (auto& area : areas) { + for (auto it : area) { + if (it != area.front()) { + getMainWindow()->tabifyDockWidget(area.front(), it); + tabify = true; } } + + // activate the first of the tabbed dock widgets + if (area.size() > 1) { + area.front()->raise(); + } } } diff --git a/src/Gui/DockWindowManager.h b/src/Gui/DockWindowManager.h index 366cd96738..76cc3c2c22 100644 --- a/src/Gui/DockWindowManager.h +++ b/src/Gui/DockWindowManager.h @@ -109,6 +109,7 @@ private Q_SLOTS: private: QDockWidget* findDockWidget(const QList&, const QString&) const; + void tabifyDockWidgets(DockWindowItems*); DockWindowManager(); ~DockWindowManager() override;