From f7640811990f5d8c0638fff960fa977019d161ed Mon Sep 17 00:00:00 2001 From: Anuradha Dissanayake Date: Mon, 2 Jun 2014 15:48:34 +1200 Subject: [PATCH] Add hotkeys plugin --- Readme.rst | 13 ++ images/hotkeys.PNG | Bin 0 -> 58207 bytes plugins/CMakeLists.txt | 1 + plugins/hotkeys.cpp | 378 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 392 insertions(+) create mode 100644 images/hotkeys.PNG create mode 100644 plugins/hotkeys.cpp diff --git a/Readme.rst b/Readme.rst index 7491c4a0c..904314722 100644 --- a/Readme.rst +++ b/Readme.rst @@ -2621,6 +2621,19 @@ materials, it returns you back to this screen. If you use this along with severa enabled materials, you should be able to place complex constructions more conveniently. +Hotkeys +======= + +Opens an in-game screen showing DFHack keybindings that are valid in the current mode. + +.. image:: images/hotkeys.png + +Type ``hotkeys`` into the DFHack console to open the screen, or bind the command to a +globally active hotkey in dfhack.init, e.g.: + + ``keybinding add Ctrl-F1 hotkeys`` + + gui/liquids =========== diff --git a/images/hotkeys.PNG b/images/hotkeys.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bdf9c76b8187d9254c801da9314c1bd0a1da4f3b GIT binary patch literal 58207 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 literal 0 HcmV?d00001 diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index 650fe1e98..193168c71 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -159,6 +159,7 @@ if (BUILD_SUPPORTED) DFHACK_PLUGIN(mousequery mousequery.cpp) DFHACK_PLUGIN(autotrade autotrade.cpp) DFHACK_PLUGIN(stocks stocks.cpp) + DFHACK_PLUGIN(hotkeys hotkeys.cpp) DFHACK_PLUGIN(treefarm treefarm.cpp) DFHACK_PLUGIN(cleanconst cleanconst.cpp) DFHACK_PLUGIN(3dveins 3dveins.cpp) diff --git a/plugins/hotkeys.cpp b/plugins/hotkeys.cpp new file mode 100644 index 000000000..52c2e2eac --- /dev/null +++ b/plugins/hotkeys.cpp @@ -0,0 +1,378 @@ +#include "uicommon.h" + +#include "df/viewscreen_dwarfmodest.h" +#include "df/ui.h" + +#include "modules/Maps.h" +#include "modules/World.h" +#include "modules/Gui.h" + +#include "PluginManager.h" + +DFHACK_PLUGIN("hotkeys"); +#define PLUGIN_VERSION 0.1 + +static map current_bindings; +static vector sorted_keys; +static bool show_usage = false; + +static void send_key(const df::interface_key &key) +{ + set< df::interface_key > keys; + keys.insert(key); + Gui::getCurViewscreen(true)->feed(&keys); +} + +static bool can_invoke(string cmdline, df::viewscreen *screen) +{ + vector cmd_parts; + split_string(&cmd_parts, cmdline, " "); + if (toLower(cmd_parts[0]) == "hotkeys") + return false; + + return Core::getInstance().getPluginManager()->CanInvokeHotkey(cmd_parts[0], screen); +} + +static void add_binding_if_valid(string sym, string cmdline, df::viewscreen *screen) +{ + if (!can_invoke(cmdline, screen)) + return; + + current_bindings[sym] = cmdline; + sorted_keys.push_back(sym); + string keyspec = sym + "@dfhack/viewscreen_hotkeys"; + Core::getInstance().AddKeyBinding(keyspec, "hotkeys invoke " + int_to_string(sorted_keys.size() - 1)); +} + +static void find_active_keybindings(df::viewscreen *screen) +{ + current_bindings.clear(); + sorted_keys.clear(); + + vector valid_keys; + for (char c = 'A'; c <= 'Z'; c++) + { + valid_keys.push_back(string(&c, 1)); + } + + for (int i = 1; i < 10; i++) + { + valid_keys.push_back("F" + int_to_string(i)); + } + + auto current_focus = Gui::getFocusString(screen); + for (int shifted = 0; shifted < 2; shifted++) + { + for (int ctrl = 0; ctrl < 2; ctrl++) + { + for (int alt = 0; alt < 2; alt++) + { + for (auto it = valid_keys.begin(); it != valid_keys.end(); it++) + { + string sym; + if (shifted) sym += "Shift-"; + if (ctrl) sym += "Ctrl-"; + if (alt) sym += "Alt-"; + sym += *it; + + auto list = Core::getInstance().ListKeyBindings(sym); + for (auto invoke_cmd = list.begin(); invoke_cmd != list.end(); invoke_cmd++) + { + bool add_temp_binding = false; + if (invoke_cmd->find(":") == string::npos) + { + add_binding_if_valid(sym, *invoke_cmd, screen); + } + else + { + vector tokens; + split_string(&tokens, *invoke_cmd, ":"); + string focus = tokens[0].substr(1); + if (prefix_matches(focus, current_focus)) + { + auto cmdline = trim(tokens[1]); + add_binding_if_valid(sym, cmdline, screen); + } + } + } + } + } + } + } +} + +static bool close_hotkeys_screen() +{ + auto screen = Core::getTopViewscreen(); + if (Gui::getFocusString(screen) != "dfhack/viewscreen_hotkeys") + return false; + + Screen::dismiss(Core::getTopViewscreen()); + for_each_(sorted_keys, [] (const string &sym) + { Core::getInstance().ClearKeyBindings(sym + "@dfhack/viewscreen_hotkeys"); }); + sorted_keys.clear(); + return true; +} + + +static void invoke_command(const int index) +{ + if (sorted_keys.size() <= index) + return; + + auto cmd = current_bindings[sorted_keys[index]]; + if (close_hotkeys_screen()) + { + Core::getInstance().setHotkeyCmd(cmd); + } +} + +class ViewscreenHotkeys : public dfhack_viewscreen +{ +public: + ViewscreenHotkeys(df::viewscreen *top_screen) : top_screen(top_screen) + { + hotkeys_column.multiselect = false; + hotkeys_column.auto_select = true; + hotkeys_column.setTitle("Key Binding"); + hotkeys_column.bottom_margin = 4; + hotkeys_column.allow_search = false; + + focus = Gui::getFocusString(top_screen); + populateColumns(); + } + + void populateColumns() + { + hotkeys_column.clear(); + + int max_key_length = 0; + for_each_(sorted_keys, [&] (const string &sym) + { if (sym.length() > max_key_length) { max_key_length = sym.length(); } }); + int padding = max_key_length + 2; + + for (int i = 0; i < sorted_keys.size(); i++) + { + string text = pad_string(sorted_keys[i], padding, false); + text += current_bindings[sorted_keys[i]]; + hotkeys_column.add(text, i+1); + + } + + help_start = hotkeys_column.fixWidth() + 2; + hotkeys_column.filterDisplay(); + } + + void feed(set *input) + { + if (hotkeys_column.feed(input)) + return; + + if (input->count(interface_key::LEAVESCREEN)) + { + close_hotkeys_screen(); + } + else if (input->count(interface_key::SELECT)) + { + invoke_command(hotkeys_column.highlighted_index); + } + else if (input->count(interface_key::CUSTOM_U)) + { + show_usage = !show_usage; + } + } + + void render() + { + if (Screen::isDismissed(this)) + return; + + dfhack_viewscreen::render(); + + Screen::clear(); + Screen::drawBorder(" Hotkeys "); + + hotkeys_column.display(true); + + int32_t y = gps->dimy - 3; + int32_t x = 2; + OutputHotkeyString(x, y, "Leave", "Esc"); + + x += 3; + OutputHotkeyString(x, y, "Invoke", "Enter or Hotkey"); + + x += 3; + OutputToggleString(x, y, "Show Usage", "u", show_usage); + + y = gps->dimy - 4; + x = 2; + OutputHotkeyString(x, y, focus.c_str(), "Context", false, help_start, COLOR_WHITE, COLOR_BROWN); + + if (sorted_keys.size() == 0) + return; + + y = 2; + x = help_start; + + auto width = gps->dimx - help_start - 2; + vector parts; + Core::cheap_tokenise(current_bindings[sorted_keys[hotkeys_column.highlighted_index]], parts); + if(parts.size() == 0) + return; + + string first = parts[0]; + parts.erase(parts.begin()); + + if (first[0] == '#') + return; + + Plugin *plugin = Core::getInstance().getPluginManager()->getPluginByCommand(first); + if (plugin) + { + for (auto i = 0; i < plugin->size(); i++) + { + auto pc = plugin->operator[](i); + if (pc.name == first) + { + OutputString(COLOR_BROWN, x, y, "Help", true, help_start); + vector lines; + string help_text = pc.description; + if (show_usage) + help_text += "\n\n" + pc.usage; + + split_string(&lines, help_text, "\n"); + for (auto it = lines.begin(); it != lines.end() && y < gps->dimy - 4; it++) + { + auto wrapped_lines = wrapString(*it, width); + for (auto wit = wrapped_lines.begin(); wit != wrapped_lines.end() && y < gps->dimy - 4; wit++) + { + OutputString(COLOR_WHITE, x, y, *wit, true, help_start); + } + } + break; + } + } + } + } + + virtual std::string getFocusString() + { + return "viewscreen_hotkeys"; + } + +private: + ListColumn hotkeys_column; + df::viewscreen *top_screen; + string focus; + + int32_t help_start; + + void resize(int32_t x, int32_t y) + { + dfhack_viewscreen::resize(x, y); + hotkeys_column.resize(); + } + + static vector wrapString(string str, int width) + { + vector result; + string excess; + if (str.length() > width) + { + auto cut_space = str.rfind(' ', width-1); + int excess_start; + if (cut_space == string::npos) + { + cut_space = width-1; + excess_start = cut_space; + } + else + { + excess_start = cut_space + 1; + } + + string line = str.substr(0, cut_space); + excess = str.substr(excess_start); + result.push_back(line); + auto excess_lines = wrapString(excess, width); + result.insert(result.end(), excess_lines.begin(), excess_lines.end()); + } + else + { + result.push_back(str); + } + + return result; + } +}; + + +static command_result hotkeys_cmd(color_ostream &out, vector & parameters) +{ + bool show_help = false; + if (parameters.empty()) + { + if (Maps::IsValid()) + { + auto top_screen = Core::getTopViewscreen(); + if (Gui::getFocusString(top_screen) != "dfhack/viewscreen_hotkeys") + { + find_active_keybindings(top_screen); + Screen::show(new ViewscreenHotkeys(top_screen)); + } + } + } + else + { + auto cmd = parameters[0][0]; + if (cmd == 'v') + { + out << "Hotkeys" << endl << "Version: " << PLUGIN_VERSION << endl; + } + else if (cmd == 'i') + { + int index; + stringstream index_raw(parameters[1]); + index_raw >> index; + invoke_command(index); + } + else + { + return CR_WRONG_USAGE; + } + } + + return CR_OK; +} + + +DFhackCExport command_result plugin_init ( color_ostream &out, std::vector &commands) +{ + if (!gps) + out.printerr("Could not insert hotkeys hooks!\n"); + + commands.push_back( + PluginCommand( + "hotkeys", "Shows ingame viewscreen with all dfhack keybindings active in current mode.", + hotkeys_cmd, false, "")); + + return CR_OK; +} + +DFhackCExport command_result plugin_shutdown ( color_ostream &out ) +{ + return CR_OK; +} + +DFhackCExport command_result plugin_onstatechange(color_ostream &out, state_change_event event) +{ + switch (event) { + case SC_MAP_LOADED: + sorted_keys.clear(); + break; + default: + break; + } + + return CR_OK; +}