Fix Shortcuts Editor displaying duplicate shortcut prompt repeatedly

This commit is contained in:
GriffinR
2025-08-05 22:59:39 -04:00
parent b8c9fb8ccb
commit 301666e5bd
2 changed files with 19 additions and 20 deletions

View File

@@ -49,7 +49,6 @@ private:
void addNewMultiKeyEdit(const QObject *object, const QString &shortcutContext);
QList<MultiKeyEdit *> siblings(MultiKeyEdit *multiKeyEdit) const;
void promptUserOnDuplicateFound(MultiKeyEdit *current, MultiKeyEdit *sender);
void removeKeySequence(const QKeySequence &keySequence, MultiKeyEdit *multiKeyEdit);
void saveShortcuts();
void resetShortcuts();

View File

@@ -184,9 +184,12 @@ void ShortcutsEditor::checkForDuplicates(const QKeySequence &keySequence) {
if (!sender_multiKeyEdit)
return;
for (auto *sibling_multiKeyEdit : siblings(sender_multiKeyEdit))
if (sibling_multiKeyEdit->contains(keySequence))
for (auto *sibling_multiKeyEdit : siblings(sender_multiKeyEdit)) {
if (sibling_multiKeyEdit->contains(keySequence)) {
promptUserOnDuplicateFound(sender_multiKeyEdit, sibling_multiKeyEdit);
break;
}
}
}
QList<MultiKeyEdit *> ShortcutsEditor::siblings(MultiKeyEdit *multiKeyEdit) const {
@@ -200,25 +203,22 @@ void ShortcutsEditor::promptUserOnDuplicateFound(MultiKeyEdit *sender, MultiKeyE
const auto siblingLabel = this->labels_objects.key(multiKeyEdits_objects.value(sibling));
if (siblingLabel.isEmpty())
return;
const auto message = QString(
"Shortcut '%1' is already used by '%2', would you like to replace it?")
.arg(duplicateKeySequence.toString()).arg(siblingLabel);
const auto message = QString("Shortcut '%1' is already used by '%2', would you like to replace it?")
.arg(duplicateKeySequence.toString())
.arg(siblingLabel);
const auto result = QMessageBox::question(
this, QApplication::applicationName(), message, QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
// QKeySequenceEdits::keySequenceChange fires when editing finishes on a QKeySequenceEdit,
// even if no change occurs. Displaying our question prompt will cause the edit to lose focus
// and fire another signal, which would cause another "duplicate shortcut" prompt to appear.
// For this reason we need to block their signals before the message is displayed.
const QSignalBlocker b_Sender(sender);
const QSignalBlocker b_Sibling(sibling);
if (result == QMessageBox::Yes)
removeKeySequence(duplicateKeySequence, sibling);
else
removeKeySequence(duplicateKeySequence, sender);
activateWindow();
}
void ShortcutsEditor::removeKeySequence(const QKeySequence &keySequence, MultiKeyEdit *multiKeyEdit) {
multiKeyEdit->blockSignals(true);
multiKeyEdit->removeOne(keySequence);
multiKeyEdit->blockSignals(false);
if (QuestionMessage::show(message, this) == QMessageBox::Yes) {
sibling->removeOne(duplicateKeySequence);
} else {
sender->removeOne(duplicateKeySequence);
}
}
void ShortcutsEditor::dialogButtonClicked(QAbstractButton *button) {