hotkeys.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <map>
  5. #include <QKeySequence>
  6. #include <QSettings>
  7. #include <QShortcut>
  8. #include "citra_qt/hotkeys.h"
  9. struct Hotkey
  10. {
  11. Hotkey() : shortcut(nullptr), context(Qt::WindowShortcut) {}
  12. QKeySequence keyseq;
  13. QShortcut* shortcut;
  14. Qt::ShortcutContext context;
  15. };
  16. typedef std::map<QString, Hotkey> HotkeyMap;
  17. typedef std::map<QString, HotkeyMap> HotkeyGroupMap;
  18. HotkeyGroupMap hotkey_groups;
  19. void SaveHotkeys(QSettings& settings)
  20. {
  21. settings.beginGroup("Shortcuts");
  22. for (auto group : hotkey_groups)
  23. {
  24. settings.beginGroup(group.first);
  25. for (auto hotkey : group.second)
  26. {
  27. settings.beginGroup(hotkey.first);
  28. settings.setValue(QString("KeySeq"), hotkey.second.keyseq.toString());
  29. settings.setValue(QString("Context"), hotkey.second.context);
  30. settings.endGroup();
  31. }
  32. settings.endGroup();
  33. }
  34. settings.endGroup();
  35. }
  36. void LoadHotkeys(QSettings& settings)
  37. {
  38. settings.beginGroup("Shortcuts");
  39. // Make sure NOT to use a reference here because it would become invalid once we call beginGroup()
  40. QStringList groups = settings.childGroups();
  41. for (auto group : groups)
  42. {
  43. settings.beginGroup(group);
  44. QStringList hotkeys = settings.childGroups();
  45. for (auto hotkey : hotkeys)
  46. {
  47. settings.beginGroup(hotkey);
  48. // RegisterHotkey assigns default keybindings, so use old values as default parameters
  49. Hotkey& hk = hotkey_groups[group][hotkey];
  50. hk.keyseq = QKeySequence::fromString(settings.value("KeySeq", hk.keyseq.toString()).toString());
  51. hk.context = (Qt::ShortcutContext)settings.value("Context", hk.context).toInt();
  52. if (hk.shortcut)
  53. hk.shortcut->setKey(hk.keyseq);
  54. settings.endGroup();
  55. }
  56. settings.endGroup();
  57. }
  58. settings.endGroup();
  59. }
  60. void RegisterHotkey(const QString& group, const QString& action, const QKeySequence& default_keyseq, Qt::ShortcutContext default_context)
  61. {
  62. if (hotkey_groups[group].find(action) == hotkey_groups[group].end())
  63. {
  64. hotkey_groups[group][action].keyseq = default_keyseq;
  65. hotkey_groups[group][action].context = default_context;
  66. }
  67. }
  68. QShortcut* GetHotkey(const QString& group, const QString& action, QWidget* widget)
  69. {
  70. Hotkey& hk = hotkey_groups[group][action];
  71. if (!hk.shortcut)
  72. hk.shortcut = new QShortcut(hk.keyseq, widget, nullptr, nullptr, hk.context);
  73. return hk.shortcut;
  74. }
  75. GHotkeysDialog::GHotkeysDialog(QWidget* parent): QDialog(parent)
  76. {
  77. ui.setupUi(this);
  78. for (auto group : hotkey_groups)
  79. {
  80. QTreeWidgetItem* toplevel_item = new QTreeWidgetItem(QStringList(group.first));
  81. for (auto hotkey : group.second)
  82. {
  83. QStringList columns;
  84. columns << hotkey.first << hotkey.second.keyseq.toString();
  85. QTreeWidgetItem* item = new QTreeWidgetItem(columns);
  86. toplevel_item->addChild(item);
  87. }
  88. ui.treeWidget->addTopLevelItem(toplevel_item);
  89. }
  90. // TODO: Make context configurable as well (hiding the column for now)
  91. ui.treeWidget->setColumnCount(2);
  92. ui.treeWidget->resizeColumnToContents(0);
  93. ui.treeWidget->resizeColumnToContents(1);
  94. }