diff --git a/src/Gui/Action.cpp b/src/Gui/Action.cpp index 2b1ca129bb68..5a2e87c32d69 100644 --- a/src/Gui/Action.cpp +++ b/src/Gui/Action.cpp @@ -976,27 +976,19 @@ QSize WorkbenchTabBar::tabSizeHint(int index) const QSize size = QTabBar::tabSizeHint(index); if (!tabText(index).isEmpty()) return size; - - QStyleOptionTab opt; - initStyleOption(&opt, index); switch (shape()) { case QTabBar::RoundedWest: case QTabBar::RoundedEast: case QTabBar::TriangularWest: - case QTabBar::TriangularEast: { - int hframe = style()->pixelMetric(QStyle::PM_TabBarTabHSpace, &opt, this); - size.setWidth(iconSize().width() + hframe); - if (_tabSize > 0) - size.setHeight(_tabSize); - break; + case QTabBar::TriangularEast: + if (_tabSize <= 0) + return QSize(size.width(), std::max(iconSize().width(), size.width()+2)); + return QSize(size.width(), _tabSize); + default: + if (_tabSize <= 0) + return QSize(std::max(iconSize().width(), size.height()+2), size.height()); + return QSize(_tabSize, size.height()); } - default: { - int vframe = style()->pixelMetric(QStyle::PM_TabBarTabVSpace, &opt, this); - size.setHeight(iconSize().height() + vframe); - if (_tabSize > 0) - size.setWidth(_tabSize); - }} - return size; } void WorkbenchTabBar::changeEvent(QEvent *ev) diff --git a/src/Gui/DlgGeneralImp.cpp b/src/Gui/DlgGeneralImp.cpp index e532cf0c24a4..3829dbbc671a 100644 --- a/src/Gui/DlgGeneralImp.cpp +++ b/src/Gui/DlgGeneralImp.cpp @@ -567,7 +567,13 @@ void DlgGeneralImp::attachObserver() handlers.addHandler(hGeneral, "Language", applyLanguage); handlers.addHandler(hGeneral, "SubstituteDecimal", applyDecimalPointConversion); handlers.addHandler(hGeneral, "EnableCursorBlinking", applyCursorBlinking); - handlers.addDelayedHandler(hGeneral, "ToolbarIconSize", applyToolbarIconSize); + handlers.addDelayedHandler(hGeneral, + {"ToolbarIconSize", + "StatusBarIconSize", + "MenuBarIconSize", + "WorkbenchTabIconSize", + "WorkbenchComboIconSize",}, + applyToolbarIconSize); handlers.addHandler(hGeneral, "PythonWordWrap", applyPythonWordWrap); ViewParams::init(); diff --git a/src/Gui/MainWindow.cpp b/src/Gui/MainWindow.cpp index 7ea9750268ad..28578da7d02b 100644 --- a/src/Gui/MainWindow.cpp +++ b/src/Gui/MainWindow.cpp @@ -790,7 +790,7 @@ void populateMenu(QMenu *menu, MenuType type, bool popup, !ToolBarManager::getInstance()->isDefaultMovable(), &checkbox); QObject::connect(lockAction, &QAction::toggled, cb); QObject::connect(checkbox, &QCheckBox::toggled, cb); - undockMenu = new QMenu(QObject::tr("Undock toolbars"), menu); + undockMenu = new QMenu(menu); ToolBarManager::getInstance()->populateUndockMenu(undockMenu); } else { lockAction = lockMenu->addAction(QObject::tr("Default")); diff --git a/src/Gui/ToolBarManager.cpp b/src/Gui/ToolBarManager.cpp index 33f9c36582d9..27ebe05b91f6 100644 --- a/src/Gui/ToolBarManager.cpp +++ b/src/Gui/ToolBarManager.cpp @@ -21,6 +21,7 @@ ***************************************************************************/ #include "PreCompiled.h" +#include #ifndef _PreComp_ # include # include @@ -205,9 +206,14 @@ class ToolBarArea : public QWidget { using inherited = QWidget; public: - ToolBarArea(QWidget *parent, QTimer *timer = nullptr) + ToolBarArea(QWidget *parent, + ParameterGrp::handle hParam, + boost::signals2::scoped_connection &conn, + QTimer *timer = nullptr) : QWidget(parent) , _sizingTimer(timer) + , _hParam(hParam) + , _conn(conn) { _layout = new QHBoxLayout(this); _layout->setMargin(0); @@ -218,6 +224,11 @@ class ToolBarArea : public QWidget if (_layout->indexOf(w) < 0) { _layout->addWidget(w); adjustParentSize(); + QString name = w->objectName(); + if (!name.isEmpty()) { + Base::ConnectionBlocker block(_conn); + _hParam->SetInt(w->objectName().toUtf8().constData(), _layout->count()-1); + } } } @@ -230,6 +241,7 @@ class ToolBarArea : public QWidget _layout->removeWidget(w); _layout->insertWidget(idx, w); adjustParentSize(); + saveState(); } void adjustParentSize() @@ -243,6 +255,11 @@ class ToolBarArea : public QWidget { _layout->removeWidget(w); adjustParentSize(); + QString name = w->objectName(); + if (!name.isEmpty()) { + Base::ConnectionBlocker block(_conn); + _hParam->RemoveInt(name.toUtf8().constData()); + } } QWidget *widgetAt(int index) const @@ -273,18 +290,18 @@ class ToolBarArea : public QWidget } } - void saveState(ParameterGrp::handle hParam) + void saveState() { - for (auto &v : hParam->GetIntMap()) { - hParam->RemoveInt(v.first.c_str()); + Base::ConnectionBlocker block(_conn); + for (auto &v : _hParam->GetIntMap()) { + _hParam->RemoveInt(v.first.c_str()); } - foreachToolBar([hParam](QToolBar *toolbar, int idx, ToolBarArea*) { - hParam->SetInt(toolbar->objectName().toUtf8().constData(), idx); + foreachToolBar([this](QToolBar *toolbar, int idx, ToolBarArea*) { + _hParam->SetInt(toolbar->objectName().toUtf8().constData(), idx); }); }; - void restoreState(const std::map &toolbars, - ParameterGrp::handle hParam) + void restoreState(const std::map &toolbars) { for (auto &v : toolbars) { bool vis = v.second->isVisible(); @@ -294,7 +311,7 @@ class ToolBarArea : public QWidget ToolBarManager::getInstance()->setToolBarVisible(v.second, vis); } - for (auto &v : hParam->GetBoolMap()) { + for (auto &v : _hParam->GetBoolMap()) { auto w = findChild(QString::fromUtf8(v.first.c_str())); if (w) w->setVisible(v.second); @@ -304,15 +321,37 @@ class ToolBarArea : public QWidget private: QHBoxLayout *_layout; QPointer _sizingTimer; + ParameterGrp::handle _hParam; + boost::signals2::scoped_connection &_conn; }; } // namespace Gui ToolBarManager::ToolBarManager() { + hGeneral = App::GetApplication().GetUserParameter().GetGroup( + "BaseApp/Preferences/General"); + + hGlobal = App::GetApplication().GetUserParameter().GetGroup( + "BaseApp/Workbench/Global/ToolBar"); + getGlobalToolBarNames(); + + hStatusBar = App::GetApplication().GetUserParameter().GetGroup( + "BaseApp/MainWindow/StatusBar"); + + hMenuBarRight = App::GetApplication().GetUserParameter().GetGroup( + "BaseApp/MainWindow/MenuBarRight"); + hMenuBarLeft = App::GetApplication().GetUserParameter().GetGroup( + "BaseApp/MainWindow/MenuBarLeft"); + + hPref = App::GetApplication().GetUserParameter().GetGroup( + "BaseApp/MainWindow/ToolBars"); + + hMovable = hPref->GetGroup("Movable"); + if (auto sb = getMainWindow()->statusBar()) { sb->installEventFilter(this); - statusBarArea = new ToolBarArea(sb); + statusBarArea = new ToolBarArea(sb, hStatusBar, connParam); statusBarArea->setObjectName(QStringLiteral("StatusBarArea")); sb->insertPermanentWidget(2, statusBarArea); statusBarArea->show(); @@ -320,11 +359,11 @@ ToolBarManager::ToolBarManager() if (auto mb = getMainWindow()->menuBar()) { mb->installEventFilter(this); - menuBarLeftArea = new ToolBarArea(mb, &menuBarTimer); + menuBarLeftArea = new ToolBarArea(mb, hMenuBarLeft, connParam, &menuBarTimer); menuBarLeftArea->setObjectName(QStringLiteral("MenuBarLeftArea")); mb->setCornerWidget(menuBarLeftArea, Qt::TopLeftCorner); menuBarLeftArea->show(); - menuBarRightArea = new ToolBarArea(mb, &menuBarTimer); + menuBarRightArea = new ToolBarArea(mb, hMenuBarRight, connParam, &menuBarTimer); menuBarRightArea->setObjectName(QStringLiteral("MenuBarRightArea")); mb->setCornerWidget(menuBarRightArea, Qt::TopRightCorner); menuBarRightArea->show(); @@ -347,26 +386,6 @@ ToolBarManager::ToolBarManager() else if (defarea == "Right") globalArea = Qt::RightToolBarArea; - hGeneral = App::GetApplication().GetUserParameter().GetGroup( - "BaseApp/Preferences/General"); - - hGlobal = App::GetApplication().GetUserParameter().GetGroup( - "BaseApp/Workbench/Global/ToolBar"); - getGlobalToolBarNames(); - - hStatusBar = App::GetApplication().GetUserParameter().GetGroup( - "BaseApp/MainWindow/StatusBar"); - - hMenuBarRight = App::GetApplication().GetUserParameter().GetGroup( - "BaseApp/MainWindow/MenuBarRight"); - hMenuBarLeft = App::GetApplication().GetUserParameter().GetGroup( - "BaseApp/MainWindow/MenuBarLeft"); - - hPref = App::GetApplication().GetUserParameter().GetGroup( - "BaseApp/MainWindow/ToolBars"); - - hMovable = hPref->GetGroup("Movable"); - auto refreshParams = [this](const char *name) { if (!name || boost::equals(name, "ToolbarIconSize")) _toolBarIconSize = hGeneral->GetInt("ToolbarIconSize", 24); @@ -393,8 +412,9 @@ ToolBarManager::ToolBarManager() || Param == hMenuBarLeft || (Param == hMainWindow && Name - && boost::equals(Name, "DefaultToolBarArea"))) + && boost::equals(Name, "DefaultToolBarArea"))) { timer.start(100); + } else if (Param == hGlobal) getGlobalToolBarNames(); }); @@ -480,8 +500,8 @@ int ToolBarManager::toolBarIconSize(QWidget *widget) const void ToolBarManager::setToolBarIconSize(QToolBar *toolbar) { - QSize iconSize = actionsIconSize(toolbar->actions(), toolbar); - toolbar->setIconSize(iconSize); + int s = getInstance()->toolBarIconSize(toolbar); + toolbar->setIconSize(QSize(s, s)); } void ToolBarManager::getGlobalToolBarNames() @@ -660,9 +680,9 @@ void ToolBarManager::onTimer() mw->saveWindowSettings(true); } - statusBarArea->restoreState(sbToolBars, hStatusBar); - menuBarRightArea->restoreState(mbRightToolBars, hMenuBarRight); - menuBarLeftArea->restoreState(mbLeftToolBars, hMenuBarLeft); + statusBarArea->restoreState(sbToolBars); + menuBarRightArea->restoreState(mbRightToolBars); + menuBarLeftArea->restoreState(mbLeftToolBars); } QToolBar *ToolBarManager::createToolBar(const QString &name) @@ -908,11 +928,7 @@ void ToolBarManager::setup(ToolBarItem* item, QToolBar* toolbar) const void ToolBarManager::saveState() const { - Base::ConnectionBlocker block(const_cast(this)->connParam); - - statusBarArea->saveState(hStatusBar); - menuBarRightArea->saveState(hMenuBarRight); - menuBarLeftArea->saveState(hMenuBarLeft); + // Base::ConnectionBlocker block(const_cast(this)->connParam); // ToolBar visibility is now synced using Qt signals } @@ -956,9 +972,9 @@ void ToolBarManager::restoreState() } } - statusBarArea->restoreState(sbToolBars, hStatusBar); - menuBarRightArea->restoreState(mbRightToolBars, hMenuBarRight); - menuBarLeftArea->restoreState(mbLeftToolBars, hMenuBarLeft); + statusBarArea->restoreState(sbToolBars); + menuBarRightArea->restoreState(mbRightToolBars); + menuBarLeftArea->restoreState(mbLeftToolBars); restored = true; } @@ -1234,6 +1250,7 @@ bool ToolBarManager::addToolBarToArea(QObject *o, QMouseEvent *ev) void ToolBarManager::populateUndockMenu(QMenu *menu, ToolBarArea *area) { + menu->setTitle(tr("Undock toolbars")); auto tooltip = QObject::tr("Undock from status bar"); auto addMenuUndockItem = [&](QToolBar *toolbar, int, ToolBarArea *area) { auto *action = toolbar->toggleViewAction(); @@ -1248,6 +1265,7 @@ void ToolBarManager::populateUndockMenu(QMenu *menu, ToolBarArea *area) if (checked) { QSignalBlocker blocker(toolbar); area->addWidget(toolbar); + setToolBarVisible(toolbar, true); } else if (toolbar->parentWidget() == getMainWindow()) return; else { @@ -1280,7 +1298,7 @@ void ToolBarManager::populateUndockMenu(QMenu *menu, ToolBarArea *area) bool ToolBarManager::showContextMenu(QObject *source) { QMenu menu; - QMenu menuUndock(tr("Undock toolbars")); + QMenu menuUndock; QHBoxLayout *layout = nullptr; ToolBarArea *area; if (getMainWindow()->statusBar() == source) {