summaryrefslogtreecommitdiff
path: root/src/hotkeys.cpp
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2013-06-15 15:27:33 +0000
committerfrosch <frosch@openttd.org>2013-06-15 15:27:33 +0000
commitd9e9710cb3c4273d3742d0097dbe0b78511a5511 (patch)
treea107a3a43bbd18fb929a32c3298c75bba31ce7b8 /src/hotkeys.cpp
parentcd0a57fba30a7d365ab84af9846860c64da6b242 (diff)
downloadopenttd-d9e9710cb3c4273d3742d0097dbe0b78511a5511.tar.xz
(svn r25408) -Codechange: Simplify hotkeys by removing unused stuff.
Diffstat (limited to 'src/hotkeys.cpp')
-rw-r--r--src/hotkeys.cpp117
1 files changed, 79 insertions, 38 deletions
diff --git a/src/hotkeys.cpp b/src/hotkeys.cpp
index a41ede7e4..38fa662ca 100644
--- a/src/hotkeys.cpp
+++ b/src/hotkeys.cpp
@@ -116,8 +116,7 @@ static uint16 ParseKeycode(const char *start, const char *end)
* @param hotkey The hotkey object to add the keycodes to
* @param value The string to parse
*/
-template<class T>
-static void ParseHotkeys(Hotkey<T> *hotkey, const char *value)
+static void ParseHotkeys(Hotkey *hotkey, const char *value)
{
const char *start = value;
while (*start != '\0') {
@@ -192,8 +191,7 @@ static const char *KeycodeToString(uint16 keycode)
* @note The return value is a static buffer, strdup the result before calling
* this function again.
*/
-template<class T>
-const char *SaveKeycodes(const Hotkey<T> *hotkey)
+const char *SaveKeycodes(const Hotkey *hotkey)
{
static char buf[128];
buf[0] = '\0';
@@ -205,11 +203,50 @@ const char *SaveKeycodes(const Hotkey<T> *hotkey)
return buf;
}
-template<class T>
-void LoadHotkeyGroup(IniGroup *group, T *hotkey_list)
+/**
+ * Create a new Hotkey object with a single default keycode.
+ * @param default_keycode The default keycode for this hotkey.
+ * @param name The name of this hotkey.
+ * @param num Number of this hotkey, should be unique within the hotkey list.
+ */
+Hotkey::Hotkey(uint16 default_keycode, const char *name, int num) :
+ name(name),
+ num(num)
+{
+ if (default_keycode != 0) this->AddKeycode(default_keycode);
+}
+
+/**
+ * Create a new Hotkey object with multiple default keycodes.
+ * @param default_keycodes An array of default keycodes terminated with 0.
+ * @param name The name of this hotkey.
+ * @param num Number of this hotkey, should be unique within the hotkey list.
+ */
+Hotkey::Hotkey(const uint16 *default_keycodes, const char *name, int num) :
+ name(name),
+ num(num)
+{
+ const uint16 *keycode = default_keycodes;
+ while (*keycode != 0) {
+ this->AddKeycode(*keycode);
+ keycode++;
+ }
+}
+
+/**
+ * Add a keycode to this hotkey, from now that keycode will be matched
+ * in addition to any previously added keycodes.
+ * @param keycode The keycode to add.
+ */
+void Hotkey::AddKeycode(uint16 keycode)
+{
+ this->keycodes.Include(keycode);
+}
+
+void LoadHotkeyGroup(IniGroup *group, Hotkey *hotkey_list)
{
for (uint i = 0; hotkey_list[i].num != -1; i++) {
- T *hotkey = &hotkey_list[i];
+ Hotkey *hotkey = &hotkey_list[i];
IniItem *item = group->GetItem(hotkey->name, false);
if (item != NULL) {
hotkey->keycodes.Clear();
@@ -218,18 +255,16 @@ void LoadHotkeyGroup(IniGroup *group, T *hotkey_list)
}
}
-template<class T>
-void SaveHotkeyGroup(IniGroup *group, T *hotkey_list)
+void SaveHotkeyGroup(IniGroup *group, const Hotkey *hotkey_list)
{
for (uint i = 0; hotkey_list[i].num != -1; i++) {
- T *hotkey = &hotkey_list[i];
+ const Hotkey *hotkey = &hotkey_list[i];
IniItem *item = group->GetItem(hotkey->name, true);
item->SetValue(SaveKeycodes(hotkey));
}
}
-template<class T>
-void SaveLoadHotkeyGroup(IniGroup *group, T *hotkey_list, bool save)
+void SaveLoadHotkeyGroup(IniGroup *group, Hotkey *hotkey_list, bool save)
{
if (save) {
SaveHotkeyGroup(group, hotkey_list);
@@ -238,18 +273,24 @@ void SaveLoadHotkeyGroup(IniGroup *group, T *hotkey_list, bool save)
}
}
-struct MainWindow;
-struct MainToolbarWindow;
-struct ScenarioEditorToolbarWindow;
-struct TerraformToolbarWindow;
-struct ScenarioEditorLandscapeGenerationWindow;
-struct OrdersWindow;
-struct BuildAirToolbarWindow;
-struct BuildDocksToolbarWindow;
-struct BuildRailToolbarWindow;
-struct BuildRoadToolbarWindow;
-struct SignListWindow;
-struct AIDebugWindow;
+/**
+ * Check if a keycode is bound to something.
+ * @param list The list with hotkeys to check
+ * @param keycode The keycode that was pressed
+ * @param global_only Limit the search to hotkeys defined as 'global'.
+ * @return The number of the matching hotkey or -1.
+ */
+int CheckHotkeyMatch(Hotkey *list, uint16 keycode, bool global_only)
+{
+ while (list->num != -1) {
+ if (list->keycodes.Contains(keycode | WKC_GLOBAL_HOTKEY) || (!global_only && list->keycodes.Contains(keycode))) {
+ return list->num;
+ }
+ list++;
+ }
+ return -1;
+}
+
static void SaveLoadHotkeys(bool save)
{
@@ -258,23 +299,23 @@ static void SaveLoadHotkeys(bool save)
IniGroup *group;
-#define SL_HOTKEYS(name, window_name) \
- extern Hotkey<window_name> *_##name##_hotkeys;\
+#define SL_HOTKEYS(name) \
+ extern Hotkey *_##name##_hotkeys;\
group = ini->GetGroup(#name);\
SaveLoadHotkeyGroup(group, _##name##_hotkeys, save);
- SL_HOTKEYS(global, MainWindow);
- SL_HOTKEYS(maintoolbar, MainToolbarWindow);
- SL_HOTKEYS(scenedit_maintoolbar, ScenarioEditorToolbarWindow);
- SL_HOTKEYS(terraform, TerraformToolbarWindow);
- SL_HOTKEYS(terraform_editor, ScenarioEditorLandscapeGenerationWindow);
- SL_HOTKEYS(order, OrdersWindow);
- SL_HOTKEYS(airtoolbar, BuildAirToolbarWindow);
- SL_HOTKEYS(dockstoolbar, BuildDocksToolbarWindow);
- SL_HOTKEYS(railtoolbar, BuildRailToolbarWindow);
- SL_HOTKEYS(roadtoolbar, BuildRoadToolbarWindow);
- SL_HOTKEYS(signlist, SignListWindow);
- SL_HOTKEYS(aidebug, AIDebugWindow);
+ SL_HOTKEYS(global);
+ SL_HOTKEYS(maintoolbar);
+ SL_HOTKEYS(scenedit_maintoolbar);
+ SL_HOTKEYS(terraform);
+ SL_HOTKEYS(terraform_editor);
+ SL_HOTKEYS(order);
+ SL_HOTKEYS(airtoolbar);
+ SL_HOTKEYS(dockstoolbar);
+ SL_HOTKEYS(railtoolbar);
+ SL_HOTKEYS(roadtoolbar);
+ SL_HOTKEYS(signlist);
+ SL_HOTKEYS(aidebug);
#undef SL_HOTKEYS