feat: check conflict shortcuts before saving

This commit is contained in:
Gary Wang 2024-11-03 00:46:21 +08:00
parent d0bdc71cf5
commit 8cce48e6b0
No known key found for this signature in database
GPG Key ID: 5D30A4F15EA78760
4 changed files with 27 additions and 12 deletions

View File

@ -133,23 +133,31 @@ void Settings::applyUserShortcuts(QWidget *widget)
bool Settings::setShortcutsForAction(QWidget *widget, const QString &objectName,
QList<QKeySequence> shortcuts, bool writeConfig)
{
bool result = false;
QAction * targetAction = nullptr;
for (QAction * action : widget->actions()) {
if (action->objectName() == objectName) {
action->setShortcuts(shortcuts);
result = true;
break;
targetAction = action;
} else {
for (const QKeySequence & shortcut : std::as_const(shortcuts)) {
if (action->shortcuts().contains(shortcut)) {
return false;
}
}
}
}
if (result && writeConfig) {
if (targetAction) {
targetAction->setShortcuts(shortcuts);
}
if (targetAction && writeConfig) {
m_qsettings->beginGroup("shortcuts");
m_qsettings->setValue(objectName, QVariant::fromValue(shortcuts));
m_qsettings->endGroup();
m_qsettings->sync();
}
return result;
return true;
}
#if defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)

View File

@ -15,6 +15,7 @@
#include <QScrollArea>
#include <QSplitter>
#include <QStringListModel>
#include <QMessageBox>
SettingsDialog::SettingsDialog(QWidget *parent)
: QDialog(parent)
@ -60,9 +61,14 @@ SettingsDialog::SettingsDialog(QWidget *parent)
shortcutEditorSplitter->setSizes({shortcutEditorSplitter->height(), 1});
oldEditor->deleteLater();
});
connect(shortcutEdit, &ShortcutEdit::shortcutsChanged, this, [=](){
Settings::instance()->setShortcutsForAction(parent, shortcutEdit->objectName().mid(9),
shortcutEdit->shortcuts());
connect(shortcutEdit, &ShortcutEdit::applyShortcutsRequested, this, [=](QList<QKeySequence> newShortcuts){
bool succ = Settings::instance()->setShortcutsForAction(parent, shortcutEdit->objectName().mid(9),
newShortcuts);
if (!succ) {
QMessageBox::warning(this, tr("Failed to set shortcuts"),
tr("Please check if shortcuts are duplicated with existing shortcuts."));
}
shortcutEdit->setShortcuts(action->shortcuts());
});
}

View File

@ -33,6 +33,7 @@ ShortcutEditor::ShortcutEditor(ShortcutEdit * shortcutEdit, QWidget * parent)
reloadShortcuts();
}
});
connect(shortcutEdit, &ShortcutEdit::shortcutsChanged, this, &ShortcutEditor::reloadShortcuts);
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
@ -81,12 +82,11 @@ void ShortcutEditor::applyShortcuts()
{
QList<QKeySequence> shortcuts;
for (const QKeySequenceEdit * keyseqEdit : m_keySequenceEdits) {
if (!keyseqEdit->keySequence().isEmpty()) {
if (!keyseqEdit->keySequence().isEmpty() && !shortcuts.contains(keyseqEdit->keySequence())) {
shortcuts.append(keyseqEdit->keySequence());
}
}
m_shortcutEdit->setShortcuts(shortcuts);
reloadShortcuts();
emit m_shortcutEdit->applyShortcutsRequested(shortcuts);
}
// ----------------------------------------

View File

@ -46,6 +46,7 @@ public:
signals:
void shortcutsChanged();
void editButtonClicked();
void applyShortcutsRequested(QList<QKeySequence> newShortcuts);
private:
QList<QKeySequence> m_shortcuts;