diff options
-rw-r--r-- | src/window.cpp | 38 | ||||
-rw-r--r-- | src/window_gui.h | 7 |
2 files changed, 42 insertions, 3 deletions
diff --git a/src/window.cpp b/src/window.cpp index 40b710044..297143ebe 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -86,7 +86,7 @@ char *_windows_file; /** Window description constructor. */ WindowDesc::WindowDesc(WindowPosition def_pos, const char *ini_key, int16 def_width, int16 def_height, WindowClass window_class, WindowClass parent_class, uint32 flags, - const NWidgetPart *nwid_parts, int16 nwid_length) : + const NWidgetPart *nwid_parts, int16 nwid_length, HotkeyList *hotkeys) : default_pos(def_pos), default_width(def_width), default_height(def_height), @@ -96,6 +96,7 @@ WindowDesc::WindowDesc(WindowPosition def_pos, const char *ini_key, int16 def_wi flags(flags), nwid_parts(nwid_parts), nwid_length(nwid_length), + hotkeys(hotkeys), pref_sticky(false), pref_width(0), pref_height(0) @@ -469,6 +470,29 @@ void Window::SetWidgetDirty(byte widget_index) const } /** + * A hotkey has been pressed. + * @param hotkey Hotkey index, by default a widget index of a button or editbox. + * @return #ES_HANDLED if the key press has been handled, and the hotkey is not unavailable for some reason. + */ +EventState Window::OnHotkey(int hotkey) +{ + if (hotkey < 0) return ES_NOT_HANDLED; + + NWidgetCore *nw = this->GetWidget<NWidgetCore>(hotkey); + if (nw == NULL || nw->IsDisabled()) return ES_NOT_HANDLED; + + if (nw->type == WWT_EDITBOX) { + /* Focus editbox */ + this->SetFocusedWidget(hotkey); + SetFocusedWindow(this); + } else { + /* Click button */ + this->OnClick(Point(), hotkey, 1); + } + return ES_HANDLED; +} + +/** * Do all things to make a button look clicked and mark it to be * unclicked in a few ticks. * @param widget the widget to "click" @@ -2456,12 +2480,22 @@ void HandleKeypress(uint32 raw_key) Window *w; FOR_ALL_WINDOWS_FROM_FRONT(w) { if (w->window_class == WC_MAIN_TOOLBAR) continue; + if (w->window_desc->hotkeys != NULL) { + int hotkey = w->window_desc->hotkeys->CheckMatch(keycode); + if (hotkey >= 0 && w->OnHotkey(hotkey) == ES_HANDLED) return; + } if (w->OnKeyPress(key, keycode) == ES_HANDLED) return; } w = FindWindowById(WC_MAIN_TOOLBAR, 0); /* When there is no toolbar w is null, check for that */ - if (w != NULL && w->OnKeyPress(key, keycode) == ES_HANDLED) return; + if (w != NULL) { + if (w->window_desc->hotkeys != NULL) { + int hotkey = w->window_desc->hotkeys->CheckMatch(keycode); + if (hotkey >= 0 && w->OnHotkey(hotkey) == ES_HANDLED) return; + } + if (w->OnKeyPress(key, keycode) == ES_HANDLED) return; + } HandleGlobalHotkeys(key, keycode); } diff --git a/src/window_gui.h b/src/window_gui.h index c5c37be85..cffe2a918 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -167,6 +167,8 @@ enum WindowPosition { Point GetToolbarAlignedWindowPosition(int window_width); +struct HotkeyList; + /** * High level window description */ @@ -174,7 +176,7 @@ struct WindowDesc : ZeroedMemoryAllocator { WindowDesc(WindowPosition default_pos, const char *ini_key, int16 def_width, int16 def_height, WindowClass window_class, WindowClass parent_class, uint32 flags, - const NWidgetPart *nwid_parts, int16 nwid_length); + const NWidgetPart *nwid_parts, int16 nwid_length, HotkeyList *hotkeys = NULL); ~WindowDesc(); @@ -187,6 +189,7 @@ struct WindowDesc : ZeroedMemoryAllocator { uint32 flags; ///< Flags. @see WindowDefaultFlag const NWidgetPart *nwid_parts; ///< Nested widget parts describing the window. int16 nwid_length; ///< Length of the #nwid_parts array. + HotkeyList *hotkeys; ///< Hotkeys for the window. bool pref_sticky; ///< Preferred stickyness. int16 pref_width; ///< User-preferred width of the window. Zero if unset. @@ -598,6 +601,8 @@ public: */ virtual EventState OnKeyPress(uint16 key, uint16 keycode) { return ES_NOT_HANDLED; } + virtual EventState OnHotkey(int hotkey); + /** * The state of the control key has changed * @return #ES_HANDLED if the change has been handled and no other |