Shortcuts preference pane (#3641)

* Shortcuts preference pane

* Honor and glory to the hypnoclangifier

* clanfigy: exclude deleted files from being checked

* keep the olf translation context to be able to reuse old translations

* Fix gcc; extract translations

* Moved generic buttons after the groupbox

* Update current item on "clear/reset all"

* Sequenceedit: make buttons larger and translatable, add text

* Event filter

* Don't filter arrow keys; added placeholder text

* group counters
This commit is contained in:
ctrlaltca 2019-03-10 21:49:33 +01:00 committed by GitHub
parent 11b2942d09
commit 389f7fdc25
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 1606 additions and 3123 deletions

View file

@ -162,7 +162,7 @@ if [[ $branch ]]; then
for ex in ${exts[@]}; do
reg+=(${include[@]/%/.*\\.$ex\$})
done
names=$(git diff --name-only $base | grep ${reg[@]/#/-e ^})
names=$(git diff --diff-filter=d --name-only $base | grep ${reg[@]/#/-e ^})
else
names=$(find ${include[@]} -type f -false ${exts[@]/#/-o -name *\\.})
fi

View file

@ -105,7 +105,6 @@ SET(cockatrice_SOURCES
src/pictureloader.cpp
src/shortcutssettings.cpp
src/sequenceEdit/sequenceedit.cpp
src/sequenceEdit/shortcutstab.cpp
src/lineeditcompleter.cpp
src/settings/settingsmanager.cpp
src/settings/carddatabasesettings.cpp

View file

@ -2,7 +2,7 @@
#include "carddatabase.h"
#include "main.h"
#include "releasechannel.h"
#include "sequenceEdit/shortcutstab.h"
#include "sequenceEdit/sequenceedit.h"
#include "settingscache.h"
#include "soundengine.h"
#include "spoilerbackgroundupdater.h"
@ -18,6 +18,7 @@
#include <QFileDialog>
#include <QGridLayout>
#include <QGroupBox>
#include <QHeaderView>
#include <QInputDialog>
#include <QLabel>
#include <QLineEdit>
@ -30,8 +31,11 @@
#include <QStackedWidget>
#include <QToolBar>
#include <QTranslator>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#define WIKI_CUSTOM_PIC_URL "https://github.com/Cockatrice/Cockatrice/wiki/Custom-Picture-Download-URLs"
#define WIKI_CUSTOM_SHORTCUTS "https://github.com/Cockatrice/Cockatrice/wiki/Custom-Keyboard-Shortcuts"
GeneralSettingsPage::GeneralSettingsPage()
{
@ -961,6 +965,168 @@ void SoundSettingsPage::retranslateUi()
masterVolumeLabel.setText(tr("Master volume"));
}
ShortcutSettingsPage::ShortcutSettingsPage()
{
// table
shortcutsTable = new QTreeWidget();
shortcutsTable->setColumnCount(2);
shortcutsTable->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
shortcutsTable->setUniformRowHeights(true);
shortcutsTable->setAlternatingRowColors(true);
shortcutsTable->header()->resizeSection(0, shortcutsTable->width() / 3 * 2);
// edit widget
currentActionGroupLabel = new QLabel(this);
currentActionGroupName = new QLabel(this);
currentActionLabel = new QLabel(this);
currentActionName = new QLabel(this);
currentShortcutLabel = new QLabel(this);
editTextBox = new SequenceEdit("", this);
shortcutsTable->installEventFilter(editTextBox);
// buttons
faqLabel = new QLabel(this);
faqLabel->setTextInteractionFlags(Qt::LinksAccessibleByMouse);
faqLabel->setOpenExternalLinks(true);
btnResetAll = new QPushButton(this);
btnClearAll = new QPushButton(this);
btnResetAll->setIcon(QPixmap("theme:icons/update"));
btnClearAll->setIcon(QPixmap("theme:icons/clearsearch"));
// layout
auto *editLayout = new QGridLayout;
editLayout->addWidget(currentActionGroupLabel, 0, 0);
editLayout->addWidget(currentActionGroupName, 0, 1);
editLayout->addWidget(currentActionLabel, 1, 0);
editLayout->addWidget(currentActionName, 1, 1);
editLayout->addWidget(currentShortcutLabel, 2, 0);
editLayout->addWidget(editTextBox, 2, 1);
editShortcutGroupBox = new QGroupBox;
editShortcutGroupBox->setLayout(editLayout);
auto *buttonsLayout = new QHBoxLayout;
buttonsLayout->addWidget(faqLabel);
buttonsLayout->addWidget(btnResetAll);
buttonsLayout->addWidget(btnClearAll);
auto *mainLayout = new QVBoxLayout;
mainLayout->addWidget(shortcutsTable);
mainLayout->addWidget(editShortcutGroupBox);
mainLayout->addLayout(buttonsLayout);
setLayout(mainLayout);
connect(btnResetAll, SIGNAL(clicked()), this, SLOT(resetShortcuts()));
connect(btnClearAll, SIGNAL(clicked()), this, SLOT(clearShortcuts()));
connect(shortcutsTable, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this,
SLOT(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)));
connect(&settingsCache->shortcuts(), SIGNAL(shortCutChanged()), this, SLOT(refreshShortcuts()));
createShortcuts();
}
void ShortcutSettingsPage::currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem * /*previous */)
{
if (current == nullptr) {
currentActionGroupName->setText("");
currentActionName->setText("");
editTextBox->setShortcutName("");
} else {
QString key = current->data(2, Qt::DisplayRole).toString();
QString group = settingsCache->shortcuts().getShortcut(key).getGroupName();
QString action = settingsCache->shortcuts().getShortcut(key).getName();
currentActionGroupName->setText(group);
currentActionName->setText(action);
editTextBox->setShortcutName(key);
}
}
void ShortcutSettingsPage::resetShortcuts()
{
if (QMessageBox::question(this, tr("Restore all default shortcuts"),
tr("Do you really want to restore all default shortcuts?")) == QMessageBox::Yes) {
settingsCache->shortcuts().resetAllShortcuts();
}
}
void ShortcutSettingsPage::createShortcuts()
{
QHash<QString, QTreeWidgetItem *> parentItems;
QTreeWidgetItem *curParent = nullptr;
for (const auto &key : settingsCache->shortcuts().getAllShortcutKeys()) {
QString name = settingsCache->shortcuts().getShortcut(key).getName();
QString group = settingsCache->shortcuts().getShortcut(key).getGroupName();
QString shortcut = settingsCache->shortcuts().getShortcutString(key);
if (parentItems.contains(group)) {
curParent = parentItems.value(group);
} else {
curParent = new QTreeWidgetItem((QTreeWidget *)nullptr, QStringList({group, "", ""}));
static QFont font = curParent->font(0);
font.setBold(true);
curParent->setFont(0, font);
parentItems.insert(group, curParent);
}
new QTreeWidgetItem(curParent, QStringList({name, shortcut, key}));
}
shortcutsTable->clear();
shortcutsTable->insertTopLevelItems(0, parentItems.values());
shortcutsTable->setCurrentItem(nullptr);
shortcutsTable->expandAll();
shortcutsTable->sortItems(0, Qt::AscendingOrder);
}
void ShortcutSettingsPage::refreshShortcuts()
{
QTreeWidgetItem *curParent = nullptr;
QTreeWidgetItem *curChild = nullptr;
for (int i = 0; i < shortcutsTable->topLevelItemCount(); ++i) {
curParent = shortcutsTable->topLevelItem(i);
for (int j = 0; j < curParent->childCount(); ++j) {
curChild = curParent->child(j);
QString key = curChild->data(2, Qt::DisplayRole).toString();
QString name = settingsCache->shortcuts().getShortcut(key).getName();
QString shortcut = settingsCache->shortcuts().getShortcutString(key);
curChild->setText(0, name);
curChild->setText(1, shortcut);
if (j == 0) {
// the first child also updates the parent's group name
QString group = settingsCache->shortcuts().getShortcut(key).getGroupName();
curParent->setText(0, group);
}
}
}
shortcutsTable->sortItems(0, Qt::AscendingOrder);
currentItemChanged(shortcutsTable->currentItem(), nullptr);
}
void ShortcutSettingsPage::clearShortcuts()
{
if (QMessageBox::question(this, tr("Clear all default shortcuts"),
tr("Do you really want to clear all shortcuts?")) == QMessageBox::Yes) {
settingsCache->shortcuts().clearAllShortcuts();
}
}
void ShortcutSettingsPage::retranslateUi()
{
shortcutsTable->setHeaderLabels(QStringList() << tr("Action") << tr("Shortcut"));
refreshShortcuts();
currentActionGroupLabel->setText(tr("Section:"));
currentActionLabel->setText(tr("Action:"));
currentShortcutLabel->setText(tr("Shortcut:"));
editTextBox->retranslateUi();
faqLabel->setText(QString("<a href='%1'>%2</a>").arg(WIKI_CUSTOM_SHORTCUTS).arg(tr("How to set custom shortcuts")));
btnResetAll->setText("Restore all default shortcuts");
btnClearAll->setText("Clear all shortcuts");
}
DlgSettings::DlgSettings(QWidget *parent) : QDialog(parent)
{
QRect rec = QApplication::desktop()->availableGeometry();
@ -984,7 +1150,7 @@ DlgSettings::DlgSettings(QWidget *parent) : QDialog(parent)
pagesWidget->addWidget(new DeckEditorSettingsPage);
pagesWidget->addWidget(new MessagesSettingsPage);
pagesWidget->addWidget(new SoundSettingsPage);
pagesWidget->addWidget(new ShortcutsTab);
pagesWidget->addWidget(new ShortcutSettingsPage);
createIcons();
contentsWidget->setCurrentRow(0);

View file

@ -10,21 +10,19 @@
#include <QSpinBox>
class CardDatabase;
class QCloseEvent;
class QGridLayout;
class QHBoxLayout;
class QLineEdit;
class QListWidget;
class QListWidgetItem;
class QStackedWidget;
class QLineEdit;
class QPushButton;
class QComboBox;
class QGroupBox;
class QCheckBox;
class QLabel;
class QCloseEvent;
class QSpinBox;
class QRadioButton;
class QSpinBox;
class QSlider;
class QSpinBox;
class QStackedWidget;
class QTreeWidget;
class QTreeWidgetItem;
class QVBoxLayout;
class SequenceEdit;
class AbstractSettingsPage : public QWidget
{
@ -228,6 +226,37 @@ private slots:
void themeBoxChanged(int index);
};
class ShortcutSettingsPage : public AbstractSettingsPage
{
Q_OBJECT
public:
ShortcutSettingsPage();
void retranslateUi() override;
private:
QTreeWidget *shortcutsTable;
QVBoxLayout *mainLayout;
QHBoxLayout *buttonsLayout;
QGroupBox *editShortcutGroupBox;
QGridLayout *editLayout;
QLabel *currentActionGroupLabel;
QLabel *currentActionGroupName;
QLabel *currentActionLabel;
QLabel *currentActionName;
QLabel *currentShortcutLabel;
SequenceEdit *editTextBox;
QLabel *faqLabel;
QPushButton *btnResetAll;
QPushButton *btnClearAll;
private slots:
void resetShortcuts();
void refreshShortcuts();
void createShortcuts();
void clearShortcuts();
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
};
class DlgSettings : public QDialog
{
Q_OBJECT
@ -243,8 +272,7 @@ private:
QListWidget *contentsWidget;
QStackedWidget *pagesWidget;
QListWidgetItem *generalButton, *appearanceButton, *userInterfaceButton, *deckEditorButton, *messagesButton,
*soundButton;
QListWidgetItem *shortcutsButton;
*soundButton, *shortcutsButton;
void createIcons();
void retranslateUi();

View file

@ -5,24 +5,16 @@
#include <QToolTip>
#include <utility>
SequenceEdit::SequenceEdit(const QString &_shortcutName, QWidget *parent) : QWidget(parent), shortcutName(_shortcutName)
SequenceEdit::SequenceEdit(const QString &_shortcutName, QWidget *parent) : QWidget(parent)
{
lineEdit = new QLineEdit(this);
clearButton = new QPushButton("", this);
defaultButton = new QPushButton("", this);
lineEdit->setMinimumWidth(70);
clearButton->setMaximumWidth(lineEdit->height());
defaultButton->setMaximumWidth(lineEdit->height());
clearButton->setMaximumHeight(lineEdit->height());
defaultButton->setMaximumHeight(lineEdit->height());
clearButton->setIcon(QPixmap("theme:icons/clearsearch"));
defaultButton->setIcon(QPixmap("theme:icons/update"));
clearButton->setAttribute(Qt::WA_LayoutUsesWidgetRect);
defaultButton->setAttribute(Qt::WA_LayoutUsesWidgetRect);
auto *layout = new QHBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(1);
@ -34,7 +26,26 @@ SequenceEdit::SequenceEdit(const QString &_shortcutName, QWidget *parent) : QWid
connect(defaultButton, SIGNAL(clicked()), this, SLOT(restoreDefault()));
lineEdit->installEventFilter(this);
lineEdit->setText(settingsCache->shortcuts().getShortcutString(shortcutName));
setShortcutName(_shortcutName);
retranslateUi();
}
void SequenceEdit::setShortcutName(const QString &_shortcutName)
{
shortcutName = _shortcutName;
if (shortcutName.isEmpty()) {
clearButton->setEnabled(false);
defaultButton->setEnabled(false);
lineEdit->setEnabled(false);
lineEdit->setText("");
lineEdit->setPlaceholderText(tr("Choose an action from the table"));
} else {
clearButton->setEnabled(true);
defaultButton->setEnabled(true);
lineEdit->setEnabled(true);
lineEdit->setText(settingsCache->shortcuts().getShortcutString(shortcutName));
lineEdit->setPlaceholderText(tr("Hit the key/combination of keys you want to set for this action"));
}
}
QString SequenceEdit::getSequence()
@ -73,11 +84,23 @@ void SequenceEdit::clear()
lineEdit->setText("");
}
bool SequenceEdit::eventFilter(QObject *, QEvent *event)
bool SequenceEdit::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) {
auto *keyEvent = reinterpret_cast<QKeyEvent *>(event);
// don't filter outside arrow key events
if (obj != lineEdit) {
switch (keyEvent->key()) {
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Left:
case Qt::Key_Right:
return false;
default:
break;
}
}
if (event->type() == QEvent::KeyPress && !keyEvent->isAutoRepeat()) {
processKey(keyEvent);
} else if (event->type() == QEvent::KeyRelease && !keyEvent->isAutoRepeat()) {
@ -161,3 +184,10 @@ void SequenceEdit::updateSettings()
{
settingsCache->shortcuts().setShortcuts(shortcutName, lineEdit->text());
}
void SequenceEdit::retranslateUi()
{
clearButton->setText(tr("Clear"));
defaultButton->setText(tr("Restore default"));
setShortcutName(shortcutName);
}

View file

@ -13,8 +13,10 @@ class SequenceEdit : public QWidget
public:
SequenceEdit(const QString &_shortcutName, QWidget *parent = nullptr);
QString getSequence();
void setShortcutName(const QString &_shortcutName);
void refreshShortcut();
void clear();
void retranslateUi();
private slots:
void removeLastShortcut();

View file

@ -1,56 +0,0 @@
#include "shortcutstab.h"
#include "ui_shortcutstab.h"
#include "../settingscache.h"
#include <QMessageBox>
ShortcutsTab::ShortcutsTab() : ui(new Ui::shortcutsTab)
{
ui->setupUi(this);
connect(ui->btnResetAll, SIGNAL(clicked()), this, SLOT(resetShortcuts()));
connect(ui->btnClearAll, SIGNAL(clicked()), this, SLOT(clearShortcuts()));
connect(&settingsCache->shortcuts(), SIGNAL(allShortCutsReset()), this, SLOT(refreshEdits()));
connect(&settingsCache->shortcuts(), SIGNAL(allShortCutsClear()), this, SLOT(afterClear()));
}
void ShortcutsTab::retranslateUi()
{
ui->retranslateUi(this);
}
ShortcutsTab::~ShortcutsTab()
{
delete ui;
}
void ShortcutsTab::resetShortcuts()
{
if (QMessageBox::question(this, tr("Restore all default shortcuts"),
tr("Do you really want to restore all default shortcuts?")) == QMessageBox::Yes) {
settingsCache->shortcuts().resetAllShortcuts();
}
}
void ShortcutsTab::refreshEdits()
{
QList<SequenceEdit *> edits = this->findChildren<SequenceEdit *>();
for (auto edit : edits) {
edit->refreshShortcut();
}
}
void ShortcutsTab::clearShortcuts()
{
if (QMessageBox::question(this, tr("Clear all default shortcuts"),
tr("Do you really want to clear all shortcuts?")) == QMessageBox::Yes) {
settingsCache->shortcuts().clearAllShortcuts();
}
}
void ShortcutsTab::afterClear()
{
QList<SequenceEdit *> edits = this->findChildren<SequenceEdit *>();
for (auto edit : edits) {
edit->clear();
}
}

View file

@ -1,31 +0,0 @@
#ifndef SHORTCUTSTAB_H
#define SHORTCUTSTAB_H
#include <QWidget>
#include "../dlg_settings.h"
namespace Ui
{
class shortcutsTab;
}
class ShortcutsTab : public AbstractSettingsPage
{
Q_OBJECT
public:
ShortcutsTab();
void retranslateUi();
~ShortcutsTab();
private slots:
void resetShortcuts();
void refreshEdits();
void clearShortcuts();
void afterClear();
private:
Ui::shortcutsTab *ui;
};
#endif // SHORTCUTSTAB_H

File diff suppressed because it is too large Load diff

View file

@ -4,6 +4,11 @@
#include <QStringList>
#include <utility>
ShortcutKey::ShortcutKey(const QString &_name, QList<QKeySequence> _sequence, ShortcutGroup::Groups _group)
: QList<QKeySequence>(_sequence), name(_name), group(_group)
{
}
ShortcutsSettings::ShortcutsSettings(const QString &settingsPath, QObject *parent) : QObject(parent)
{
shortCuts = defaultShortCuts;
@ -23,8 +28,8 @@ ShortcutsSettings::ShortcutsSettings(const QString &settingsPath, QObject *paren
QString stringSequence = shortCutsFile.value(*it).toString();
// check whether shortcut is forbidden
if (isKeyAllowed(*it, stringSequence)) {
QList<QKeySequence> SequenceList = parseSequenceString(stringSequence);
shortCuts.insert(*it, SequenceList);
auto shortcut = getShortcut(*it);
shortcut.setSequence(parseSequenceString(stringSequence));
} else {
invalidItems.insert(*it, stringSequence);
}
@ -45,21 +50,16 @@ ShortcutsSettings::ShortcutsSettings(const QString &settingsPath, QObject *paren
}
msgBox.setDetailedText(detailedMessage);
msgBox.exec();
// set default shortcut where stored value was invalid
for (const QString &key : invalidItems.keys()) {
setShortcuts(key, getDefaultShortcutString(key));
}
}
}
}
QList<QKeySequence> ShortcutsSettings::getDefaultShortcut(const QString &name) const
ShortcutKey ShortcutsSettings::getDefaultShortcut(const QString &name) const
{
return defaultShortCuts.value(name, QList<QKeySequence>());
return defaultShortCuts.value(name, ShortcutKey());
}
QList<QKeySequence> ShortcutsSettings::getShortcut(const QString &name) const
ShortcutKey ShortcutsSettings::getShortcut(const QString &name) const
{
if (shortCuts.contains(name)) {
return shortCuts.value(name);
@ -105,7 +105,7 @@ QList<QKeySequence> ShortcutsSettings::parseSequenceString(const QString &string
void ShortcutsSettings::setShortcuts(const QString &name, const QList<QKeySequence> &Sequence)
{
shortCuts[name] = Sequence;
shortCuts[name].setSequence(Sequence);
QSettings shortCutsFile(settingsFilePath, QSettings::IniFormat);
shortCutsFile.beginGroup(custom);
@ -132,7 +132,6 @@ void ShortcutsSettings::resetAllShortcuts()
shortCutsFile.remove("");
shortCutsFile.endGroup();
emit shortCutChanged();
emit allShortCutsReset();
}
void ShortcutsSettings::clearAllShortcuts()
@ -140,12 +139,11 @@ void ShortcutsSettings::clearAllShortcuts()
QSettings shortCutsFile(settingsFilePath, QSettings::IniFormat);
shortCutsFile.beginGroup(custom);
for (auto it = shortCuts.begin(); it != shortCuts.end(); ++it) {
it.value() = parseSequenceString("");
it.value().setSequence(parseSequenceString(""));
shortCutsFile.setValue(it.key(), "");
}
shortCutsFile.endGroup();
emit shortCutChanged();
emit allShortCutsClear();
}
bool ShortcutsSettings::isKeyAllowed(const QString &name, const QString &Sequences) const

View file

@ -1,22 +1,115 @@
#ifndef SHORTCUTSSETTINGS_H
#define SHORTCUTSSETTINGS_H
#include <QApplication>
#include <QHash>
#include <QKeySequence>
#include <QObject>
#include <QSettings>
class ShortcutGroup
{
public:
enum Groups
{
Main_Window,
Deck_Editor,
Game_Lobby,
Card_Counters,
Player_Counters,
Power_Toughness,
Game_Phases,
Playing_Area,
Move_selected,
View,
Move_top,
Gameplay,
Drawing,
Chat_room,
Game_window,
Load_deck
};
static QString getGroupName(ShortcutGroup::Groups group)
{
switch (group) {
case Main_Window:
return QApplication::translate("shortcutsTab", "Main Window");
case Deck_Editor:
return QApplication::translate("shortcutsTab", "Deck Editor");
case Game_Lobby:
return QApplication::translate("shortcutsTab", "Game Lobby");
case Card_Counters:
return QApplication::translate("shortcutsTab", "Card counters");
case Player_Counters:
return QApplication::translate("shortcutsTab", "Player counters");
case Power_Toughness:
return QApplication::translate("shortcutsTab", "Power and Toughness");
case Game_Phases:
return QApplication::translate("shortcutsTab", "Game Phases");
case Playing_Area:
return QApplication::translate("shortcutsTab", "Playing Area");
case Move_selected:
return QApplication::translate("shortcutsTab", "Move selected card to");
case View:
return QApplication::translate("shortcutsTab", "View");
case Move_top:
return QApplication::translate("shortcutsTab", "Move top card to");
case Gameplay:
return QApplication::translate("shortcutsTab", "Gameplay");
case Drawing:
return QApplication::translate("shortcutsTab", "Drawing");
case Chat_room:
return QApplication::translate("shortcutsTab", "Chat room");
case Game_window:
return QApplication::translate("shortcutsTab", "Game window");
case Load_deck:
return QApplication::translate("shortcutsTab", "Load deck from clipboard");
}
return {};
}
};
class ShortcutKey : public QList<QKeySequence>
{
public:
ShortcutKey(const QString &_name = QString(),
QList<QKeySequence> _sequence = QList<QKeySequence>(),
ShortcutGroup::Groups _group = ShortcutGroup::Main_Window);
void setSequence(QList<QKeySequence> _sequence)
{
QList<QKeySequence>::operator=(_sequence);
};
const QString getName() const
{
return QApplication::translate("shortcutsTab", name.toUtf8().data());
};
const QString getGroupName() const
{
return ShortcutGroup::getGroupName(group);
};
private:
QString name;
ShortcutGroup::Groups group;
};
class ShortcutsSettings : public QObject
{
Q_OBJECT
public:
ShortcutsSettings(const QString &settingsFilePath, QObject *parent = nullptr);
QList<QKeySequence> getDefaultShortcut(const QString &name) const;
QList<QKeySequence> getShortcut(const QString &name) const;
ShortcutKey getDefaultShortcut(const QString &name) const;
ShortcutKey getShortcut(const QString &name) const;
QKeySequence getSingleShortcut(const QString &name) const;
QString getDefaultShortcutString(const QString &name) const;
QString getShortcutString(const QString &name) const;
QList<QString> getAllShortcutKeys() const
{
return shortCuts.keys();
};
void setShortcuts(const QString &name, const QList<QKeySequence> &Sequence);
void setShortcuts(const QString &name, const QKeySequence &Sequence);
@ -30,168 +123,359 @@ public:
signals:
void shortCutChanged();
void allShortCutsReset();
void allShortCutsClear();
private:
const QChar sep = ';';
const QString custom = "Custom";
QString settingsFilePath;
QHash<QString, QList<QKeySequence>> shortCuts;
QHash<QString, ShortcutKey> shortCuts;
QString stringifySequence(const QList<QKeySequence> &Sequence) const;
QList<QKeySequence> parseSequenceString(const QString &stringSequence) const;
const QHash<QString, QList<QKeySequence>> defaultShortCuts{
{"MainWindow/aCheckCardUpdates", parseSequenceString("")},
{"MainWindow/aConnect", parseSequenceString("Ctrl+L")},
{"MainWindow/aDeckEditor", parseSequenceString("")},
{"MainWindow/aDisconnect", parseSequenceString("")},
{"MainWindow/aExit", parseSequenceString("")},
{"MainWindow/aFullScreen", parseSequenceString("Ctrl+F")},
{"MainWindow/aRegister", parseSequenceString("")},
{"MainWindow/aSettings", parseSequenceString("")},
{"MainWindow/aSinglePlayer", parseSequenceString("")},
{"MainWindow/aWatchReplay", parseSequenceString("")},
{"TabDeckEditor/aAnalyzeDeck", parseSequenceString("")},
{"TabDeckEditor/aClearFilterAll", parseSequenceString("")},
{"TabDeckEditor/aClearFilterOne", parseSequenceString("")},
{"TabDeckEditor/aClose", parseSequenceString("")},
{"TabDeckEditor/aDecrement", parseSequenceString("-")},
{"TabDeckEditor/aManageSets", parseSequenceString("")},
{"TabDeckEditor/aEditTokens", parseSequenceString("")},
{"TabDeckEditor/aExportDeckDecklist", parseSequenceString("")},
{"TabDeckEditor/aIncrement", parseSequenceString("+")},
{"TabDeckEditor/aLoadDeck", parseSequenceString("Ctrl+O")},
{"TabDeckEditor/aLoadDeckFromClipboard", parseSequenceString("Ctrl+Shift+V")},
{"TabDeckEditor/aNewDeck", parseSequenceString("Ctrl+N")},
{"TabDeckEditor/aOpenCustomFolder", parseSequenceString("")},
{"TabDeckEditor/aPrintDeck", parseSequenceString("Ctrl+P")},
{"TabDeckEditor/aRemoveCard", parseSequenceString("")},
{"TabDeckEditor/aResetLayout", parseSequenceString("")},
{"TabDeckEditor/aSaveDeck", parseSequenceString("Ctrl+S")},
{"TabDeckEditor/aSaveDeckAs", parseSequenceString("")},
{"TabDeckEditor/aSaveDeckToClipboard", parseSequenceString("Ctrl+Shift+C")},
{"TabDeckEditor/aSaveDeckToClipboardRaw", parseSequenceString("Ctrl+Shift+R")},
{"DeckViewContainer/loadLocalButton", parseSequenceString("Ctrl+O")},
{"DeckViewContainer/loadRemoteButton", parseSequenceString("Ctrl+Alt+O")},
{"Player/aSet", parseSequenceString("Ctrl+L")},
{"Player/aAlwaysRevealTopCard", parseSequenceString("Ctrl+N")},
{"Player/aCloseMostRecentZoneView", parseSequenceString("Esc")},
{"Player/aDrawCard", parseSequenceString("Ctrl+D")},
{"Player/aDrawCards", parseSequenceString("Ctrl+E")},
{"Player/aDec", parseSequenceString("F11")},
{"Player/aInc", parseSequenceString("F12")},
{"Player/aMoveTopCardToGraveyard", parseSequenceString("")},
{"Player/aMoveTopCardsToGraveyard", parseSequenceString("Ctrl+Shift+M")},
{"Player/aMoveTopCardToExile", parseSequenceString("")},
{"Player/aMoveTopCardsToExile", parseSequenceString("")},
{"Player/aMoveTopToPlayFaceDown", parseSequenceString("Ctrl+Shift+E")},
{"Player/aMulligan", parseSequenceString("Ctrl+M")},
{"Player/aPeek", parseSequenceString("")},
{"Player/aPlay", parseSequenceString("")},
{"Player/aResetLayout", parseSequenceString("")},
{"Player/aRollDie", parseSequenceString("Ctrl+I")},
{"Player/aShuffle", parseSequenceString("Ctrl+S")},
{"Player/aUndoDraw", parseSequenceString("Ctrl+Shift+D")},
{"Player/aUntapAll", parseSequenceString("Ctrl+U")},
{"Player/aViewGraveyard", parseSequenceString("F4")},
{"Player/aViewLibrary", parseSequenceString("F3")},
{"Player/aViewRfg", parseSequenceString("")},
{"Player/aViewSideboard", parseSequenceString("Ctrl+F3")},
{"Player/aViewTopCards", parseSequenceString("Ctrl+W")},
{"Player/aAttach", parseSequenceString("Ctrl+Alt+A")},
{"Player/aClone", parseSequenceString("Ctrl+J")},
{"Player/aCreateAnotherToken", parseSequenceString("Ctrl+G")},
{"Player/aCreateToken", parseSequenceString("Ctrl+T")},
{"Player/aCreateRelatedTokens", parseSequenceString("Ctrl+Shift+T")},
{"Player/aDoesntUntap", parseSequenceString("")},
{"Player/aDrawArrow", parseSequenceString("")},
{"Player/aFlip", parseSequenceString("")},
{"Player/aMoveToBottomLibrary", parseSequenceString("")},
{"Player/aMoveToExile", parseSequenceString("")},
{"Player/aMoveToGraveyard", parseSequenceString("Ctrl+Del")},
{"Player/aMoveToHand", parseSequenceString("")},
{"Player/aMoveToTopLibrary", parseSequenceString("")},
{"Player/aSetAnnotation", parseSequenceString("")},
{"Player/aTap", parseSequenceString("")},
{"Player/aUnattach", parseSequenceString("")},
{"Player/aCCGreen", parseSequenceString("")},
{"Player/aCCRed", parseSequenceString("")},
{"Player/aCCYellow", parseSequenceString("")},
{"Player/aRCGreen", parseSequenceString("")},
{"Player/aRCRed", parseSequenceString("")},
{"Player/aRCYellow", parseSequenceString("")},
{"Player/aSCGreen", parseSequenceString("")},
{"Player/aSCRed", parseSequenceString("")},
{"Player/aSCYellow", parseSequenceString("")},
{"Player/aDecP", parseSequenceString("Ctrl+-")},
{"Player/aDecPT", parseSequenceString("Ctrl+Alt+-")},
{"Player/aDecT", parseSequenceString("Alt+-")},
{"Player/aIncP", parseSequenceString("Ctrl++")},
{"Player/aIncPT", parseSequenceString("Ctrl+Alt++")},
{"Player/aIncT", parseSequenceString("Alt++")},
{"Player/aSetPT", parseSequenceString("Ctrl+P")},
{"Player/aResetPT", parseSequenceString("Ctrl+Alt+0")},
{"Player/aFlowP", parseSequenceString("")},
{"Player/aFlowT", parseSequenceString("")},
{"Player/aConcede", parseSequenceString("F2")},
{"Player/aLeaveGame", parseSequenceString("Ctrl+Q")},
{"Player/aNextPhase", parseSequenceString("Ctrl+Space;Tab")},
{"Player/aNextPhaseAction", parseSequenceString("Shift+Tab")},
{"Player/aNextTurn", parseSequenceString("Ctrl+Return;Ctrl+Enter")},
{"Player/aRemoveLocalArrows", parseSequenceString("Ctrl+R")},
{"Player/aRotateViewCCW", parseSequenceString("")},
{"Player/aRotateViewCW", parseSequenceString("")},
{"Player/phase0", parseSequenceString("F5")},
{"Player/phase1", parseSequenceString("")},
{"Player/phase10", parseSequenceString("F10")},
{"Player/phase2", parseSequenceString("F6")},
{"Player/phase3", parseSequenceString("F7")},
{"Player/phase4", parseSequenceString("F8")},
{"Player/phase5", parseSequenceString("")},
{"Player/phase6", parseSequenceString("")},
{"Player/phase7", parseSequenceString("")},
{"Player/phase8", parseSequenceString("")},
{"Player/phase9", parseSequenceString("F9")},
{"Player/aDecCounter_w", parseSequenceString("")},
{"Player/aIncCounter_w", parseSequenceString("")},
{"Player/aSetCounter_w", parseSequenceString("")},
{"Player/aDecCounter_u", parseSequenceString("")},
{"Player/aIncCounter_u", parseSequenceString("")},
{"Player/aSetCounter_u", parseSequenceString("")},
{"Player/aDecCounter_b", parseSequenceString("")},
{"Player/aIncCounter_b", parseSequenceString("")},
{"Player/aSetCounter_b", parseSequenceString("")},
{"Player/aDecCounter_r", parseSequenceString("")},
{"Player/aIncCounter_r", parseSequenceString("")},
{"Player/aSetCounter_r", parseSequenceString("")},
{"Player/aDecCounter_g", parseSequenceString("")},
{"Player/aIncCounter_g", parseSequenceString("")},
{"Player/aSetCounter_g", parseSequenceString("")},
{"Player/aDecCounter_x", parseSequenceString("")},
{"Player/aIncCounter_x", parseSequenceString("")},
{"Player/aSetCounter_x", parseSequenceString("")},
{"Player/aDecCounter_storm", parseSequenceString("")},
{"Player/aIncCounter_storm", parseSequenceString("")},
{"Player/aSetCounter_storm", parseSequenceString("")},
{"tab_room/aClearChat", parseSequenceString("F12")},
{"DlgLoadDeckFromClipboard/refreshButton", parseSequenceString("F5")}};
typedef ShortcutKey SK;
const QHash<QString, ShortcutKey> defaultShortCuts = {
{"MainWindow/aCheckCardUpdates", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Check for card updates"),
parseSequenceString(""),
ShortcutGroup::Main_Window)},
{"MainWindow/aConnect",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Connect"), parseSequenceString("Ctrl+L"), ShortcutGroup::Main_Window)},
{"MainWindow/aDeckEditor",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Deck editor"), parseSequenceString(""), ShortcutGroup::Main_Window)},
{"MainWindow/aDisconnect",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Disconnect"), parseSequenceString(""), ShortcutGroup::Main_Window)},
{"MainWindow/aExit",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Exit"), parseSequenceString(""), ShortcutGroup::Main_Window)},
{"MainWindow/aFullScreen", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Full screen"),
parseSequenceString("Ctrl+F"),
ShortcutGroup::Main_Window)},
{"MainWindow/aRegister",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Register"), parseSequenceString(""), ShortcutGroup::Main_Window)},
{"MainWindow/aSettings",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Settings"), parseSequenceString(""), ShortcutGroup::Main_Window)},
{"MainWindow/aSinglePlayer",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Local gameplay"), parseSequenceString(""), ShortcutGroup::Main_Window)},
{"MainWindow/aWatchReplay",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Watch replay"), parseSequenceString(""), ShortcutGroup::Main_Window)},
{"TabDeckEditor/aAnalyzeDeck",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Analyze deck"), parseSequenceString(""), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aClearFilterAll", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Clear all filters"),
parseSequenceString(""),
ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aClearFilterOne", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Clear selected filter"),
parseSequenceString(""),
ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aClose",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Close"), parseSequenceString(""), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aDecrement",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove card"), parseSequenceString("-"), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aManageSets",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Manage sets"), parseSequenceString(""), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aEditTokens",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Edit tokens"), parseSequenceString(""), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aExportDeckDecklist",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Export deck"), parseSequenceString(""), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aIncrement",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add card"), parseSequenceString("+"), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aLoadDeck",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Load deck"), parseSequenceString("Ctrl+O"), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aLoadDeckFromClipboard", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Load deck (clipboard)"),
parseSequenceString("Ctrl+Shift+V"),
ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aNewDeck",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "New deck"), parseSequenceString("Ctrl+N"), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aOpenCustomFolder", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Open custom pic folder"),
parseSequenceString(""),
ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aPrintDeck", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Print deck"),
parseSequenceString("Ctrl+P"),
ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aRemoveCard",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Delete card"), parseSequenceString(""), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aResetLayout",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Reset layout"), parseSequenceString(""), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aSaveDeck",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Save deck"), parseSequenceString("Ctrl+S"), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aSaveDeckAs",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Save deck as"), parseSequenceString(""), ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aSaveDeckToClipboard", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Save deck (clipboard; annotated)"),
parseSequenceString("Ctrl+Shift+C"),
ShortcutGroup::Deck_Editor)},
{"TabDeckEditor/aSaveDeckToClipboardRaw", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Save deck (clipboard, raw)"),
parseSequenceString("Ctrl+Shift+R"),
ShortcutGroup::Deck_Editor)},
{"DeckViewContainer/loadLocalButton", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Load local deck"),
parseSequenceString("Ctrl+O"),
ShortcutGroup::Game_Lobby)},
{"DeckViewContainer/loadRemoteButton", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Load remote deck"),
parseSequenceString("Ctrl+Alt+O"),
ShortcutGroup::Game_Lobby)},
{"Player/aCCGreen", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add green counter"),
parseSequenceString(""),
ShortcutGroup::Card_Counters)},
{"Player/aRCGreen", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove green counter"),
parseSequenceString(""),
ShortcutGroup::Card_Counters)},
{"Player/aSCGreen", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set green counters"),
parseSequenceString(""),
ShortcutGroup::Card_Counters)},
{"Player/aCCYellow", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add yellow counter"),
parseSequenceString(""),
ShortcutGroup::Card_Counters)},
{"Player/aRCYellow", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove yellow counter"),
parseSequenceString(""),
ShortcutGroup::Card_Counters)},
{"Player/aSCYellow", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set yellow counters"),
parseSequenceString(""),
ShortcutGroup::Card_Counters)},
{"Player/aCCRed", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add red counter"),
parseSequenceString(""),
ShortcutGroup::Card_Counters)},
{"Player/aRCRed", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove red counter"),
parseSequenceString(""),
ShortcutGroup::Card_Counters)},
{"Player/aSCRed", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set red counters"),
parseSequenceString(""),
ShortcutGroup::Card_Counters)},
{"Player/aInc", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add life counter"),
parseSequenceString("F12"),
ShortcutGroup::Player_Counters)},
{"Player/aDec", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove life counter"),
parseSequenceString("F11"),
ShortcutGroup::Player_Counters)},
{"Player/aSet", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set life counters"),
parseSequenceString("Ctrl+L"),
ShortcutGroup::Player_Counters)},
{"Player/aIncCounter_w", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add white counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aDecCounter_w", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove white counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aSetCounter_w", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set white counters"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aIncCounter_u", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add blue counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aDecCounter_u", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove blue counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aSetCounter_u", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set blue counters"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aIncCounter_b", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add black counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aDecCounter_b", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove black counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aSetCounter_b", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set black counters"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aIncCounter_r", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add red counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aDecCounter_r", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove red counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aSetCounter_r", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set red counters"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aIncCounter_g", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add green counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aDecCounter_g", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove green counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aSetCounter_g", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set green counters"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aIncCounter_x", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add X counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aDecCounter_x", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove X counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aSetCounter_x", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set X counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aIncCounter_storm", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add storm counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aDecCounter_storm", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove storm counter"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aSetCounter_storm", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set storm counters"),
parseSequenceString(""),
ShortcutGroup::Player_Counters)},
{"Player/aIncP", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add power (+1/+0)"),
parseSequenceString("Ctrl++"),
ShortcutGroup::Power_Toughness)},
{"Player/aDecP", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove power (-1/-0)"),
parseSequenceString("Ctrl+-"),
ShortcutGroup::Power_Toughness)},
{"Player/aFlowP", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Move to power (+1/-1)"),
parseSequenceString(""),
ShortcutGroup::Power_Toughness)},
{"Player/aIncT", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add toughness (+0/+1)"),
parseSequenceString("Alt++"),
ShortcutGroup::Power_Toughness)},
{"Player/aDecT", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove toughness (-0/-1)"),
parseSequenceString("Alt+-"),
ShortcutGroup::Power_Toughness)},
{"Player/aFlowT", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Move to toughness (-1/+1)"),
parseSequenceString(""),
ShortcutGroup::Power_Toughness)},
{"Player/aIncPT", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Add power and toughness (+1/+1)"),
parseSequenceString("Ctrl+Alt++"),
ShortcutGroup::Power_Toughness)},
{"Player/aDecPT", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove power and toughness (-1/-1)"),
parseSequenceString("Ctrl+Alt+-"),
ShortcutGroup::Power_Toughness)},
{"Player/aSetPT", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set power and toughness"),
parseSequenceString("Ctrl+P"),
ShortcutGroup::Power_Toughness)},
{"Player/aResetPT", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Reset power and toughness"),
parseSequenceString("Ctrl+Alt+0"),
ShortcutGroup::Power_Toughness)},
{"Player/phase0",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Untap"), parseSequenceString("F5"), ShortcutGroup::Game_Phases)},
{"Player/phase1",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Upkeep"), parseSequenceString(""), ShortcutGroup::Game_Phases)},
{"Player/phase2",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Draw"), parseSequenceString("F6"), ShortcutGroup::Game_Phases)},
{"Player/phase3",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Main 1"), parseSequenceString("F7"), ShortcutGroup::Game_Phases)},
{"Player/phase4",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Start combat"), parseSequenceString("F8"), ShortcutGroup::Game_Phases)},
{"Player/phase5",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Attack"), parseSequenceString(""), ShortcutGroup::Game_Phases)},
{"Player/phase6",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Block"), parseSequenceString(""), ShortcutGroup::Game_Phases)},
{"Player/phase7",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Damage"), parseSequenceString(""), ShortcutGroup::Game_Phases)},
{"Player/phase8",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "End combat"), parseSequenceString(""), ShortcutGroup::Game_Phases)},
{"Player/phase9",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Main 2"), parseSequenceString("F9"), ShortcutGroup::Game_Phases)},
{"Player/phase10",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "End"), parseSequenceString("F10"), ShortcutGroup::Game_Phases)},
{"Player/aNextPhase", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Next phase"),
parseSequenceString("Ctrl+Space;Tab"),
ShortcutGroup::Game_Phases)},
{"Player/aNextPhaseAction", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Next phase action"),
parseSequenceString("Shift+Tab"),
ShortcutGroup::Game_Phases)},
{"Player/aNextTurn", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Next turn"),
parseSequenceString("Ctrl+Return;Ctrl+Enter"),
ShortcutGroup::Game_Phases)},
{"Player/aTap", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Tap / Untap Card"),
parseSequenceString(""),
ShortcutGroup::Playing_Area)},
{"Player/aUntapAll", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Untap all"),
parseSequenceString("Ctrl+U"),
ShortcutGroup::Playing_Area)},
{"Player/aDoesntUntap",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Toggle untap"), parseSequenceString(""), ShortcutGroup::Playing_Area)},
{"Player/aFlip",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Flip card"), parseSequenceString(""), ShortcutGroup::Playing_Area)},
{"Player/aPeek",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Peek card"), parseSequenceString(""), ShortcutGroup::Playing_Area)},
{"Player/aPlay",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Play card"), parseSequenceString(""), ShortcutGroup::Playing_Area)},
{"Player/aAttach", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Attach card"),
parseSequenceString("Ctrl+Alt+A"),
ShortcutGroup::Playing_Area)},
{"Player/aUnattach",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Unattach card"), parseSequenceString(""), ShortcutGroup::Playing_Area)},
{"Player/aClone", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Clone card"),
parseSequenceString("Ctrl+J"),
ShortcutGroup::Playing_Area)},
{"Player/aCreateToken", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Create token"),
parseSequenceString("Ctrl+T"),
ShortcutGroup::Playing_Area)},
{"Player/aCreateRelatedTokens", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Create all related tokens"),
parseSequenceString("Ctrl+Shift+T"),
ShortcutGroup::Playing_Area)},
{"Player/aCreateAnotherToken", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Create another token"),
parseSequenceString("Ctrl+G"),
ShortcutGroup::Playing_Area)},
{"Player/aSetAnnotation",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Set annotation"), parseSequenceString(""), ShortcutGroup::Playing_Area)},
{"Player/aMoveToBottomLibrary", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Bottom library"),
parseSequenceString(""),
ShortcutGroup::Move_selected)},
{"Player/aMoveToExile",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Exile"), parseSequenceString(""), ShortcutGroup::Move_selected)},
{"Player/aMoveToGraveyard", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Graveyard"),
parseSequenceString("Ctrl+Del"),
ShortcutGroup::Move_selected)},
{"Player/aMoveToHand",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Hand"), parseSequenceString(""), ShortcutGroup::Move_selected)},
{"Player/aMoveToTopLibrary",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Top library"), parseSequenceString(""), ShortcutGroup::Move_selected)},
{"Player/aMoveTopToPlayFaceDown", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Play face down"),
parseSequenceString("Ctrl+Shift+E"),
ShortcutGroup::Move_selected)},
{"Player/aViewGraveyard",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Graveyard"), parseSequenceString("F4"), ShortcutGroup::View)},
{"Player/aViewLibrary",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Library"), parseSequenceString("F3"), ShortcutGroup::View)},
{"Player/aViewRfg",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Exile"), parseSequenceString(""), ShortcutGroup::View)},
{"Player/aViewSideboard",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Sideboard"), parseSequenceString("Ctrl+F3"), ShortcutGroup::View)},
{"Player/aViewTopCards", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Top cards of library"),
parseSequenceString("Ctrl+W"),
ShortcutGroup::View)},
{"Player/aCloseMostRecentZoneView",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Close recent view"), parseSequenceString("Esc"), ShortcutGroup::View)},
{"Player/aMoveTopCardToGraveyard",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Graveyard Once"), parseSequenceString(""), ShortcutGroup::Move_top)},
{"Player/aMoveTopCardsToGraveyard", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Graveyard Multiple"),
parseSequenceString("Ctrl+Shift+M"),
ShortcutGroup::Move_top)},
{"Player/aMoveTopCardToExile",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Exile Once"), parseSequenceString(""), ShortcutGroup::Move_top)},
{"Player/aMoveTopCardsToExile",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Exile Multiple"), parseSequenceString(""), ShortcutGroup::Move_top)},
{"Player/aDrawArrow",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Draw arrow"), parseSequenceString(""), ShortcutGroup::Gameplay)},
{"Player/aRemoveLocalArrows", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Remove local arrows"),
parseSequenceString("Ctrl+R"),
ShortcutGroup::Gameplay)},
{"Player/aLeaveGame",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Leave game"), parseSequenceString("Ctrl+Q"), ShortcutGroup::Gameplay)},
{"Player/aConcede",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Concede"), parseSequenceString("F2"), ShortcutGroup::Gameplay)},
{"Player/aRollDie",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Roll dice"), parseSequenceString("Ctrl+I"), ShortcutGroup::Gameplay)},
{"Player/aShuffle", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Shuffle library"),
parseSequenceString("Ctrl+S"),
ShortcutGroup::Gameplay)},
{"Player/aMulligan",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Mulligan"), parseSequenceString("Ctrl+M"), ShortcutGroup::Drawing)},
{"Player/aDrawCard",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Draw card"), parseSequenceString("Ctrl+D"), ShortcutGroup::Drawing)},
{"Player/aDrawCards",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Draw cards"), parseSequenceString("Ctrl+E"), ShortcutGroup::Drawing)},
{"Player/aUndoDraw", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Undo draw"),
parseSequenceString("Ctrl+Shift+D"),
ShortcutGroup::Drawing)},
{"Player/aAlwaysRevealTopCard", SK(QT_TRANSLATE_NOOP("shortcutsTab", "Always reveal top card"),
parseSequenceString("Ctrl+N"),
ShortcutGroup::Drawing)},
{"Player/aRotateViewCW",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Rotate view CW"), parseSequenceString(""), ShortcutGroup::Drawing)},
{"Player/aRotateViewCCW",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Rotate view CCW"), parseSequenceString(""), ShortcutGroup::Drawing)},
{"tab_room/aClearChat",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Clear chat"), parseSequenceString("F12"), ShortcutGroup::Chat_room)},
{"Player/aResetLayout",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Reset layout"), parseSequenceString(""), ShortcutGroup::Game_window)},
{"DlgLoadDeckFromClipboard/refreshButton",
SK(QT_TRANSLATE_NOOP("shortcutsTab", "Refresh"), parseSequenceString("F5"), ShortcutGroup::Load_deck)}};
};
#endif // SHORTCUTSSETTINGS_H

File diff suppressed because it is too large Load diff

View file

@ -253,7 +253,7 @@
<context>
<name>OracleImporter</name>
<message>
<location filename="../src/oracleimporter.cpp" line="344"/>
<location filename="../src/oracleimporter.cpp" line="370"/>
<source>Dummy set containing tokens</source>
<translation type="unfinished"></translation>
</message>