diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ai/ai_gui.cpp | 27 | ||||
-rw-r--r-- | src/airport_gui.cpp | 25 | ||||
-rw-r--r-- | src/dock_gui.cpp | 24 | ||||
-rw-r--r-- | src/hotkeys.cpp | 46 | ||||
-rw-r--r-- | src/hotkeys.h | 6 | ||||
-rw-r--r-- | src/rail_gui.cpp | 27 | ||||
-rw-r--r-- | src/road_gui.cpp | 48 | ||||
-rw-r--r-- | src/signs_gui.cpp | 24 | ||||
-rw-r--r-- | src/terraform_gui.cpp | 48 | ||||
-rw-r--r-- | src/window_gui.h | 6 | ||||
-rw-r--r-- | src/window_type.h | 6 |
11 files changed, 145 insertions, 142 deletions
diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index d172780a8..01803d767 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -1402,6 +1402,19 @@ NWidgetBase *MakeCompanyButtonRowsAIDebug(int *biggest_index) return MakeCompanyButtonRows(biggest_index, WID_AID_COMPANY_BUTTON_START, WID_AID_COMPANY_BUTTON_END, 8, STR_AI_DEBUG_SELECT_AI_TOOLTIP); } +/** + * Handler for global hotkeys of the AIDebugWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState AIDebugGlobalHotkeys(int hotkey) +{ + if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED; + Window *w = ShowAIDebugWindow(INVALID_COMPANY); + if (w == NULL) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + static Hotkey aidebug_hotkeys[] = { Hotkey('1', "company_1", WID_AID_COMPANY_BUTTON_START), Hotkey('2', "company_2", WID_AID_COMPANY_BUTTON_START + 1), @@ -1427,7 +1440,7 @@ static Hotkey aidebug_hotkeys[] = { Hotkey(WKC_RETURN, "continue", WID_AID_CONTINUE_BTN), HOTKEY_LIST_END }; -HotkeyList AIDebugWindow::hotkeys("aidebug", aidebug_hotkeys); +HotkeyList AIDebugWindow::hotkeys("aidebug", aidebug_hotkeys, AIDebugGlobalHotkeys); /** Widgets for the AI debug window. */ static const NWidgetPart _nested_ai_debug_widgets[] = { @@ -1502,18 +1515,6 @@ Window *ShowAIDebugWindow(CompanyID show_company) } /** - * Handler for global AI debug window hotkeys. - */ -EventState AIDebugGlobalHotkeys(uint16 key, uint16 keycode) -{ - int num = AIDebugWindow::hotkeys.CheckMatch(keycode, true); - if (num == -1) return ES_NOT_HANDLED; - Window *w = ShowAIDebugWindow(INVALID_COMPANY); - if (w == NULL) return ES_NOT_HANDLED; - return w->OnHotkey(num); -} - -/** * Reset the AI windows to their initial state. */ void InitializeAIGui() diff --git a/src/airport_gui.cpp b/src/airport_gui.cpp index e2fed7f9c..34d0ec63d 100644 --- a/src/airport_gui.cpp +++ b/src/airport_gui.cpp @@ -138,12 +138,25 @@ struct BuildAirToolbarWindow : Window { static HotkeyList hotkeys; }; +/** + * Handler for global hotkeys of the BuildAirToolbarWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState AirportToolbarGlobalHotkeys(int hotkey) +{ + if (_game_mode != GM_NORMAL || !CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) return ES_NOT_HANDLED; + Window *w = ShowBuildAirToolbar(); + if (w == NULL) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + static Hotkey airtoolbar_hotkeys[] = { Hotkey('1', "airport", WID_AT_AIRPORT), Hotkey('2', "demolish", WID_AT_DEMOLISH), HOTKEY_LIST_END }; -HotkeyList BuildAirToolbarWindow::hotkeys("airtoolbar", airtoolbar_hotkeys); +HotkeyList BuildAirToolbarWindow::hotkeys("airtoolbar", airtoolbar_hotkeys, AirportToolbarGlobalHotkeys); static const NWidgetPart _nested_air_toolbar_widgets[] = { NWidget(NWID_HORIZONTAL), @@ -181,16 +194,6 @@ Window *ShowBuildAirToolbar() return AllocateWindowDescFront<BuildAirToolbarWindow>(&_air_toolbar_desc, TRANSPORT_AIR); } -EventState AirportToolbarGlobalHotkeys(uint16 key, uint16 keycode) -{ - if (!CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) return ES_NOT_HANDLED; - int num = BuildAirToolbarWindow::hotkeys.CheckMatch(keycode, true); - if (num == -1) return ES_NOT_HANDLED; - Window *w = ShowBuildAirToolbar(); - if (w == NULL) return ES_NOT_HANDLED; - return w->OnHotkey(num); -} - class BuildAirportWindow : public PickerWindowBase { SpriteID preview_sprite; ///< Cached airport preview sprite. int line_height; diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index c25bca0e3..03c661dd0 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -269,6 +269,19 @@ struct BuildDocksToolbarWindow : Window { static HotkeyList hotkeys; }; +/** + * Handler for global hotkeys of the BuildDocksToolbarWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState DockToolbarGlobalHotkeys(int hotkey) +{ + if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED; + Window *w = ShowBuildDocksToolbar(); + if (w == NULL) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + const uint16 _dockstoolbar_aqueduct_keys[] = {'B', '8', 0}; static Hotkey dockstoolbar_hotkeys[] = { @@ -282,7 +295,7 @@ static Hotkey dockstoolbar_hotkeys[] = { Hotkey(_dockstoolbar_aqueduct_keys, "aqueduct", WID_DT_BUILD_AQUEDUCT), HOTKEY_LIST_END }; -HotkeyList BuildDocksToolbarWindow::hotkeys("dockstoolbar", dockstoolbar_hotkeys); +HotkeyList BuildDocksToolbarWindow::hotkeys("dockstoolbar", dockstoolbar_hotkeys, DockToolbarGlobalHotkeys); /** * Nested widget parts of docks toolbar, game version. @@ -329,15 +342,6 @@ Window *ShowBuildDocksToolbar() return AllocateWindowDescFront<BuildDocksToolbarWindow>(&_build_docks_toolbar_desc, TRANSPORT_WATER); } -EventState DockToolbarGlobalHotkeys(uint16 key, uint16 keycode) -{ - int num = BuildDocksToolbarWindow::hotkeys.CheckMatch(keycode, true); - if (num == -1) return ES_NOT_HANDLED; - Window *w = ShowBuildDocksToolbar(); - if (w == NULL) return ES_NOT_HANDLED; - return w->OnHotkey(num); -} - /** * Nested widget parts of docks toolbar, scenario editor version. * Positions of #WID_DT_DEPOT, #WID_DT_STATION, and #WID_DT_BUOY widgets have changed. diff --git a/src/hotkeys.cpp b/src/hotkeys.cpp index f4a48331a..bf3bb8ef2 100644 --- a/src/hotkeys.cpp +++ b/src/hotkeys.cpp @@ -249,8 +249,8 @@ void Hotkey::AddKeycode(uint16 keycode) this->keycodes.Include(keycode); } -HotkeyList::HotkeyList(const char *ini_group, Hotkey *items) : - ini_group(ini_group), items(items) +HotkeyList::HotkeyList(const char *ini_group, Hotkey *items, GlobalHotkeyHandlerFunc global_hotkey_handler) : + global_hotkey_handler(global_hotkey_handler), ini_group(ini_group), items(items) { if (_hotkey_lists == NULL) _hotkey_lists = new SmallVector<HotkeyList*, 16>(); *_hotkey_lists->Append() = this; @@ -337,45 +337,13 @@ void SaveHotkeysToConfig() SaveLoadHotkeys(true); } -typedef EventState GlobalHotkeyHandler(uint16, uint16); - -GlobalHotkeyHandler RailToolbarGlobalHotkeys; -GlobalHotkeyHandler DockToolbarGlobalHotkeys; -GlobalHotkeyHandler AirportToolbarGlobalHotkeys; -GlobalHotkeyHandler TerraformToolbarGlobalHotkeys; -GlobalHotkeyHandler TerraformToolbarEditorGlobalHotkeys; -GlobalHotkeyHandler RoadToolbarGlobalHotkeys; -GlobalHotkeyHandler RoadToolbarEditorGlobalHotkeys; -GlobalHotkeyHandler SignListGlobalHotkeys; -GlobalHotkeyHandler AIDebugGlobalHotkeys; - - -GlobalHotkeyHandler *_global_hotkey_handlers[] = { - RailToolbarGlobalHotkeys, - DockToolbarGlobalHotkeys, - AirportToolbarGlobalHotkeys, - TerraformToolbarGlobalHotkeys, - RoadToolbarGlobalHotkeys, - SignListGlobalHotkeys, - AIDebugGlobalHotkeys, -}; - -GlobalHotkeyHandler *_global_hotkey_handlers_editor[] = { - TerraformToolbarEditorGlobalHotkeys, - RoadToolbarEditorGlobalHotkeys, -}; - - void HandleGlobalHotkeys(uint16 key, uint16 keycode) { - if (_game_mode == GM_NORMAL) { - for (uint i = 0; i < lengthof(_global_hotkey_handlers); i++) { - if (_global_hotkey_handlers[i](key, keycode) == ES_HANDLED) return; - } - } else if (_game_mode == GM_EDITOR) { - for (uint i = 0; i < lengthof(_global_hotkey_handlers_editor); i++) { - if (_global_hotkey_handlers_editor[i](key, keycode) == ES_HANDLED) return; - } + for (HotkeyList **list = _hotkey_lists->Begin(); list != _hotkey_lists->End(); ++list) { + if ((*list)->global_hotkey_handler == NULL) continue; + + int hotkey = (*list)->CheckMatch(keycode, true); + if (hotkey >= 0 && ((*list)->global_hotkey_handler(hotkey) == ES_HANDLED)) return; } } diff --git a/src/hotkeys.h b/src/hotkeys.h index ce57de6f6..19791663d 100644 --- a/src/hotkeys.h +++ b/src/hotkeys.h @@ -14,6 +14,7 @@ #include "core/smallvec_type.hpp" #include "gfx_type.h" +#include "window_type.h" /** * All data for a single hotkey. The name (for saving/loading a configfile), @@ -38,7 +39,9 @@ struct IniFile; * List of hotkeys for a window. */ struct HotkeyList { - HotkeyList(const char *ini_group, Hotkey *items); + typedef EventState (*GlobalHotkeyHandlerFunc)(int hotkey); + + HotkeyList(const char *ini_group, Hotkey *items, GlobalHotkeyHandlerFunc global_hotkey_handler = NULL); ~HotkeyList(); void Load(IniFile *ini); @@ -46,6 +49,7 @@ struct HotkeyList { int CheckMatch(uint16 keycode, bool global_only = false) const; + GlobalHotkeyHandlerFunc global_hotkey_handler; private: const char *ini_group; Hotkey *items; diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 38afd73c6..446268d73 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -755,6 +755,20 @@ struct BuildRailToolbarWindow : Window { static HotkeyList hotkeys; }; +/** + * Handler for global hotkeys of the BuildRailToolbarWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState RailToolbarGlobalHotkeys(int hotkey) +{ + if (_game_mode != GM_NORMAL || !CanBuildVehicleInfrastructure(VEH_TRAIN)) return ES_NOT_HANDLED; + extern RailType _last_built_railtype; + Window *w = ShowBuildRailToolbar(_last_built_railtype); + if (w == NULL) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + const uint16 _railtoolbar_autorail_keys[] = {'5', 'A' | WKC_GLOBAL_HOTKEY, 0}; static Hotkey railtoolbar_hotkeys[] = { @@ -774,7 +788,7 @@ static Hotkey railtoolbar_hotkeys[] = { Hotkey('C', "convert", WID_RAT_CONVERT_RAIL), HOTKEY_LIST_END }; -HotkeyList BuildRailToolbarWindow::hotkeys("railtoolbar", railtoolbar_hotkeys); +HotkeyList BuildRailToolbarWindow::hotkeys("railtoolbar", railtoolbar_hotkeys, RailToolbarGlobalHotkeys); static const NWidgetPart _nested_build_rail_widgets[] = { NWidget(NWID_HORIZONTAL), @@ -845,17 +859,6 @@ Window *ShowBuildRailToolbar(RailType railtype) return new BuildRailToolbarWindow(&_build_rail_desc, railtype); } -EventState RailToolbarGlobalHotkeys(uint16 key, uint16 keycode) -{ - if (!CanBuildVehicleInfrastructure(VEH_TRAIN)) return ES_NOT_HANDLED; - extern RailType _last_built_railtype; - int num = BuildRailToolbarWindow::hotkeys.CheckMatch(keycode, true); - if (num == -1) return ES_NOT_HANDLED; - Window *w = ShowBuildRailToolbar(_last_built_railtype); - if (w == NULL) return ES_NOT_HANDLED; - return w->OnHotkey(num); -} - /* TODO: For custom stations, respect their allowed platforms/lengths bitmasks! * --pasky */ diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 989e0a50e..388033382 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -660,6 +660,33 @@ struct BuildRoadToolbarWindow : Window { static HotkeyList hotkeys; }; +/** + * Handler for global hotkeys of the BuildRoadToolbarWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState RoadToolbarGlobalHotkeys(int hotkey) +{ + Window *w = NULL; + switch (_game_mode) { + case GM_NORMAL: { + extern RoadType _last_built_roadtype; + w = ShowBuildRoadToolbar(_last_built_roadtype); + break; + } + + case GM_EDITOR: + w = ShowBuildRoadScenToolbar(); + break; + + default: + break; + } + + if (w == NULL) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + static Hotkey roadtoolbar_hotkeys[] = { Hotkey('1', "build_x", WID_ROT_ROAD_X), Hotkey('2', "build_y", WID_ROT_ROAD_Y), @@ -674,7 +701,7 @@ static Hotkey roadtoolbar_hotkeys[] = { Hotkey('R', "remove", WID_ROT_REMOVE), HOTKEY_LIST_END }; -HotkeyList BuildRoadToolbarWindow::hotkeys("roadtoolbar", roadtoolbar_hotkeys); +HotkeyList BuildRoadToolbarWindow::hotkeys("roadtoolbar", roadtoolbar_hotkeys, RoadToolbarGlobalHotkeys); static const NWidgetPart _nested_build_road_widgets[] = { @@ -774,16 +801,6 @@ Window *ShowBuildRoadToolbar(RoadType roadtype) return AllocateWindowDescFront<BuildRoadToolbarWindow>(roadtype == ROADTYPE_ROAD ? &_build_road_desc : &_build_tramway_desc, TRANSPORT_ROAD); } -EventState RoadToolbarGlobalHotkeys(uint16 key, uint16 keycode) -{ - extern RoadType _last_built_roadtype; - int num = BuildRoadToolbarWindow::hotkeys.CheckMatch(keycode, true); - if (num == -1) return ES_NOT_HANDLED; - Window *w = ShowBuildRoadToolbar(_last_built_roadtype); - if (w == NULL) return ES_NOT_HANDLED; - return w->OnHotkey(num); -} - static const NWidgetPart _nested_build_road_scen_widgets[] = { NWidget(NWID_HORIZONTAL), NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN), @@ -829,15 +846,6 @@ Window *ShowBuildRoadScenToolbar() return AllocateWindowDescFront<BuildRoadToolbarWindow>(&_build_road_scen_desc, TRANSPORT_ROAD); } -EventState RoadToolbarEditorGlobalHotkeys(uint16 key, uint16 keycode) -{ - int num = BuildRoadToolbarWindow::hotkeys.CheckMatch(keycode, true); - if (num == -1) return ES_NOT_HANDLED; - Window *w = ShowBuildRoadScenToolbar(); - if (w == NULL) return ES_NOT_HANDLED; - return w->OnHotkey(num); -} - struct BuildRoadDepotWindow : public PickerWindowBase { BuildRoadDepotWindow(WindowDesc *desc, Window *parent) : PickerWindowBase(desc, parent) { diff --git a/src/signs_gui.cpp b/src/signs_gui.cpp index 3966742f0..665603cf0 100644 --- a/src/signs_gui.cpp +++ b/src/signs_gui.cpp @@ -338,11 +338,24 @@ struct SignListWindow : Window, SignList { static HotkeyList hotkeys; }; +/** + * Handler for global hotkeys of the SignListWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState SignListGlobalHotkeys(int hotkey) +{ + if (_game_mode == GM_MENU) return ES_NOT_HANDLED; + Window *w = ShowSignList(); + if (w == NULL) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + static Hotkey signlist_hotkeys[] = { Hotkey('F', "focus_filter_box", SLHK_FOCUS_FILTER_BOX), HOTKEY_LIST_END }; -HotkeyList SignListWindow::hotkeys("signlist", signlist_hotkeys); +HotkeyList SignListWindow::hotkeys("signlist", signlist_hotkeys, SignListGlobalHotkeys); static const NWidgetPart _nested_sign_list_widgets[] = { NWidget(NWID_HORIZONTAL), @@ -391,15 +404,6 @@ Window *ShowSignList() return AllocateWindowDescFront<SignListWindow>(&_sign_list_desc, 0); } -EventState SignListGlobalHotkeys(uint16 key, uint16 keycode) -{ - int num = SignListWindow::hotkeys.CheckMatch(keycode, true); - if (num == -1) return ES_NOT_HANDLED; - Window *w = ShowSignList(); - if (w == NULL) return ES_NOT_HANDLED; - return w->OnHotkey(num); -} - /** * Actually rename the sign. * @param index the sign to rename. diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index 7240391e0..d1815ca9b 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -290,6 +290,19 @@ struct TerraformToolbarWindow : Window { static HotkeyList hotkeys; }; +/** + * Handler for global hotkeys of the TerraformToolbarWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState TerraformToolbarGlobalHotkeys(int hotkey) +{ + if (_game_mode != GM_NORMAL) return ES_NOT_HANDLED; + Window *w = ShowTerraformToolbar(NULL); + if (w == NULL) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + static Hotkey terraform_hotkeys[] = { Hotkey('Q' | WKC_GLOBAL_HOTKEY, "lower", WID_TT_LOWER_LAND), Hotkey('W' | WKC_GLOBAL_HOTKEY, "raise", WID_TT_RAISE_LAND), @@ -301,7 +314,7 @@ static Hotkey terraform_hotkeys[] = { Hotkey('P', "placeobject", WID_TT_PLACE_OBJECT), HOTKEY_LIST_END }; -HotkeyList TerraformToolbarWindow::hotkeys("terraform", terraform_hotkeys); +HotkeyList TerraformToolbarWindow::hotkeys("terraform", terraform_hotkeys, TerraformToolbarGlobalHotkeys); static const NWidgetPart _nested_terraform_widgets[] = { NWidget(NWID_HORIZONTAL), @@ -371,15 +384,6 @@ Window *ShowTerraformToolbar(Window *link) return w; } -EventState TerraformToolbarGlobalHotkeys(uint16 key, uint16 keycode) -{ - int num = TerraformToolbarWindow::hotkeys.CheckMatch(keycode, true); - if (num == -1) return ES_NOT_HANDLED; - Window *w = ShowTerraformToolbar(NULL); - if (w == NULL) return ES_NOT_HANDLED; - return w->OnHotkey(num); -} - static byte _terraform_size = 1; /** @@ -712,6 +716,19 @@ struct ScenarioEditorLandscapeGenerationWindow : Window { static HotkeyList hotkeys; }; +/** + * Handler for global hotkeys of the ScenarioEditorLandscapeGenerationWindow. + * @param hotkey Hotkey + * @return ES_HANDLED if hotkey was accepted. + */ +static EventState TerraformToolbarEditorGlobalHotkeys(int hotkey) +{ + if (_game_mode != GM_EDITOR) return ES_NOT_HANDLED; + Window *w = ShowEditorTerraformToolbar(); + if (w == NULL) return ES_NOT_HANDLED; + return w->OnHotkey(hotkey); +} + static Hotkey terraform_editor_hotkeys[] = { Hotkey('D' | WKC_GLOBAL_HOTKEY, "dynamite", WID_ETT_DEMOLISH), Hotkey('Q' | WKC_GLOBAL_HOTKEY, "lower", WID_ETT_LOWER_LAND), @@ -723,7 +740,7 @@ static Hotkey terraform_editor_hotkeys[] = { HOTKEY_LIST_END }; -HotkeyList ScenarioEditorLandscapeGenerationWindow::hotkeys("terraform_editor", terraform_editor_hotkeys); +HotkeyList ScenarioEditorLandscapeGenerationWindow::hotkeys("terraform_editor", terraform_editor_hotkeys, TerraformToolbarEditorGlobalHotkeys); static WindowDesc _scen_edit_land_gen_desc( WDP_AUTO, "toolbar_landscape_scen", 0, 0, @@ -741,12 +758,3 @@ Window *ShowEditorTerraformToolbar() { return AllocateWindowDescFront<ScenarioEditorLandscapeGenerationWindow>(&_scen_edit_land_gen_desc, 0); } - -EventState TerraformToolbarEditorGlobalHotkeys(uint16 key, uint16 keycode) -{ - int num = ScenarioEditorLandscapeGenerationWindow::hotkeys.CheckMatch(keycode, true); - if (num == -1) return ES_NOT_HANDLED; - Window *w = ShowEditorTerraformToolbar(); - if (w == NULL) return ES_NOT_HANDLED; - return w->OnHotkey(num); -} diff --git a/src/window_gui.h b/src/window_gui.h index cffe2a918..820d90e2b 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -20,12 +20,6 @@ #include "core/smallvec_type.hpp" #include "core/smallmap_type.hpp" -/** State of handling an event. */ -enum EventState { - ES_HANDLED, ///< The passed event is handled. - ES_NOT_HANDLED, ///< The passed event is not handled. -}; - /** * Flags to describe the look of the frame */ diff --git a/src/window_type.h b/src/window_type.h index 29fe15dc0..9727cf9f1 100644 --- a/src/window_type.h +++ b/src/window_type.h @@ -691,4 +691,10 @@ struct Window; /** Number to differentiate different windows of the same class */ typedef int32 WindowNumber; +/** State of handling an event. */ +enum EventState { + ES_HANDLED, ///< The passed event is handled. + ES_NOT_HANDLED, ///< The passed event is not handled. +}; + #endif /* WINDOW_TYPE_H */ |