From 62913838237c474419c68124ea7aebd74e72c628 Mon Sep 17 00:00:00 2001 From: frosch Date: Sat, 15 Jun 2013 15:30:16 +0000 Subject: (svn r25411) -Add: Window::OnHotkey --- src/window.cpp | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) (limited to 'src/window.cpp') 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) @@ -468,6 +469,29 @@ void Window::SetWidgetDirty(byte widget_index) const this->nested_array[widget_index]->SetDirty(this); } +/** + * 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(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. @@ -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); } -- cgit v1.2.3-54-g00ecf