diff --git a/cockatrice/src/sequenceEdit/sequenceedit.cpp b/cockatrice/src/sequenceEdit/sequenceedit.cpp index 0686694d..3553870d 100644 --- a/cockatrice/src/sequenceEdit/sequenceedit.cpp +++ b/cockatrice/src/sequenceEdit/sequenceedit.cpp @@ -139,19 +139,23 @@ int SequenceEdit::translateModifiers(Qt::KeyboardModifiers state, const QString void SequenceEdit::finishShortcut() { - QKeySequence secuence(keys); - if (!secuence.isEmpty() && valid) { - QString secuenceString = secuence.toString(); - if (settingsCache->shortcuts().isValid(shorcutName, secuenceString)) { - if (!lineEdit->text().isEmpty()) { - if (lineEdit->text().contains(secuenceString)) { - return; + QKeySequence sequence(keys); + if (!sequence.isEmpty() && valid) { + QString sequenceString = sequence.toString(); + if (settingsCache->shortcuts().isKeyAllowed(shorcutName, sequenceString)) { + if (settingsCache->shortcuts().isValid(shorcutName, sequenceString)) { + if (!lineEdit->text().isEmpty()) { + if (lineEdit->text().contains(sequenceString)) { + return; + } + lineEdit->setText(lineEdit->text() + ";"); } - lineEdit->setText(lineEdit->text() + ";"); + lineEdit->setText(lineEdit->text() + sequenceString); + } else { + QToolTip::showText(lineEdit->mapToGlobal(QPoint()), tr("Shortcut already in use")); } - lineEdit->setText(lineEdit->text() + secuenceString); } else { - QToolTip::showText(lineEdit->mapToGlobal(QPoint()), tr("Shortcut already in use")); + QToolTip::showText(lineEdit->mapToGlobal(QPoint()), tr("Invalid key")); } } diff --git a/cockatrice/src/shortcutssettings.cpp b/cockatrice/src/shortcutssettings.cpp index 36d1986f..8a26f6f5 100644 --- a/cockatrice/src/shortcutssettings.cpp +++ b/cockatrice/src/shortcutssettings.cpp @@ -1,5 +1,6 @@ #include "shortcutssettings.h" #include +#include #include #include @@ -18,13 +19,39 @@ ShortcutsSettings::ShortcutsSettings(QString settingsPath, QObject *parent) : QO shortCutsFile.beginGroup("Custom"); const QStringList customKeys = shortCutsFile.allKeys(); + QMap invalidItems; for (QStringList::const_iterator it = customKeys.constBegin(); it != customKeys.constEnd(); ++it) { QString stringSequence = shortCutsFile.value(*it).toString(); - QList SequenceList = parseSequenceString(stringSequence); - shortCuts.insert(*it, SequenceList); + // check whether shortcut is forbidden + if (isKeyAllowed(*it, stringSequence)) { + QList SequenceList = parseSequenceString(stringSequence); + shortCuts.insert(*it, SequenceList); + } else { + invalidItems.insert(*it, stringSequence); + } } shortCutsFile.endGroup(); + + if (!invalidItems.isEmpty()) { + // warning message in case of invalid items + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Warning); + msgBox.setText(tr("Your configuration file contained invalid shortcuts.\n" + "Please check your shortcut settings!")); + QString detailedMessage = tr("The following shortcuts have been set to default:\n"); + for (QMap::const_iterator item = invalidItems.constBegin(); + item != invalidItems.constEnd(); ++item) { + detailedMessage += item.key() + " - \"" + item.value() + "\"\n"; + } + msgBox.setDetailedText(detailedMessage); + msgBox.exec(); + + // set default shortcut where stored value was invalid + for (const QString &key : invalidItems.keys()) { + setShortcuts(key, getDefaultShortcutString(key)); + } + } } } @@ -98,21 +125,47 @@ void ShortcutsSettings::setShortcuts(QString name, QString Sequences) setShortcuts(std::move(name), parseSequenceString(std::move(Sequences))); } +bool ShortcutsSettings::isKeyAllowed(QString name, QString Sequences) +{ + // if the shortcut is not to be used in deck-editor then it doesn't matter + if (name.startsWith("Player")) { + return true; + } + QString checkSequence = Sequences.split(";").last(); + QStringList forbiddenKeys = (QStringList() << "Del" + << "Backspace" + << "Down" + << "Up" + << "Left" + << "Right" + << "Return" + << "Enter" + << "Menu" + << "Ctrl+Alt+-" + << "Ctrl+Alt+=" + << "Ctrl+Alt+[" + << "Ctrl+Alt+]" + << "Tab" + << "Space" + << "S"); + if (forbiddenKeys.contains(checkSequence)) { + return false; + } + return true; +} + bool ShortcutsSettings::isValid(QString name, QString Sequences) { - QString checkKey = name.left(name.indexOf("/")); - QString checkSequence = Sequences.split(";").last(); + QString checkKey = name.left(name.indexOf("/")); QList allKeys = shortCuts.keys(); for (const auto &key : allKeys) { if (key.startsWith(checkKey) || key.startsWith("MainWindow") || checkKey.startsWith("MainWindow")) { QString storedSequence = stringifySequence(shortCuts.value(key)); QStringList stringSequences = storedSequence.split(";"); - for (int j = 0; j < stringSequences.size(); j++) { - if (checkSequence == stringSequences.at(j)) { - return false; - } + if (stringSequences.contains(checkSequence)) { + return false; } } } @@ -162,7 +215,7 @@ void ShortcutsSettings::fillDefaultShorcuts() defaultShortCuts["TabDeckEditor/aNewDeck"] = parseSequenceString("Ctrl+N"); defaultShortCuts["TabDeckEditor/aOpenCustomFolder"] = parseSequenceString(""); defaultShortCuts["TabDeckEditor/aPrintDeck"] = parseSequenceString("Ctrl+P"); - defaultShortCuts["TabDeckEditor/aRemoveCard"] = parseSequenceString("Del"); + defaultShortCuts["TabDeckEditor/aRemoveCard"] = parseSequenceString(""); defaultShortCuts["TabDeckEditor/aResetLayout"] = parseSequenceString(""); defaultShortCuts["TabDeckEditor/aSaveDeck"] = parseSequenceString("Ctrl+S"); defaultShortCuts["TabDeckEditor/aSaveDeckAs"] = parseSequenceString(""); diff --git a/cockatrice/src/shortcutssettings.h b/cockatrice/src/shortcutssettings.h index febaa1d5..6d799448 100644 --- a/cockatrice/src/shortcutssettings.h +++ b/cockatrice/src/shortcutssettings.h @@ -22,6 +22,7 @@ public: void setShortcuts(QString name, QKeySequence Sequence); void setShortcuts(QString name, QString Sequences); + bool isKeyAllowed(QString name, QString Sequences); bool isValid(QString name, QString Sequences); void resetAllShortcuts();