Skip to content

Commit 8b2e3b6

Browse files
committed
#3619 shortcuts: don't show actions that appear in multiple menus in the settings
Signed-off-by: Patrizio Bekerle <patrizio@bekerle.com>
1 parent 26c179a commit 8b2e3b6

3 files changed

Lines changed: 32 additions & 35 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
- Fixed custom shortcuts for actions that appear in multiple menus, such as
66
**Find text in notes**, being treated as their default shortcut in the
77
**Shortcuts** settings page; shortcut initialization now processes each
8-
action only once so restored custom shortcuts no longer overwrite the stored
9-
default shortcut used for visual marking and reset handling
8+
action only once and the **Shortcuts** settings page only shows one row per
9+
action, so restored custom shortcuts no longer overwrite the stored default
10+
shortcut used for visual marking and reset handling
1011
(for [#3619](https://github.com/pbek/QOwnNotes/issues/3619))
1112
- Fixed a possible crash when changing **Icons** checkboxes in the **Color modes**
1213
settings by avoiding unnecessary web application client restarts for unrelated

src/dialogs/settingsdialog.cpp

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ void SettingsDialog::loadShortcutSettings() {
459459
ui->shortcutLoadingProgressBar->setVisible(true);
460460

461461
int menuIndex = 0;
462+
QSet<QString> processedActionObjectNames;
462463

463464
// loop through all top-level menus and build the tree recursively
464465
for (const QMenu *menu : menus) {
@@ -471,7 +472,7 @@ void SettingsDialog::loadShortcutSettings() {
471472

472473
buildShortcutTreeForMenu(menu, nullptr, settings, shortcutButtonActiveColor,
473474
shortcutButtonInactiveColor, disableShortcutButtonIcon,
474-
clearButtonIcon, disabledMenuNames);
475+
clearButtonIcon, disabledMenuNames, processedActionObjectNames);
475476
}
476477

477478
ui->shortcutLoadingProgressBar->setVisible(false);
@@ -493,30 +494,11 @@ void SettingsDialog::loadShortcutSettings() {
493494
* @param clearButtonIcon Icon for the clear button
494495
* @param disabledMenuNames List of menu object names to skip
495496
*/
496-
void SettingsDialog::buildShortcutTreeForMenu(const QMenu *menu, QTreeWidgetItem *parentItem,
497-
SettingsService &settings,
498-
const QColor &shortcutButtonActiveColor,
499-
const QColor &shortcutButtonInactiveColor,
500-
const QIcon &disableShortcutButtonIcon,
501-
const QIcon &clearButtonIcon,
502-
const QStringList &disabledMenuNames) {
503-
// Count eligible actions first to decide whether to add this menu at all
504-
int actionCount = 0;
505-
506-
foreach (QAction *action, menu->actions()) {
507-
if (action->menu() != nullptr) {
508-
if (!disabledMenuNames.contains(action->menu()->objectName())) {
509-
actionCount++;
510-
}
511-
} else if (!action->objectName().isEmpty()) {
512-
actionCount++;
513-
}
514-
}
515-
516-
if (actionCount == 0) {
517-
return;
518-
}
519-
497+
void SettingsDialog::buildShortcutTreeForMenu(
498+
const QMenu *menu, QTreeWidgetItem *parentItem, SettingsService &settings,
499+
const QColor &shortcutButtonActiveColor, const QColor &shortcutButtonInactiveColor,
500+
const QIcon &disableShortcutButtonIcon, const QIcon &clearButtonIcon,
501+
const QStringList &disabledMenuNames, QSet<QString> &processedActionObjectNames) {
520502
// Add the menu item to the tree before populating children so that
521503
// setItemWidget() works correctly (items must be in the tree first)
522504
auto *menuItem = new QTreeWidgetItem();
@@ -543,7 +525,8 @@ void SettingsDialog::buildShortcutTreeForMenu(const QMenu *menu, QTreeWidgetItem
543525

544526
buildShortcutTreeForMenu(subMenu, menuItem, settings, shortcutButtonActiveColor,
545527
shortcutButtonInactiveColor, disableShortcutButtonIcon,
546-
clearButtonIcon, disabledMenuNames);
528+
clearButtonIcon, disabledMenuNames,
529+
processedActionObjectNames);
547530
continue;
548531
}
549532

@@ -554,6 +537,11 @@ void SettingsDialog::buildShortcutTreeForMenu(const QMenu *menu, QTreeWidgetItem
554537
continue;
555538
}
556539

540+
if (processedActionObjectNames.contains(actionObjectName)) {
541+
continue;
542+
}
543+
processedActionObjectNames.insert(actionObjectName);
544+
557545
// create the tree widget item
558546
auto *actionItem = new QTreeWidgetItem();
559547
actionItem->setText(0, action->text().remove(QStringLiteral("&")));
@@ -677,6 +665,16 @@ void SettingsDialog::buildShortcutTreeForMenu(const QMenu *menu, QTreeWidgetItem
677665

678666
ui->shortcutTreeWidget->setItemWidget(actionItem, 2, globalShortcutKeyWidget);
679667
}
668+
669+
if (menuItem->childCount() == 0) {
670+
if (parentItem == nullptr) {
671+
const int index = ui->shortcutTreeWidget->indexOfTopLevelItem(menuItem);
672+
delete ui->shortcutTreeWidget->takeTopLevelItem(index);
673+
} else {
674+
parentItem->removeChild(menuItem);
675+
delete menuItem;
676+
}
677+
}
680678
}
681679

682680
/**

src/dialogs/settingsdialog.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,11 @@ class SettingsDialog : public MasterDialog {
152152

153153
void loadShortcutSettings();
154154

155-
void buildShortcutTreeForMenu(const QMenu *menu, QTreeWidgetItem *parentItem,
156-
SettingsService &settings,
157-
const QColor &shortcutButtonActiveColor,
158-
const QColor &shortcutButtonInactiveColor,
159-
const QIcon &disableShortcutButtonIcon,
160-
const QIcon &clearButtonIcon,
161-
const QStringList &disabledMenuNames);
155+
void buildShortcutTreeForMenu(
156+
const QMenu *menu, QTreeWidgetItem *parentItem, SettingsService &settings,
157+
const QColor &shortcutButtonActiveColor, const QColor &shortcutButtonInactiveColor,
158+
const QIcon &disableShortcutButtonIcon, const QIcon &clearButtonIcon,
159+
const QStringList &disabledMenuNames, QSet<QString> &processedActionObjectNames);
162160

163161
void storeShortcutSettings();
164162

0 commit comments

Comments
 (0)