From c9aadeec4ce7b18ab50cf2c2b6d5d6d15f9e32d6 Mon Sep 17 00:00:00 2001 From: Paddle Date: Fri, 4 Nov 2022 08:38:07 +0100 Subject: [PATCH] Gui: Allow to hide toolbars that are not needed. In particular this hides edit-mode sketcher toolbars when in non-edit-mode. And hides non-edit-mode toolbar when in edit-mode. It also hides the structure toolbar when in edit-mode (as it is completely deactivated) --- src/Gui/ToolBarManager.cpp | 40 +++++++++++++++++---- src/Gui/ToolBarManager.h | 11 +++++- src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 39 +++++++++++++++++++- src/Mod/Sketcher/Gui/Workbench.cpp | 14 ++++---- 4 files changed, 88 insertions(+), 16 deletions(-) diff --git a/src/Gui/ToolBarManager.cpp b/src/Gui/ToolBarManager.cpp index 242305f9e6..f285ef98dd 100644 --- a/src/Gui/ToolBarManager.cpp +++ b/src/Gui/ToolBarManager.cpp @@ -36,11 +36,11 @@ using namespace Gui; -ToolBarItem::ToolBarItem() +ToolBarItem::ToolBarItem() : forceHide(HideStyle::VISIBLE) { } -ToolBarItem::ToolBarItem(ToolBarItem* item) +ToolBarItem::ToolBarItem(ToolBarItem* item, HideStyle forcehide) : forceHide(forcehide) { if ( item ) item->appendItem(this); @@ -196,7 +196,6 @@ void ToolBarManager::setup(ToolBarItem* toolBarItems) this->toolbarNames << name; QToolBar* toolbar = findToolBar(toolbars, name); std::string toolbarName = (*it)->command(); - bool visible = hPref->GetBool(toolbarName.c_str(), true); bool toolbar_added = false; if (!toolbar) { @@ -210,16 +209,17 @@ void ToolBarManager::setup(ToolBarItem* toolBarItems) + QChar::fromLatin1(']'); toolbar->setToolTip(tooltip); } - toolbar->setVisible(visible); toolbar_added = true; } else { - toolbar->setVisible(visible); - toolbar->toggleViewAction()->setVisible(true); int index = toolbars.indexOf(toolbar); toolbars.removeAt(index); } + bool visible = hPref->GetBool(toolbarName.c_str(), true) && (*it)->forceHide == ToolBarItem::HideStyle::VISIBLE; + toolbar->setVisible(visible); + toolbar->toggleViewAction()->setVisible((*it)->forceHide == ToolBarItem::HideStyle::VISIBLE); + // setup the toolbar setup(*it, toolbar); @@ -254,7 +254,7 @@ void ToolBarManager::setup(ToolBarItem* toolBarItems) QByteArray toolbarName = (*it)->objectName().toUtf8(); if (!(*it)->toggleViewAction()->isVisible()) continue; - hPref->SetBool(toolbarName.constData(), (*it)->isVisible()); + //hPref->SetBool(toolbarName.constData(), (*it)->isVisible()); (*it)->hide(); (*it)->toggleViewAction()->setVisible(false); } @@ -308,6 +308,8 @@ void ToolBarManager::saveState() const for (QStringList::ConstIterator it = this->toolbarNames.begin(); it != this->toolbarNames.end(); ++it) { QToolBar* toolbar = findToolBar(toolbars, *it); if (toolbar) { + if (!toolbar->toggleViewAction()->isVisible()) + continue; //if toggleViewAction is not visible it means that the toolbar is forceHide. In which case we do not save settings. QByteArray toolbarName = toolbar->objectName().toUtf8(); hPref->SetBool(toolbarName.constData(), toolbar->isVisible()); } @@ -385,3 +387,27 @@ QList ToolBarManager::toolBars() const return tb; } + +void ToolBarManager::setToolbarVisibility(bool show, const QList& names) { + for (auto& name : names) { + setToolbarVisibility(show, name); + } +} + +void ToolBarManager::setToolbarVisibility(bool show, const QString& name) { + + ParameterGrp::handle hPref = App::GetApplication().GetUserParameter().GetGroup("BaseApp")->GetGroup("MainWindow")->GetGroup("Toolbars"); + + QToolBar* tb = findToolBar(toolBars(), name); + if (tb) { + if (show) { + if(hPref->GetBool(name.toStdString().c_str(), true)) + tb->show(); + tb->toggleViewAction()->setVisible(true); + } + else { + tb->hide(); + tb->toggleViewAction()->setVisible(false); + } + } +} \ No newline at end of file diff --git a/src/Gui/ToolBarManager.h b/src/Gui/ToolBarManager.h index ed92657642..b85eb56c91 100644 --- a/src/Gui/ToolBarManager.h +++ b/src/Gui/ToolBarManager.h @@ -35,8 +35,13 @@ namespace Gui { class GuiExport ToolBarItem { public: + enum class HideStyle { + VISIBLE, + FORCE_HIDE // Force a toolbar to be hidden. For when all elements are disabled at some point in a workbench. + }; + ToolBarItem(); - ToolBarItem(ToolBarItem* item); + ToolBarItem(ToolBarItem* item, HideStyle forceHide = HideStyle::VISIBLE); ~ToolBarItem(); void setCommand(const std::string&); @@ -56,6 +61,8 @@ public: ToolBarItem& operator << (const std::string& command); QList getItems() const; + HideStyle forceHide; + private: std::string _name; QList _items; @@ -81,6 +88,8 @@ public: void retranslate() const; void setMovable(bool movable) const; + void setToolbarVisibility(bool show, const QList& names); + void setToolbarVisibility(bool show, const QString& name); protected: void setup(ToolBarItem*, QToolBar*) const; diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 2fc948214f..aa492b09c1 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -66,6 +66,7 @@ #include #include #include +#include "Gui/ToolBarManager.h" #include #include @@ -84,6 +85,7 @@ #include "ViewProviderSketchGeometryExtension.h" + FC_LOG_LEVEL_INIT("Sketch",true,true) using namespace SketcherGui; @@ -314,7 +316,6 @@ ViewProviderSketch::ViewProviderSketch() rubberband = std::make_unique(); cameraSensor.setFunction(&ViewProviderSketch::camSensCB); - } ViewProviderSketch::~ViewProviderSketch() @@ -2749,6 +2750,25 @@ void ViewProviderSketch::setupContextMenu(QMenu *menu, QObject *receiver, const Gui::ViewProvider::setupContextMenu(menu, receiver, member); } +namespace +{ + inline const QStringList editModeToolbarNames() + { + return QStringList{ QString::fromLatin1("Sketcher Edit Mode"), + QString::fromLatin1("Sketcher geometries"), + QString::fromLatin1("Sketcher constraints"), + QString::fromLatin1("Sketcher tools"), + QString::fromLatin1("Sketcher B-spline tools"), + QString::fromLatin1("Sketcher virtual space") }; + } + + inline const QStringList nonEditModeToolbarNames() + { + return QStringList{ QString::fromLatin1("Structure"), + QString::fromLatin1("Sketcher") }; + } +} + bool ViewProviderSketch::setEdit(int ModNum) { // When double-clicking on the item for this sketch the @@ -2891,6 +2911,14 @@ bool ViewProviderSketch::setEdit(int ModNum) Gui::getMainWindow()->installEventFilter(listener); + /*Modify toolbars dynamically. + First save state of toolbars in case user changed visibility of a toolbar but he's not changing the wb. + This happens in someone works directly from sketcher, changing from edit mode to not-edit-mode*/ + Gui::ToolBarManager::getInstance()->saveState(); + + Gui::ToolBarManager::getInstance()->setToolbarVisibility(true, editModeToolbarNames()); + Gui::ToolBarManager::getInstance()->setToolbarVisibility(false, nonEditModeToolbarNames()); + return true; } @@ -3021,6 +3049,15 @@ void ViewProviderSketch::UpdateSolverInformation() void ViewProviderSketch::unsetEdit(int ModNum) { Q_UNUSED(ModNum); + + /*Modify toolbars dynamically. + First save state of toolbars in case user changed visibility of a toolbar but he's not changing the wb. + This happens in someone works directly from sketcher, changing from edit mode to not-edit-mode*/ + Gui::ToolBarManager::getInstance()->saveState(); + + Gui::ToolBarManager::getInstance()->setToolbarVisibility(false, editModeToolbarNames()); + Gui::ToolBarManager::getInstance()->setToolbarVisibility(true, nonEditModeToolbarNames()); + TightGrid.setValue(true); if(listener) { diff --git a/src/Mod/Sketcher/Gui/Workbench.cpp b/src/Mod/Sketcher/Gui/Workbench.cpp index 1030b0f9ba..d4afbcc56f 100644 --- a/src/Mod/Sketcher/Gui/Workbench.cpp +++ b/src/Mod/Sketcher/Gui/Workbench.cpp @@ -114,27 +114,27 @@ Gui::ToolBarItem* Workbench::setupToolBars() const sketcher->setCommand("Sketcher"); addSketcherWorkbenchSketchActions(*sketcher); - Gui::ToolBarItem* sketcherEditMode = new Gui::ToolBarItem(root); - sketcherEditMode->setCommand("Sketcher"); + Gui::ToolBarItem* sketcherEditMode = new Gui::ToolBarItem(root, Gui::ToolBarItem::HideStyle::FORCE_HIDE); + sketcherEditMode->setCommand("Sketcher Edit Mode"); addSketcherWorkbenchSketchEditModeActions(*sketcherEditMode); - Gui::ToolBarItem* geom = new Gui::ToolBarItem(root); + Gui::ToolBarItem* geom = new Gui::ToolBarItem(root, Gui::ToolBarItem::HideStyle::FORCE_HIDE); geom->setCommand("Sketcher geometries"); addSketcherWorkbenchGeometries(*geom); - Gui::ToolBarItem* cons = new Gui::ToolBarItem(root); + Gui::ToolBarItem* cons = new Gui::ToolBarItem(root, Gui::ToolBarItem::HideStyle::FORCE_HIDE); cons->setCommand("Sketcher constraints"); addSketcherWorkbenchConstraints(*cons); - Gui::ToolBarItem* consaccel = new Gui::ToolBarItem(root); + Gui::ToolBarItem* consaccel = new Gui::ToolBarItem(root, Gui::ToolBarItem::HideStyle::FORCE_HIDE); consaccel->setCommand("Sketcher tools"); addSketcherWorkbenchTools(*consaccel); - Gui::ToolBarItem* bspline = new Gui::ToolBarItem(root); + Gui::ToolBarItem* bspline = new Gui::ToolBarItem(root, Gui::ToolBarItem::HideStyle::FORCE_HIDE); bspline->setCommand("Sketcher B-spline tools"); addSketcherWorkbenchBSplines(*bspline); - Gui::ToolBarItem* virtualspace = new Gui::ToolBarItem(root); + Gui::ToolBarItem* virtualspace = new Gui::ToolBarItem(root, Gui::ToolBarItem::HideStyle::FORCE_HIDE); virtualspace->setCommand("Sketcher virtual space"); addSketcherWorkbenchVirtualSpace(*virtualspace);