Gui: Reuse QActions for workbench activation

This fixes segfault that can occour due to keeping reference to QAction
that is supposed to change workbench.
This commit is contained in:
Kacper Donat
2024-05-05 16:55:55 +02:00
parent 33c6b04461
commit 52560ce650
2 changed files with 31 additions and 9 deletions

View File

@@ -627,6 +627,14 @@ WorkbenchGroup::WorkbenchGroup ( Command* pcCmd, QObject * parent )
this, &WorkbenchGroup::onWorkbenchActivated);
}
QAction* WorkbenchGroup::getOrCreateAction(const QString& wbName) {
if (!actionByWorkbenchName.contains(wbName)) {
actionByWorkbenchName[wbName] = new QAction;
}
return actionByWorkbenchName[wbName];
}
void WorkbenchGroup::addTo(QWidget *widget)
{
if (widget->inherits("QToolBar")) {
@@ -657,13 +665,13 @@ void WorkbenchGroup::addTo(QWidget *widget)
void WorkbenchGroup::refreshWorkbenchList()
{
QStringList enabled_wbs_list = DlgSettingsWorkbenchesImp::getEnabledWorkbenches();
QStringList enabledWbNames = DlgSettingsWorkbenchesImp::getEnabledWorkbenches();
// Clear the actions.
for (QAction* action : actions()) {
groupAction()->removeAction(action);
delete action;
}
enabledWbsActions.clear();
disabledWbsActions.clear();
@@ -671,12 +679,16 @@ void WorkbenchGroup::refreshWorkbenchList()
// Create action list of enabled wb
int index = 0;
for (const auto& wbName : enabled_wbs_list) {
for (const auto& wbName : enabledWbNames) {
QString name = Application::Instance->workbenchMenuText(wbName);
QPixmap px = Application::Instance->workbenchIcon(wbName);
QString tip = Application::Instance->workbenchToolTip(wbName);
QAction* action = groupAction()->addAction(name);
QAction* action = getOrCreateAction(wbName);
groupAction()->addAction(action);
action->setText(name);
action->setCheckable(true);
action->setData(QVariant(index)); // set the index
action->setObjectName(wbName);
@@ -694,13 +706,17 @@ void WorkbenchGroup::refreshWorkbenchList()
}
// Also create action list of disabled wbs
QStringList disabled_wbs_list = DlgSettingsWorkbenchesImp::getDisabledWorkbenches();
for (const auto& wbName : disabled_wbs_list) {
QStringList disabledWbNames = DlgSettingsWorkbenchesImp::getDisabledWorkbenches();
for (const auto& wbName : disabledWbNames) {
QString name = Application::Instance->workbenchMenuText(wbName);
QPixmap px = Application::Instance->workbenchIcon(wbName);
QString tip = Application::Instance->workbenchToolTip(wbName);
QAction* action = groupAction()->addAction(name);
QAction* action = getOrCreateAction(wbName);
groupAction()->addAction(action);
action->setText(name);
action->setCheckable(true);
action->setData(QVariant(index)); // set the index
action->setObjectName(wbName);