mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-04-27 07:48:01 -07:00
* [4191] fix: Move unfocusTextBox and aFocusChat shortcuts to Player family * [4191] fix: fix formatting * Revert "[4191] fix: fix formatting" This reverts commit 86a4a675f3bc8118d4ba8dd45f408c4e8c348f33. * Revert "[4191] fix: Move unfocusTextBox and aFocusChat shortcuts to Player family" This reverts commit 3ec183628df81c48123a8a248d0416c529ee0c8e. * [4191] fix: Textbox and tab_game shortcut groups cannot conflict with Player group * Revert "[4191] fix: Textbox and tab_game shortcut groups cannot conflict with Player group" This reverts commit 36800393339d997df1a932bb798f95d2d387399a. * [4191] fix: Move unfocusTextBox and aFocusChat shortcuts to Player family * [4191] fix: Migrate shortcuts if new version is detected * [4191] fix: formatting * [4191] fix: Maybe fix build issue on Windows7, Debian11, UbuntuBionic and UbuntuFocal
209 lines
7.3 KiB
C++
209 lines
7.3 KiB
C++
#include "shortcuts_settings.h"
|
|
|
|
#include <QDebug>
|
|
#include <QFile>
|
|
#include <QMessageBox>
|
|
#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;
|
|
settingsFilePath = settingsPath;
|
|
settingsFilePath.append("shortcuts.ini");
|
|
|
|
bool exists = QFile(settingsFilePath).exists();
|
|
|
|
QSettings shortCutsFile(settingsFilePath, QSettings::IniFormat);
|
|
|
|
if (exists) {
|
|
shortCutsFile.beginGroup(custom);
|
|
const QStringList customKeys = shortCutsFile.allKeys();
|
|
|
|
QMap<QString, QString> invalidItems;
|
|
for (QStringList::const_iterator it = customKeys.constBegin(); it != customKeys.constEnd(); ++it) {
|
|
QString stringSequence = shortCutsFile.value(*it).toString();
|
|
// check whether shortcut is forbidden
|
|
if (isKeyAllowed(*it, stringSequence)) {
|
|
auto shortcut = getShortcut(*it);
|
|
shortcut.setSequence(parseSequenceString(stringSequence));
|
|
shortCuts.insert(*it, shortcut);
|
|
} 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<QString, QString>::const_iterator item = invalidItems.constBegin();
|
|
item != invalidItems.constEnd(); ++item) {
|
|
detailedMessage += item.key() + " - \"" + item.value() + "\"\n";
|
|
}
|
|
msgBox.setDetailedText(detailedMessage);
|
|
msgBox.exec();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// PR 5079 changes Textbox/unfocusTextBox to Player/unfocusTextBox and tab_game/aFocusChat to Player/aFocusChat.
|
|
/// A migration is necessary to let players keep their already configured shortcuts.
|
|
void ShortcutsSettings::migrateShortcuts()
|
|
{
|
|
if (QFile(settingsFilePath).exists()) {
|
|
QSettings shortCutsFile(settingsFilePath, QSettings::IniFormat);
|
|
|
|
shortCutsFile.beginGroup(custom);
|
|
|
|
if (shortCutsFile.contains("Textbox/unfocusTextBox")) {
|
|
qDebug()
|
|
<< "[ShortcutsSettings] Textbox/unfocusTextBox shortcut found. Migrating to Player/unfocusTextBox.";
|
|
QString unfocusTextBox = shortCutsFile.value("Textbox/unfocusTextBox", "").toString();
|
|
this->setShortcuts("Player/unfocusTextBox", unfocusTextBox);
|
|
shortCutsFile.remove("Textbox/unfocusTextBox");
|
|
}
|
|
|
|
if (shortCutsFile.contains("tab_game/aFocusChat")) {
|
|
qDebug() << "[ShortcutsSettings] tab_game/aFocusChat shortcut found. Migrating to Player/aFocusChat.";
|
|
QString aFocusChat = shortCutsFile.value("tab_game/aFocusChat", "").toString();
|
|
this->setShortcuts("Player/aFocusChat", aFocusChat);
|
|
shortCutsFile.remove("tab_game/aFocusChat");
|
|
}
|
|
|
|
shortCutsFile.endGroup();
|
|
}
|
|
}
|
|
|
|
ShortcutKey ShortcutsSettings::getDefaultShortcut(const QString &name) const
|
|
{
|
|
return defaultShortCuts.value(name, ShortcutKey());
|
|
}
|
|
|
|
ShortcutKey ShortcutsSettings::getShortcut(const QString &name) const
|
|
{
|
|
if (shortCuts.contains(name)) {
|
|
return shortCuts.value(name);
|
|
}
|
|
|
|
return getDefaultShortcut(name);
|
|
}
|
|
|
|
QKeySequence ShortcutsSettings::getSingleShortcut(const QString &name) const
|
|
{
|
|
return getShortcut(name).at(0);
|
|
}
|
|
|
|
QString ShortcutsSettings::getDefaultShortcutString(const QString &name) const
|
|
{
|
|
return stringifySequence(getDefaultShortcut(name));
|
|
}
|
|
|
|
QString ShortcutsSettings::getShortcutString(const QString &name) const
|
|
{
|
|
return stringifySequence(getShortcut(name));
|
|
}
|
|
|
|
QString ShortcutsSettings::stringifySequence(const QList<QKeySequence> &Sequence) const
|
|
{
|
|
QStringList stringSequence;
|
|
for (const auto &i : Sequence) {
|
|
stringSequence.append(i.toString(QKeySequence::PortableText));
|
|
}
|
|
|
|
return stringSequence.join(sep);
|
|
}
|
|
|
|
QList<QKeySequence> ShortcutsSettings::parseSequenceString(const QString &stringSequence) const
|
|
{
|
|
QList<QKeySequence> SequenceList;
|
|
for (const QString &shortcut : stringSequence.split(sep)) {
|
|
SequenceList.append(QKeySequence(shortcut, QKeySequence::PortableText));
|
|
}
|
|
|
|
return SequenceList;
|
|
}
|
|
|
|
void ShortcutsSettings::setShortcuts(const QString &name, const QList<QKeySequence> &Sequence)
|
|
{
|
|
shortCuts[name].setSequence(Sequence);
|
|
|
|
QSettings shortCutsFile(settingsFilePath, QSettings::IniFormat);
|
|
shortCutsFile.beginGroup(custom);
|
|
shortCutsFile.setValue(name, stringifySequence(Sequence));
|
|
shortCutsFile.endGroup();
|
|
emit shortCutChanged();
|
|
}
|
|
|
|
void ShortcutsSettings::setShortcuts(const QString &name, const QKeySequence &Sequence)
|
|
{
|
|
setShortcuts(name, QList<QKeySequence>{Sequence});
|
|
}
|
|
|
|
void ShortcutsSettings::setShortcuts(const QString &name, const QString &Sequences)
|
|
{
|
|
setShortcuts(name, parseSequenceString(Sequences));
|
|
}
|
|
|
|
void ShortcutsSettings::resetAllShortcuts()
|
|
{
|
|
shortCuts = defaultShortCuts;
|
|
QSettings shortCutsFile(settingsFilePath, QSettings::IniFormat);
|
|
shortCutsFile.beginGroup(custom);
|
|
shortCutsFile.remove("");
|
|
shortCutsFile.endGroup();
|
|
emit shortCutChanged();
|
|
}
|
|
|
|
void ShortcutsSettings::clearAllShortcuts()
|
|
{
|
|
QSettings shortCutsFile(settingsFilePath, QSettings::IniFormat);
|
|
shortCutsFile.beginGroup(custom);
|
|
for (auto it = shortCuts.begin(); it != shortCuts.end(); ++it) {
|
|
it.value().setSequence(parseSequenceString(""));
|
|
shortCutsFile.setValue(it.key(), "");
|
|
}
|
|
shortCutsFile.endGroup();
|
|
emit shortCutChanged();
|
|
}
|
|
|
|
bool ShortcutsSettings::isKeyAllowed(const QString &name, const QString &Sequences) const
|
|
{
|
|
// if the shortcut is not to be used in deck-editor then it doesn't matter
|
|
if (name.startsWith("Player") || name.startsWith("Replays")) {
|
|
return true;
|
|
}
|
|
QString checkSequence = Sequences.split(sep).last();
|
|
QStringList forbiddenKeys{"Del", "Backspace", "Down", "Up", "Left", "Right",
|
|
"Return", "Enter", "Menu", "Ctrl+Alt+-", "Ctrl+Alt+=", "Ctrl+Alt+[",
|
|
"Ctrl+Alt+]", "Tab", "Space", "Shift+S", "Shift+Left", "Shift+Right"};
|
|
return !forbiddenKeys.contains(checkSequence);
|
|
}
|
|
|
|
bool ShortcutsSettings::isValid(const QString &name, const QString &Sequences) const
|
|
{
|
|
QString checkSequence = Sequences.split(sep).last();
|
|
QString checkKey = name.left(name.indexOf("/"));
|
|
|
|
QList<QString> 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(sep);
|
|
if (stringSequences.contains(checkSequence)) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|