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)
This commit is contained in:
Paddle
2022-11-04 08:38:07 +01:00
committed by Chris Hennes
parent f2bc69647f
commit c9aadeec4c
4 changed files with 88 additions and 16 deletions

View File

@@ -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<QToolBar*> ToolBarManager::toolBars() const
return tb;
}
void ToolBarManager::setToolbarVisibility(bool show, const QList<QString>& 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);
}
}
}

View File

@@ -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<ToolBarItem*> getItems() const;
HideStyle forceHide;
private:
std::string _name;
QList<ToolBarItem*> _items;
@@ -81,6 +88,8 @@ public:
void retranslate() const;
void setMovable(bool movable) const;
void setToolbarVisibility(bool show, const QList<QString>& names);
void setToolbarVisibility(bool show, const QString& name);
protected:
void setup(ToolBarItem*, QToolBar*) const;

View File

@@ -66,6 +66,7 @@
#include <Gui/Utilities.h>
#include <Gui/View3DInventor.h>
#include <Gui/View3DInventorViewer.h>
#include "Gui/ToolBarManager.h"
#include <Mod/Part/App/Geometry.h>
#include <Mod/Sketcher/App/GeoList.h>
@@ -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<Gui::Rubberband>();
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) {

View File

@@ -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);