hotkeys.cpp 3.3 KB

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