Skip to content

Commit

Permalink
Gui: fix toolbar state saving
Browse files Browse the repository at this point in the history
  • Loading branch information
realthunder committed Apr 30, 2024
1 parent 205b37d commit 2ce4543
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 65 deletions.
24 changes: 8 additions & 16 deletions src/Gui/Action.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
8 changes: 7 additions & 1 deletion src/Gui/DlgGeneralImp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion src/Gui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
Expand Down
112 changes: 65 additions & 47 deletions src/Gui/ToolBarManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
***************************************************************************/

#include "PreCompiled.h"
#include <boost/signals2/connection.hpp>
#ifndef _PreComp_
# include <QAction>
# include <QApplication>
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
}
}

Expand All @@ -230,6 +241,7 @@ class ToolBarArea : public QWidget
_layout->removeWidget(w);
_layout->insertWidget(idx, w);
adjustParentSize();
saveState();
}

void adjustParentSize()
Expand All @@ -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
Expand Down Expand Up @@ -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<int, QToolBar*> &toolbars,
ParameterGrp::handle hParam)
void restoreState(const std::map<int, QToolBar*> &toolbars)
{
for (auto &v : toolbars) {
bool vis = v.second->isVisible();
Expand All @@ -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<QWidget*>(QString::fromUtf8(v.first.c_str()));
if (w)
w->setVisible(v.second);
Expand All @@ -304,27 +321,49 @@ class ToolBarArea : public QWidget
private:
QHBoxLayout *_layout;
QPointer<QTimer> _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();
}

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();
Expand All @@ -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);
Expand All @@ -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();
});
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -908,11 +928,7 @@ void ToolBarManager::setup(ToolBarItem* item, QToolBar* toolbar) const

void ToolBarManager::saveState() const
{
Base::ConnectionBlocker block(const_cast<ToolBarManager*>(this)->connParam);

statusBarArea->saveState(hStatusBar);
menuBarRightArea->saveState(hMenuBarRight);
menuBarLeftArea->saveState(hMenuBarLeft);
// Base::ConnectionBlocker block(const_cast<ToolBarManager*>(this)->connParam);

// ToolBar visibility is now synced using Qt signals
}
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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();
Expand All @@ -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 {
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 2ce4543

Please sign in to comment.