Add extra shortcuts to main window and sub-editors

This commit is contained in:
BigBahss 2020-11-12 23:48:03 -05:00
parent f044672d2e
commit bb6786f24e
7 changed files with 69 additions and 44 deletions

View file

@ -207,16 +207,14 @@ public:
virtual void reset() override { user_shortcuts.clear(); } virtual void reset() override { user_shortcuts.clear(); }
// Call this before applying user shortcuts so that the user can restore defaults.
void setDefaultShortcuts(const QObjectList &objects); void setDefaultShortcuts(const QObjectList &objects);
void setDefaultShortcuts(const QMultiMap<const QObject *, QKeySequence> &objects_keySequences);
QList<QKeySequence> defaultShortcuts(const QObject *object) const; QList<QKeySequence> defaultShortcuts(const QObject *object) const;
void setUserShortcuts(const QObjectList &objects); void setUserShortcuts(const QObjectList &objects);
void setUserShortcuts(const QMultiMap<const QObject *, QKeySequence> &objects_keySequences); void setUserShortcuts(const QMultiMap<const QObject *, QKeySequence> &objects_keySequences);
QList<QKeySequence> userShortcuts(const QObject *object) const; QList<QKeySequence> userShortcuts(const QObject *object) const;
static bool objectNameIsValid(const QObject *object);
protected: protected:
virtual QString getConfigFilepath() override; virtual QString getConfigFilepath() override;
virtual void parseConfigKeyValue(QString key, QString value) override; virtual void parseConfigKeyValue(QString key, QString value) override;
@ -243,7 +241,6 @@ private:
const QList<QKeySequence> &keySequences); const QList<QKeySequence> &keySequences);
}; };
// Call setDefaultShortcuts() prior to applying user shortcuts.
extern ShortcutsConfig shortcutsConfig; extern ShortcutsConfig shortcutsConfig;
#endif // CONFIG_H #endif // CONFIG_H

View file

@ -108,6 +108,7 @@ private:
void initSelectedTileItem(); void initSelectedTileItem();
void initMetatileLayersItem(); void initMetatileLayersItem();
void initShortcuts(); void initShortcuts();
void initExtraShortcuts();
void restoreWindowState(); void restoreWindowState();
void initMetatileHistory(); void initMetatileHistory();
void setTilesets(QString primaryTilesetLabel, QString secondaryTilesetLabel); void setTilesets(QString primaryTilesetLabel, QString secondaryTilesetLabel);

View file

@ -730,11 +730,10 @@ QMap<QString, QString> ShortcutsConfig::getKeyValueMap() {
QMap<QString, QString> map; QMap<QString, QString> map;
for (auto cfg_key : user_shortcuts.uniqueKeys()) { for (auto cfg_key : user_shortcuts.uniqueKeys()) {
auto keySequences = user_shortcuts.values(cfg_key); auto keySequences = user_shortcuts.values(cfg_key);
QStringList values; QStringList keySequenceStrings;
for (auto keySequence : keySequences) for (auto keySequence : keySequences)
values.append(keySequence.toString()); keySequenceStrings.append(keySequence.toString());
QString value = values.join(' '); map.insert(cfg_key, keySequenceStrings.join(' '));
map.insert(cfg_key, value);
} }
return map; return map;
} }
@ -744,12 +743,6 @@ void ShortcutsConfig::setDefaultShortcuts(const QObjectList &objects) {
save(); save();
} }
void ShortcutsConfig::setDefaultShortcuts(const QMultiMap<const QObject *, QKeySequence> &objects_keySequences) {
for (auto *object : objects_keySequences.uniqueKeys())
storeShortcuts(StoreType::Default, cfgKey(object), objects_keySequences.values(object));
save();
}
QList<QKeySequence> ShortcutsConfig::defaultShortcuts(const QObject *object) const { QList<QKeySequence> ShortcutsConfig::defaultShortcuts(const QObject *object) const {
return default_shortcuts.values(cfgKey(object)); return default_shortcuts.values(cfgKey(object));
} }
@ -761,7 +754,8 @@ void ShortcutsConfig::setUserShortcuts(const QObjectList &objects) {
void ShortcutsConfig::setUserShortcuts(const QMultiMap<const QObject *, QKeySequence> &objects_keySequences) { void ShortcutsConfig::setUserShortcuts(const QMultiMap<const QObject *, QKeySequence> &objects_keySequences) {
for (auto *object : objects_keySequences.uniqueKeys()) for (auto *object : objects_keySequences.uniqueKeys())
storeShortcuts(StoreType::User, cfgKey(object), objects_keySequences.values(object)); if (!object->objectName().isEmpty() && !object->objectName().startsWith("_q_"))
storeShortcuts(StoreType::User, cfgKey(object), objects_keySequences.values(object));
save(); save();
} }
@ -771,7 +765,7 @@ QList<QKeySequence> ShortcutsConfig::userShortcuts(const QObject *object) const
void ShortcutsConfig::storeShortcutsFromList(StoreType storeType, const QObjectList &objects) { void ShortcutsConfig::storeShortcutsFromList(StoreType storeType, const QObjectList &objects) {
for (const auto *object : objects) for (const auto *object : objects)
if (objectNameIsValid(object)) if (!object->objectName().isEmpty() && !object->objectName().startsWith("_q_"))
storeShortcuts(storeType, cfgKey(object), currentShortcuts(object)); storeShortcuts(storeType, cfgKey(object), currentShortcuts(object));
} }
@ -802,11 +796,6 @@ void ShortcutsConfig::storeShortcuts(
} }
} }
bool ShortcutsConfig::objectNameIsValid(const QObject *object) {
// Qt internal action names start with "_q_" so we filter those out.
return !object->objectName().isEmpty() && !object->objectName().startsWith("_q_");
}
/* Creates a config key from the object's name prepended with the parent /* Creates a config key from the object's name prepended with the parent
* window's object name, and converts camelCase to snake_case. */ * window's object name, and converts camelCase to snake_case. */
QString ShortcutsConfig::cfgKey(const QObject *object) const { QString ShortcutsConfig::cfgKey(const QObject *object) const {
@ -830,9 +819,6 @@ QList<QKeySequence> ShortcutsConfig::currentShortcuts(const QObject *object) con
if (object->inherits("QAction")) { if (object->inherits("QAction")) {
const auto *action = qobject_cast<const QAction *>(object); const auto *action = qobject_cast<const QAction *>(object);
return action->shortcuts(); return action->shortcuts();
} else if (object->inherits("QAbstractButton")) {
const auto *button = qobject_cast<const QAbstractButton *>(object);
return { button->shortcut() };
} else if (object->inherits("Shortcut")) { } else if (object->inherits("Shortcut")) {
const auto *shortcut = qobject_cast<const Shortcut *>(object); const auto *shortcut = qobject_cast<const Shortcut *>(object);
return shortcut->keys(); return shortcut->keys();

View file

@ -106,6 +106,8 @@ void MainWindow::initShortcuts() {
} }
void MainWindow::initExtraShortcuts() { void MainWindow::initExtraShortcuts() {
ui->actionZoom_In->setShortcuts({ui->actionZoom_In->shortcut(), QKeySequence("Ctrl+=")});
auto *shortcutReset_Zoom = new Shortcut(QKeySequence("Ctrl+0"), this, SLOT(resetMapViewScale())); auto *shortcutReset_Zoom = new Shortcut(QKeySequence("Ctrl+0"), this, SLOT(resetMapViewScale()));
shortcutReset_Zoom->setObjectName("shortcutZoom_Reset"); shortcutReset_Zoom->setObjectName("shortcutZoom_Reset");
shortcutReset_Zoom->setWhatsThis("Zoom Reset"); shortcutReset_Zoom->setWhatsThis("Zoom Reset");
@ -123,27 +125,46 @@ void MainWindow::initExtraShortcuts() {
shortcutDelete_Object->setObjectName("shortcutDelete_Object"); shortcutDelete_Object->setObjectName("shortcutDelete_Object");
shortcutDelete_Object->setWhatsThis("Delete Selected Event(s)"); shortcutDelete_Object->setWhatsThis("Delete Selected Event(s)");
ui->actionZoom_In->setShortcuts({ui->actionZoom_In->shortcut(), QKeySequence("Ctrl+=")}); auto *shortcutToggle_Border = new Shortcut(QKeySequence(), ui->checkBox_ToggleBorder, SLOT(toggle()));
shortcutToggle_Border->setObjectName("shortcutToggle_Border");
shortcutToggle_Border->setWhatsThis("Toggle Border");
auto *shortcutToggle_Smart_Paths = new Shortcut(QKeySequence(), ui->checkBox_smartPaths, SLOT(toggle()));
shortcutToggle_Smart_Paths->setObjectName("shortcutToggle_Smart_Paths");
shortcutToggle_Smart_Paths->setWhatsThis("Toggle Smart Paths");
auto *shortcutExpand_All = new Shortcut(QKeySequence(), this, SLOT(on_toolButton_ExpandAll_clicked()));
shortcutExpand_All->setObjectName("shortcutExpand_All");
shortcutExpand_All->setWhatsThis("Map List: Expand all folders");
auto *shortcutCollapse_All = new Shortcut(QKeySequence(), this, SLOT(on_toolButton_CollapseAll_clicked()));
shortcutCollapse_All->setObjectName("shortcutCollapse_All");
shortcutCollapse_All->setWhatsThis("Map List: Collapse all folders");
auto *shortcutNew_Event = new Shortcut(QKeySequence(), this, SLOT(on_toolButton_Open_Scripts_clicked()));
shortcutNew_Event->setObjectName("shortcut_Open_Scripts");
shortcutNew_Event->setWhatsThis("Open Map Scripts");
} }
QObjectList MainWindow::shortcutableObjects() const { QObjectList MainWindow::shortcutableObjects() const {
QObjectList shortcutable_objects; QObjectList shortcutable_objects;
for (auto *action : findChildren<QAction *>()) for (auto *action : findChildren<QAction *>())
if (ShortcutsConfig::objectNameIsValid(action)) if (!action->objectName().isEmpty())
shortcutable_objects.append(qobject_cast<QObject *>(action)); shortcutable_objects.append(qobject_cast<QObject *>(action));
for (auto *shortcut : findChildren<Shortcut *>()) for (auto *shortcut : findChildren<Shortcut *>())
if (ShortcutsConfig::objectNameIsValid(shortcut)) if (!shortcut->objectName().isEmpty())
shortcutable_objects.append(qobject_cast<QObject *>(shortcut)); shortcutable_objects.append(qobject_cast<QObject *>(shortcut));
return shortcutable_objects; return shortcutable_objects;
} }
void MainWindow::applyUserShortcuts() { void MainWindow::applyUserShortcuts() {
for (auto *action : findChildren<QAction *>()) for (auto *action : findChildren<QAction *>())
if (ShortcutsConfig::objectNameIsValid(action)) if (!action->objectName().isEmpty())
action->setShortcuts(shortcutsConfig.userShortcuts(action)); action->setShortcuts(shortcutsConfig.userShortcuts(action));
for (auto *shortcut : findChildren<Shortcut *>()) for (auto *shortcut : findChildren<Shortcut *>())
if (ShortcutsConfig::objectNameIsValid(shortcut)) if (!shortcut->objectName().isEmpty())
shortcut->setKeys(shortcutsConfig.userShortcuts(shortcut)); shortcut->setKeys(shortcutsConfig.userShortcuts(shortcut));
} }

View file

@ -25,6 +25,7 @@ RegionMapEditor::RegionMapEditor(QWidget *parent, Project *project_) :
this->project = project_; this->project = project_;
this->region_map = new RegionMap; this->region_map = new RegionMap;
this->ui->action_RegionMap_Resize->setVisible(false); this->ui->action_RegionMap_Resize->setVisible(false);
this->initShortcuts();
this->restoreWindowState(); this->restoreWindowState();
} }
@ -94,6 +95,11 @@ bool RegionMapEditor::loadCityMaps() {
} }
void RegionMapEditor::initShortcuts() { void RegionMapEditor::initShortcuts() {
auto *shortcut_RM_Options_delete = new Shortcut(
{QKeySequence("Del"), QKeySequence("Backspace")}, this, SLOT(on_pushButton_RM_Options_delete_clicked()));
shortcut_RM_Options_delete->setObjectName("shortcut_RM_Options_delete");
shortcut_RM_Options_delete->setWhatsThis("Map Layout: Delete Square");
shortcutsConfig.load(); shortcutsConfig.load();
shortcutsConfig.setDefaultShortcuts(shortcutableObjects()); shortcutsConfig.setDefaultShortcuts(shortcutableObjects());
applyUserShortcuts(); applyUserShortcuts();
@ -101,22 +107,23 @@ void RegionMapEditor::initShortcuts() {
QObjectList RegionMapEditor::shortcutableObjects() const { QObjectList RegionMapEditor::shortcutableObjects() const {
QObjectList shortcutable_objects; QObjectList shortcutable_objects;
for (auto *action : findChildren<QAction *>()) for (auto *action : findChildren<QAction *>())
if (ShortcutsConfig::objectNameIsValid(action)) if (!action->objectName().isEmpty())
shortcutable_objects.append(qobject_cast<QObject *>(action)); shortcutable_objects.append(qobject_cast<QObject *>(action));
for (auto *shortcut : findChildren<Shortcut *>()) for (auto *shortcut : findChildren<Shortcut *>())
if (ShortcutsConfig::objectNameIsValid(shortcut)) if (!shortcut->objectName().isEmpty())
shortcutable_objects.append(qobject_cast<QObject *>(shortcut)); shortcutable_objects.append(qobject_cast<QObject *>(shortcut));
return shortcutable_objects; return shortcutable_objects;
} }
void RegionMapEditor::applyUserShortcuts() { void RegionMapEditor::applyUserShortcuts() {
for (auto *action : findChildren<QAction *>()) for (auto *action : findChildren<QAction *>())
if (ShortcutsConfig::objectNameIsValid(action)) if (!action->objectName().isEmpty())
action->setShortcuts(shortcutsConfig.userShortcuts(action)); action->setShortcuts(shortcutsConfig.userShortcuts(action));
for (auto *shortcut : findChildren<Shortcut *>()) for (auto *shortcut : findChildren<Shortcut *>())
if (ShortcutsConfig::objectNameIsValid(shortcut)) if (!shortcut->objectName().isEmpty())
shortcut->setKeys(shortcutsConfig.userShortcuts(shortcut)); shortcut->setKeys(shortcutsConfig.userShortcuts(shortcut));
} }

View file

@ -21,8 +21,8 @@ ShortcutsEditor::ShortcutsEditor(QWidget *parent) :
ui->setupUi(this); ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
main_container = ui->scrollAreaWidgetContents_Shortcuts; main_container = ui->scrollAreaWidgetContents_Shortcuts;
auto *formLayout = new QVBoxLayout(main_container); auto *main_layout = new QVBoxLayout(main_container);
formLayout->setSpacing(12); main_layout->setSpacing(12);
connect(ui->buttonBox, &QDialogButtonBox::clicked, connect(ui->buttonBox, &QDialogButtonBox::clicked,
this, &ShortcutsEditor::dialogButtonClicked); this, &ShortcutsEditor::dialogButtonClicked);
} }
@ -69,7 +69,7 @@ void ShortcutsEditor::resetShortcuts() {
void ShortcutsEditor::parseObjectList(const QObjectList &objectList) { void ShortcutsEditor::parseObjectList(const QObjectList &objectList) {
for (auto *object : objectList) { for (auto *object : objectList) {
const auto label = getLabel(object); const auto label = getLabel(object);
if (!label.isEmpty() && ShortcutsConfig::objectNameIsValid(object)) if (!label.isEmpty() && !object->objectName().isEmpty() && !object->objectName().startsWith("_q_"))
labels_objects.insert(label, object); labels_objects.insert(label, object);
} }
} }

View file

@ -211,31 +211,44 @@ void TilesetEditor::initSelectedTileItem() {
} }
void TilesetEditor::initShortcuts() { void TilesetEditor::initShortcuts() {
ui->actionRedo->setShortcuts({ui->actionRedo->shortcut(), QKeySequence("Ctrl+Shift+Z")}); initExtraShortcuts();
shortcutsConfig.load(); shortcutsConfig.load();
shortcutsConfig.setDefaultShortcuts(shortcutableObjects()); shortcutsConfig.setDefaultShortcuts(shortcutableObjects());
applyUserShortcuts(); applyUserShortcuts();
} }
void TilesetEditor::initExtraShortcuts() {
ui->actionRedo->setShortcuts({ui->actionRedo->shortcut(), QKeySequence("Ctrl+Shift+Z")});
auto *shortcut_xFlip = new Shortcut(QKeySequence(), ui->checkBox_xFlip, SLOT(toggle()));
shortcut_xFlip->setObjectName("shortcut_xFlip");
shortcut_xFlip->setWhatsThis("X Flip");
auto *shortcut_yFlip = new Shortcut(QKeySequence(), ui->checkBox_yFlip, SLOT(toggle()));
shortcut_yFlip->setObjectName("shortcut_yFlip");
shortcut_yFlip->setWhatsThis("Y Flip");
}
QObjectList TilesetEditor::shortcutableObjects() const { QObjectList TilesetEditor::shortcutableObjects() const {
QObjectList shortcutable_objects; QObjectList shortcutable_objects;
for (auto *action : findChildren<QAction *>()) for (auto *action : findChildren<QAction *>())
if (ShortcutsConfig::objectNameIsValid(action)) if (!action->objectName().isEmpty())
shortcutable_objects.append(qobject_cast<QObject *>(action)); shortcutable_objects.append(qobject_cast<QObject *>(action));
for (auto *shortcut : findChildren<Shortcut *>()) for (auto *shortcut : findChildren<Shortcut *>())
if (ShortcutsConfig::objectNameIsValid(shortcut)) if (!shortcut->objectName().isEmpty())
shortcutable_objects.append(qobject_cast<QObject *>(shortcut)); shortcutable_objects.append(qobject_cast<QObject *>(shortcut));
return shortcutable_objects; return shortcutable_objects;
} }
void TilesetEditor::applyUserShortcuts() { void TilesetEditor::applyUserShortcuts() {
for (auto *action : findChildren<QAction *>()) for (auto *action : findChildren<QAction *>())
if (ShortcutsConfig::objectNameIsValid(action)) if (!action->objectName().isEmpty())
action->setShortcuts(shortcutsConfig.userShortcuts(action)); action->setShortcuts(shortcutsConfig.userShortcuts(action));
for (auto *shortcut : findChildren<Shortcut *>()) for (auto *shortcut : findChildren<Shortcut *>())
if (ShortcutsConfig::objectNameIsValid(shortcut)) if (!shortcut->objectName().isEmpty())
shortcut->setKeys(shortcutsConfig.userShortcuts(shortcut)); shortcut->setKeys(shortcutsConfig.userShortcuts(shortcut));
} }