The Battle for Wesnoth  1.19.0-dev
hotkey_command.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2003 - 2024
3  by David White <dave@whitevine.net>
4  Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY.
12 
13  See the COPYING file for more details.
14 */
15 
16 #pragma once
17 
18 #include "tooltips.hpp"
19 #include "tstring.hpp"
20 
21 #include <bitset>
22 #include <functional>
23 #include <map>
24 
25 class config;
26 
27 namespace hotkey {
28 
29 /**
30  * Available hotkey scopes. The scope is used to allow command from
31  * non-overlapping areas of the game share the same key
32  */
33 enum scope {
38 };
39 
40 // For some reason std::bitset::operator| is not constexpr, so we'll construct the bitset with these values
41 // FIXME: unify these with the enum above. Right now these are the proper bitmasks to initialize a bitset,
42 // while the values above are used as indices to access the bits of the bitset.
43 constexpr uint32_t scope_game = 1 << SCOPE_GAME;
44 constexpr uint32_t scope_editor = 1 << SCOPE_EDITOR;
45 constexpr uint32_t scope_main = 1 << SCOPE_MAIN_MENU;
46 
66 
67  // Replay
73 
74  // Controls
77 
78  // Camera movement
80 
81  // Dialog control
83 
84  // Whiteboard commands
90 
91  // Misc.
98 
99  // Minimap
102 
103  /* Gui2 specific hotkeys. */
116 
118 
119  /* Editor commands */
122 
123  // Palette
126 
132 
133  // Unit
136 
137  // Brushes
140 
141  // Tools
146 
147  // Select
149  // Clipboard
153  // Selection
159 
160  // Map
169 
170  // Transitions
173 
174  // Refresh
177 
178  // Draw
180 
181  // Side
185 
186  // Area
191 
192  // Addons
195 
196  // Scenario
200 
201  /* This item must stay at the end since it is used as terminator for iterating. */
203 };
204 
219  HKCAT_PLACEHOLDER // Keep this one last
220 };
221 
222 /** Gets the display name for a given hotkey category. */
224 
225 typedef std::bitset<SCOPE_COUNT> hk_scopes;
226 
227 /**
228  * hotkey_command uses t_string which might cause bugs when used at program startup,
229  * so use this for the master hotkey list (and only there).
230  */
231 struct hotkey_command_temp;
232 
233 /**
234  * Stores all information related to functions that can be bound to hotkeys.
235  * this is currently a semi struct: it haves a constructor, but only const-public members.
236  */
238 {
239  hotkey_command() = delete;
240 
241  /** Constructs a new command from a temporary static hotkey object. */
242  hotkey_command(const hotkey_command_temp& temp_command);
243 
244  /** @todo: see if we can remove this with c++20. Aggregate initialization with try_emplace?*/
245  hotkey_command(HOTKEY_COMMAND cmd, const std::string& id, const t_string& desc, bool hidden, bool toggle, hk_scopes scope, HOTKEY_CATEGORY category, const t_string& tooltip);
246 
247  hotkey_command(const hotkey_command&) = default;
249 
250  /** The command associated with this hotkey. Does not need to be unique. */
252 
253  /** The unique ID. */
254  std::string id;
255 
256  // since the wml_menu hotkey_command s can have different textdomains we need t_string now.
258 
259  /** If hidden then don't show the command in the hotkey preferences. */
260  bool hidden;
261 
262  /**
263  * Toggle hotkeys have some restrictions on what can be bound to them.
264  * They require a binding that has two states, "pressed" and "released"
265  */
266  bool toggle;
267 
268  /** The visibility scope of the command. */
270 
271  /** The category of the command. */
273 
275 
276  /** checks weather this is the null hotkey_command */
277  bool null() const;
278 
279  /** returns the command that is treated as null */
280  static const hotkey_command& null_command();
281 
282  /**
283  * the execute_command argument was changed from HOTKEY_COMMAND to hotkey_command,
284  * to be able to call it with HOTKEY_COMMAND, this function was created
285  */
287 };
288 
290 {
291 public:
292  scope_changer();
293  explicit scope_changer(hk_scopes new_scopes, bool restore = true);
294  ~scope_changer();
295 private:
297  const bool restore_;
298 };
299 
300 /**
301  * returns a container that contains all currently active hotkey_commands.
302  * everything that wants a hotkey, must be in this container
303  */
304 const std::map<std::string_view, hotkey::hotkey_command>& get_hotkey_commands();
305 
306 /** returns the hotkey_command with the given name */
307 const hotkey_command& get_hotkey_command(const std::string& command);
308 
309 bool is_scope_active(scope s);
311 
312 bool has_hotkey_command(const std::string& id);
313 
314 /**
315  * RAII helper class to control the lifetime of a WML hotkey_command.
316  */
318 {
319 public:
320  wml_hotkey_record() = default;
321 
322  /** Don't allow copying so objects don't get erased early. */
325 
326  /** But we *do* want move semantics. */
329 
330  /** Registers a hotkey_command for a WML hotkey with the given ID if one does not already exist. */
331  wml_hotkey_record(const std::string& id, const t_string& description, const config& default_hotkey);
332 
334 
335 private:
336  /** Handles removing the associated hotkey_command on this object's destruction. */
337  std::function<void()> cleanup_{};
338 };
339 
340 void init_hotkey_commands();
341 }
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:159
RAII helper class to control the lifetime of a WML hotkey_command.
wml_hotkey_record(const wml_hotkey_record &)=delete
Don't allow copying so objects don't get erased early.
const wml_hotkey_record & operator=(const wml_hotkey_record &)=delete
std::function< void()> cleanup_
Handles removing the associated hotkey_command on this object's destruction.
wml_hotkey_record(wml_hotkey_record &&)=default
But we do want move semantics.
wml_hotkey_record & operator=(wml_hotkey_record &&)=default
Keyboard shortcuts for game actions.
bool has_hotkey_command(const std::string &id)
constexpr uint32_t scope_game
void init_hotkey_commands()
const std::map< std::string_view, hotkey::hotkey_command > & get_hotkey_commands()
returns a container that contains all currently active hotkey_commands.
std::bitset< SCOPE_COUNT > hk_scopes
bool is_scope_active(scope s)
scope
Available hotkey scopes.
constexpr uint32_t scope_main
t_string get_translatable_category_name(HOTKEY_CATEGORY category)
Gets the display name for a given hotkey category.
constexpr uint32_t scope_editor
const hotkey_command & get_hotkey_command(const std::string &command)
returns the hotkey_command with the given name
@ HOTKEY_EDITOR_TOOL_VILLAGE
@ HOTKEY_MINIMAP_DRAW_VILLAGES
@ HOTKEY_EDITOR_BRUSH_NW_SE
@ HOTKEY_EDITOR_REFRESH
@ HOTKEY_FULLSCREEN
@ HOTKEY_EDITOR_SELECT_NONE
@ HOTKEY_OBJECTIVES
@ HOTKEY_ANIMATE_MAP
@ HOTKEY_SCREENSHOT
@ HOTKEY_SPEAK_ALLY
@ HOTKEY_ACCELERATED
@ HOTKEY_EDITOR_CLIPBOARD_ROTATE_CCW
@ HOTKEY_MOUSE_SCROLL
@ HOTKEY_EDITOR_PALETTE_GROUPS
@ HOTKEY_TERRAIN_DESCRIPTION
@ HOTKEY_EDITOR_PALETTE_UPSCROLL
@ HOTKEY_END_UNIT_TURN
@ HOTKEY_EDITOR_PALETTE_ITEMS_CLEAR
@ HOTKEY_LABEL_SETTINGS
@ HOTKEY_EDITOR_SIDE_REMOVE
@ HOTKEY_WB_EXECUTE_ALL_ACTIONS
@ HOTKEY_WB_SUPPOSE_DEAD
@ HOTKEY_EDITOR_BRUSH_NEXT
@ HOTKEY_HELP_ABOUT_SAVELOAD
@ HOTKEY_EDITOR_TOOL_LABEL
@ HOTKEY_EDITOR_CLIPBOARD_ROTATE_CW
@ HOTKEY_REPLAY_PLAY
@ HOTKEY_EDITOR_BRUSH_3
@ HOTKEY_SCROLL_LEFT
@ HOTKEY_SAVE_GAME
@ HOTKEY_EDITOR_CLIPBOARD_PASTE
@ HOTKEY_EDITOR_PARTIAL_UNDO
@ HOTKEY_SPEAK_ALL
@ HOTKEY_EDITOR_UNIT_TOGGLE_CANRECRUIT
@ HOTKEY_EDITOR_PALETTE_ITEM_SWAP
@ HOTKEY_EDITOR_TOOL_PAINT
@ HOTKEY_EDITOR_MAP_CLOSE
@ HOTKEY_EDITOR_MAP_GENERATE
@ HOTKEY_SHOW_ENEMY_MOVES
@ HOTKEY_EDITOR_SELECTION_FLIP
@ HOTKEY_EDITOR_SCHEDULE
@ HOTKEY_ACHIEVEMENTS
@ HOTKEY_DESELECT_HEX
@ HOTKEY_EDITOR_TOOL_FILL
@ TITLE_SCREEN__MULTIPLAYER
@ HOTKEY_EDITOR_SCENARIO_SAVE_AS
@ HOTKEY_EDITOR_PLAYLIST
@ TITLE_SCREEN__ADDONS
@ HOTKEY_EDITOR_MAP_SAVE_AS
@ HOTKEY_UNIT_DESCRIPTION
@ HOTKEY_UPDATE_SHROUD
@ HOTKEY_REPEAT_RECRUIT
@ TITLE_SCREEN__CREDITS
@ HOTKEY_REPLAY_STOP
@ HOTKEY_KILL_UNIT
@ HOTKEY_SCROLL_RIGHT
@ HOTKEY_SAVE_REPLAY
@ HOTKEY_EDITOR_SELECT_ALL
@ HOTKEY_LABEL_TEAM_TERRAIN
@ HOTKEY_EDITOR_DRAW_COORDINATES
@ HOTKEY_UNIT_HOLD_POSITION
@ HOTKEY_EDITOR_TOOL_NEXT
@ TITLE_SCREEN__EDITOR
@ HOTKEY_EDITOR_SELECTION_EXPORT
@ HOTKEY_EDITOR_PARTIAL_UPDATE_TRANSITIONS
@ HOTKEY_EDITOR_MAP_CREATE_MASK_TO
@ HOTKEY_REPLAY_NEXT_TURN
@ HOTKEY_TOGGLE_GRID
@ HOTKEY_EDITOR_SELECTION_CUT
@ HOTKEY_EDITOR_UNIT_CHANGE_ID
@ HOTKEY_SURRENDER
@ HOTKEY_SELECT_AND_ACTION
@ HOTKEY_CLEAR_MSG
@ HOTKEY_REPLAY_SHOW_EVERYTHING
@ HOTKEY_REPLAY_SHOW_TEAM1
@ HOTKEY_MINIMAP_DRAW_TERRAIN
@ HOTKEY_LABEL_TERRAIN
@ HOTKEY_EDITOR_DRAW_NUM_OF_BITMAPS
@ HOTKEY_CUSTOM_CMD
@ HOTKEY_STOP_NETWORK
@ HOTKEY_MAP_SCREENSHOT
@ HOTKEY_CLEAR_LABELS
@ HOTKEY_EDITOR_AREA_ADD
@ HOTKEY_EDITOR_BRUSH_SW_NE
@ HOTKEY_EDITOR_TOOL_UNIT
@ HOTKEY_EDITOR_BRUSH_DEFAULT
@ HOTKEY_CONTINUE_MOVE
@ HOTKEY_BEST_ENEMY_MOVES
@ HOTKEY_QUIT_TO_DESKTOP
@ HOTKEY_EDITOR_CHANGE_ADDON_ID
@ HOTKEY_EDITOR_CUSTOM_TODS
@ HOTKEY_EDITOR_REFRESH_IMAGE_CACHE
@ HOTKEY_EDITOR_SELECTION_FILL
@ HOTKEY_TOGGLE_ELLIPSES
@ HOTKEY_EDITOR_CLIPBOARD_FLIP_VERTICAL
@ HOTKEY_EDITOR_MAP_SAVE_ALL
@ HOTKEY_EDITOR_BRUSH_1
@ HOTKEY_EDITOR_SELECTION_ROTATE
@ HOTKEY_EDITOR_MAP_LOAD
@ HOTKEY_RENAME_UNIT
@ HOTKEY_EDITOR_BRUSH_2
@ HOTKEY_EDITOR_TOOL_STARTING_POSITION
@ HOTKEY_MINIMAP_CODING_TERRAIN
@ HOTKEY_EDITOR_NO_UPDATE_TRANSITIONS
@ HOTKEY_LOAD_GAME
@ TITLE_SCREEN__TEST
@ HOTKEY_WB_EXECUTE_ACTION
@ HOTKEY_EDITOR_SELECTION_COPY
@ HOTKEY_MINIMAP_DRAW_UNITS
@ HOTKEY_CHANGE_SIDE
@ HOTKEY_EDITOR_PALETTE_DOWNSCROLL
@ HOTKEY_EDITOR_UNIT_TOGGLE_LOYAL
@ TITLE_SCREEN__PREVIOUS_TIP
@ HOTKEY_CYCLE_UNITS
@ HOTKEY_DELAY_SHROUD
@ HOTKEY_WB_BUMP_UP_ACTION
@ HOTKEY_EDITOR_MAP_APPLY_MASK
@ HOTKEY_EDITOR_LOCAL_TIME
@ HOTKEY_CREATE_UNIT
@ HOTKEY_REPLAY_EXIT
@ HOTKEY_EDITOR_UNIT_FACING
@ HOTKEY_PREFERENCES
@ HOTKEY_STATUS_TABLE
@ HOTKEY_REPLAY_NEXT_SIDE
@ HOTKEY_DELETE_UNIT
@ HOTKEY_MOVE_ACTION
@ HOTKEY_REPLAY_NEXT_MOVE
@ HOTKEY_REPLAY_RESET
@ HOTKEY_TOUCH_HEX
@ HOTKEY_EDITOR_SIDE_NEW
@ HOTKEY_EDITOR_SELECTION_RANDOMIZE
@ HOTKEY_START_NETWORK
@ HOTKEY_WB_TOGGLE
@ HOTKEY_EDITOR_SCENARIO_NEW
@ TITLE_SCREEN__CORES
@ HOTKEY_EDITOR_MAP_SWITCH
@ HOTKEY_STATISTICS
@ HOTKEY_EDITOR_SELECT_INVERSE
@ HOTKEY_EDITOR_TOGGLE_TRANSITIONS
@ HOTKEY_UNIT_LIST
@ HOTKEY_SCROLL_DOWN
@ HOTKEY_EDITOR_AUTO_UPDATE_TRANSITIONS
@ HOTKEY_REPLAY_SKIP_ANIMATION
@ HOTKEY_ZOOM_DEFAULT
@ HOTKEY_EDITOR_MAP_INFO
@ HOTKEY_WB_BUMP_DOWN_ACTION
@ TITLE_SCREEN__CAMPAIGN
@ HOTKEY_EDITOR_AREA_RENAME
@ HOTKEY_EDITOR_MAP_RESIZE
@ HOTKEY_SCROLL_UP
@ HOTKEY_EDITOR_DRAW_TERRAIN_CODES
@ HOTKEY_EDITOR_AREA_REMOVE
@ HOTKEY_SELECT_HEX
@ HOTKEY_QUIT_GAME
@ HOTKEY_EDITOR_UPDATE_TRANSITIONS
@ HOTKEY_EDITOR_TOOL_SELECT
@ HOTKEY_EDITOR_MAP_NEW
@ HOTKEY_EDITOR_MAP_SAVE
@ HOTKEY_EDITOR_AREA_SAVE
@ HOTKEY_EDITOR_REMOVE_LOCATION
@ HOTKEY_EDITOR_SIDE_EDIT
@ HOTKEY_AI_FORMULA
@ HOTKEY_EDITOR_TOOL_ITEM
@ TITLE_SCREEN__RELOAD_WML
@ HOTKEY_REPLAY_SHOW_EACH
@ TITLE_SCREEN__NEXT_TIP
@ HOTKEY_CYCLE_BACK_UNITS
@ HOTKEY_EDITOR_UNIT_TOGGLE_RENAMEABLE
@ HOTKEY_EDITOR_SCENARIO_EDIT
@ HOTKEY_EDITOR_MAP_REVERT
@ HOTKEY_WB_DELETE_ACTION
@ HOTKEY_EDITOR_CLIPBOARD_FLIP_HORIZONTAL
@ HOTKEY_MINIMAP_CODING_UNIT
Stores all information related to functions that can be bound to hotkeys.
bool toggle
Toggle hotkeys have some restrictions on what can be bound to them.
HOTKEY_COMMAND command
The command associated with this hotkey.
std::string id
The unique ID.
hk_scopes scope
The visibility scope of the command.
bool hidden
If hidden then don't show the command in the hotkey preferences.
static const hotkey_command & null_command()
returns the command that is treated as null
HOTKEY_CATEGORY category
The category of the command.
static const hotkey_command & get_command_by_command(HOTKEY_COMMAND command)
the execute_command argument was changed from HOTKEY_COMMAND to hotkey_command, to be able to call it...
hotkey_command(const hotkey_command &)=default
hotkey_command & operator=(const hotkey_command &)=default
static map_location::DIRECTION s