diff options
Diffstat (limited to 'src/ai')
-rw-r--r-- | src/ai/ai_gui.cpp | 80 | ||||
-rw-r--r-- | src/ai/ai_gui.hpp | 2 |
2 files changed, 76 insertions, 6 deletions
diff --git a/src/ai/ai_gui.cpp b/src/ai/ai_gui.cpp index 69c8ff81b..04fa33af2 100644 --- a/src/ai/ai_gui.cpp +++ b/src/ai/ai_gui.cpp @@ -27,6 +27,7 @@ #include "../textfile_gui.h" #include "../widgets/dropdown_type.h" #include "../widgets/dropdown_func.h" +#include "../hotkeys.h" #include "ai.hpp" #include "../script/api/script_log.hpp" @@ -1353,10 +1354,35 @@ struct AIDebugWindow : public QueryStringBaseWindow { virtual EventState OnKeyPress(uint16 key, uint16 keycode) { EventState state = ES_NOT_HANDLED; - if (this->HandleEditBoxKey(WID_AID_BREAK_STR_EDIT_BOX, key, keycode, state) != HEBR_NOT_FOCUSED) { - /* Save the current string to static member so it can be restored next time the window is opened */ - strecpy(this->break_string, this->edit_str_buf, lastof(this->break_string)); - break_string_filter.SetFilterTerm(this->break_string); + switch (this->HandleEditBoxKey(WID_AID_BREAK_STR_EDIT_BOX, key, keycode, state)) { + case HEBR_EDITING: + /* Save the current string to static member so it can be restored next time the window is opened. */ + strecpy(this->break_string, this->edit_str_buf, lastof(this->break_string)); + break_string_filter.SetFilterTerm(this->break_string); + break; + + case HEBR_CANCEL: + /* Unfocus the text box. */ + this->UnfocusFocusedWidget(); + break; + + case HEBR_NOT_FOCUSED: { + /* Edit boxs is not globally foused => handle hotkeys of AI Debug window. */ + int num = CheckHotkeyMatch(aidebug_hotkeys, keycode, this); + if (num == -1) return ES_NOT_HANDLED; + if (this->show_break_box && num == WID_AID_BREAK_STR_EDIT_BOX) { + this->SetFocusedWidget(WID_AID_BREAK_STR_EDIT_BOX); + SetFocusedWindow(this); + state = ES_HANDLED; + } else if (this->show_break_box || num < WID_AID_BREAK_STRING_WIDGETS) { + this->OnClick(Point(), num, 1); + state = ES_HANDLED; + } + break; + } + + default: + break; } return state; } @@ -1407,6 +1433,8 @@ struct AIDebugWindow : public QueryStringBaseWindow { { this->vscroll->SetCapacityFromWidget(this, WID_AID_LOG_PANEL); } + + static Hotkey<AIDebugWindow> aidebug_hotkeys[]; }; const int AIDebugWindow::top_offset = WD_FRAMERECT_TOP + 2; @@ -1423,6 +1451,33 @@ 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); } +Hotkey<AIDebugWindow> AIDebugWindow::aidebug_hotkeys[] = { + Hotkey<AIDebugWindow>('1', "company_1", WID_AID_COMPANY_BUTTON_START), + Hotkey<AIDebugWindow>('2', "company_2", WID_AID_COMPANY_BUTTON_START + 1), + Hotkey<AIDebugWindow>('3', "company_3", WID_AID_COMPANY_BUTTON_START + 2), + Hotkey<AIDebugWindow>('4', "company_4", WID_AID_COMPANY_BUTTON_START + 3), + Hotkey<AIDebugWindow>('5', "company_5", WID_AID_COMPANY_BUTTON_START + 4), + Hotkey<AIDebugWindow>('6', "company_6", WID_AID_COMPANY_BUTTON_START + 5), + Hotkey<AIDebugWindow>('7', "company_7", WID_AID_COMPANY_BUTTON_START + 6), + Hotkey<AIDebugWindow>('8', "company_8", WID_AID_COMPANY_BUTTON_START + 7), + Hotkey<AIDebugWindow>('9', "company_9", WID_AID_COMPANY_BUTTON_START + 8), + Hotkey<AIDebugWindow>((uint16)0, "company_10", WID_AID_COMPANY_BUTTON_START + 9), + Hotkey<AIDebugWindow>((uint16)0, "company_11", WID_AID_COMPANY_BUTTON_START + 10), + Hotkey<AIDebugWindow>((uint16)0, "company_12", WID_AID_COMPANY_BUTTON_START + 11), + Hotkey<AIDebugWindow>((uint16)0, "company_13", WID_AID_COMPANY_BUTTON_START + 12), + Hotkey<AIDebugWindow>((uint16)0, "company_14", WID_AID_COMPANY_BUTTON_START + 13), + Hotkey<AIDebugWindow>((uint16)0, "company_15", WID_AID_COMPANY_BUTTON_START + 14), + Hotkey<AIDebugWindow>('S', "settings", WID_AID_SETTINGS), + Hotkey<AIDebugWindow>('0', "game_script", WID_AID_SCRIPT_GAME), + Hotkey<AIDebugWindow>((uint16)0, "reload", WID_AID_RELOAD_TOGGLE), + Hotkey<AIDebugWindow>('B', "break_toggle", WID_AID_BREAK_STR_ON_OFF_BTN), + Hotkey<AIDebugWindow>('F', "break_string", WID_AID_BREAK_STR_EDIT_BOX), + Hotkey<AIDebugWindow>('C', "match_case", WID_AID_MATCH_CASE_BTN), + Hotkey<AIDebugWindow>(WKC_RETURN, "continue", WID_AID_CONTINUE_BTN), + HOTKEY_LIST_END(AIDebugWindow) +}; +Hotkey<AIDebugWindow> *_aidebug_hotkeys = AIDebugWindow::aidebug_hotkeys; + /** Widgets for the AI debug window. */ static const NWidgetPart _nested_ai_debug_widgets[] = { NWidget(NWID_HORIZONTAL), @@ -1479,15 +1534,30 @@ static const WindowDesc _ai_debug_desc( * Open the AI debug window and select the given company. * @param show_company Display debug information about this AI company. */ -void ShowAIDebugWindow(CompanyID show_company) +Window *ShowAIDebugWindow(CompanyID show_company) { if (!_networking || _network_server) { AIDebugWindow *w = (AIDebugWindow *)BringWindowToFrontById(WC_AI_DEBUG, 0); if (w == NULL) w = new AIDebugWindow(&_ai_debug_desc, 0); if (show_company != INVALID_COMPANY) w->ChangeToAI(show_company); + return w; } else { ShowErrorMessage(STR_ERROR_AI_DEBUG_SERVER_ONLY, INVALID_STRING_ID, WL_INFO); } + + return NULL; +} + +/** + * Handler for global AI debug window hotkeys. + */ +EventState AIDebugGlobalHotkeys(uint16 key, uint16 keycode) +{ + int num = CheckHotkeyMatch<AIDebugWindow>(_aidebug_hotkeys, keycode, NULL, true); + if (num == -1) return ES_NOT_HANDLED; + Window *w = ShowAIDebugWindow(INVALID_COMPANY); + if (w == NULL) return ES_NOT_HANDLED; + return w->OnKeyPress(key, keycode); } /** diff --git a/src/ai/ai_gui.hpp b/src/ai/ai_gui.hpp index 9ed647f7e..ad6eed8fd 100644 --- a/src/ai/ai_gui.hpp +++ b/src/ai/ai_gui.hpp @@ -14,7 +14,7 @@ #include "../company_type.h" -void ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY); +Window* ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY); void ShowAIConfigWindow(); void ShowAIDebugWindowIfAIError(); void InitializeAIGui(); |