The Battle for Wesnoth 1.21.0-dev
 
Loading...
Searching...
No Matches
hotkey_command.hpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2003 - 2025
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 "global.hpp"
19#include "tooltips.hpp"
20#include "tstring.hpp"
21
22#include <bitset>
23#include <functional>
24#include <map>
25
26class config;
27
28namespace hotkey {
29
30/**
31 * Available hotkey scopes. The scope is used to allow command from
32 * non-overlapping areas of the game share the same key
33 */
40
41// For some reason std::bitset::operator| is not constexpr, so we'll construct the bitset with these values
42// FIXME: unify these with the enum above. Right now these are the proper bitmasks to initialize a bitset,
43// while the values above are used as indices to access the bits of the bitset.
44constexpr uint32_t scope_game = 1 << SCOPE_GAME;
45constexpr uint32_t scope_editor = 1 << SCOPE_EDITOR;
46constexpr uint32_t scope_main = 1 << SCOPE_MAIN_MENU;
47
67
68 // Replay
74
75 // Controls
78
79 // Camera movement
81
82 // Dialog control
84
85 // Whiteboard commands
91
92 // Misc.
99
100 // Minimap
103
104 // Multiplayer
106
107 /* Gui2 specific hotkeys. */
120
122
123 /* Editor commands */
127
128 // Palette
131
137
139
140 // Unit
143
144 // Brushes
147
148 // Tools
153
154 // Select
156 // Clipboard
160 // Selection
166
167 // Map
177
178 // Transitions
181
182 // Refresh
185
186 // Draw
188
189 // Side
193
194 // Area
199
200 // Addons
205
206 // Scenario
210
211 /* This item must stay at the end since it is used as terminator for iterating. */
214
231
232/** Gets the display name for a given hotkey category. */
234
235typedef std::bitset<SCOPE_COUNT> hk_scopes;
236
237/**
238 * hotkey_command uses t_string which might cause bugs when used at program startup,
239 * so use this for the master hotkey list (and only there).
240 */
242
243/**
244 * Stores all information related to functions that can be bound to hotkeys.
245 * this is currently a semi struct: it haves a constructor, but only const-public members.
246 */
248{
249 /** Constructs a new command from a temporary static hotkey object. */
250 hotkey_command(const hotkey_command_temp& temp_command);
251
252 /** @todo: see if we can remove this with c++20. Aggregate initialization with try_emplace?*/
253 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);
254
255 /** The command associated with this hotkey. Does not need to be unique. */
257
258 /** The unique ID. */
259 std::string id;
260
261 // since the wml_menu hotkey_command s can have different textdomains we need t_string now.
263
264 /** If hidden then don't show the command in the hotkey preferences. */
265 bool hidden;
266
267 /**
268 * Toggle hotkeys have some restrictions on what can be bound to them.
269 * They require a binding that has two states, "pressed" and "released"
270 */
271 bool toggle;
272
273 /** The visibility scope of the command. */
275
276 /** The category of the command. */
278
280
281 /** checks weather this is the null hotkey_command */
282 bool null() const;
283
284 /** returns the command that is treated as null */
285 static const hotkey_command& null_command();
286};
287
289{
290public:
292 explicit scope_changer(hk_scopes new_scopes, bool restore = true);
294private:
296 const bool restore_;
297};
298
299/**
300 * returns a container that contains all currently active hotkey_commands.
301 * everything that wants a hotkey, must be in this container
302 */
303const std::map<std::string_view, hotkey::hotkey_command>& get_hotkey_commands();
304
305/** Returns the hotkey_command with the given id */
306NOT_DANGLING const hotkey_command& get_hotkey_command(std::string_view command);
307
308/** Returns the hotkey_command with the given command */
310
313
314bool has_hotkey_command(std::string_view id);
315
316/**
317 * RAII helper class to control the lifetime of a WML hotkey_command.
318 */
320{
321public:
322 /** Don't allow copying so objects don't get erased early. */
325
326 /** But we *do* want move semantics. */
328 wml_hotkey_record& operator=(wml_hotkey_record&&) noexcept= default;
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
335private:
336 /** Handles removing the associated hotkey_command on this object's destruction. */
337 std::function<void()> cleanup_{};
338};
339
341}
A config object defines a single node in a WML file, with access to child nodes.
Definition config.hpp:157
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.
wml_hotkey_record(wml_hotkey_record &&) noexcept=default
But we do want move semantics.
std::function< void()> cleanup_
Handles removing the associated hotkey_command on this object's destruction.
const wml_hotkey_record & operator=(const wml_hotkey_record &)=delete
#define NOT_DANGLING
Definition global.hpp:65
Keyboard shortcuts for game actions.
constexpr uint32_t scope_game
void init_hotkey_commands()
bool has_hotkey_command(std::string_view id)
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
const hotkey_command & get_hotkey_command(std::string_view command)
Returns the hotkey_command with the given id.
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
@ HOTKEY_EDITOR_TOOL_VILLAGE
@ HOTKEY_MINIMAP_DRAW_VILLAGES
@ HOTKEY_EDITOR_BRUSH_NW_SE
@ HOTKEY_EDITOR_REFRESH
@ HOTKEY_EDITOR_SELECT_NONE
@ HOTKEY_TELEPORT_UNIT
@ 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_EDITOR_BRUSH_3
@ HOTKEY_EDITOR_CLIPBOARD_PASTE
@ HOTKEY_EDITOR_PARTIAL_UNDO
@ 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
@ HOTKEY_EDITOR_MAP_SAVE_AS
@ HOTKEY_UNIT_DESCRIPTION
@ HOTKEY_UPDATE_SHROUD
@ HOTKEY_REPEAT_RECRUIT
@ TITLE_SCREEN__CREDITS
@ HOTKEY_SCROLL_RIGHT
@ HOTKEY_EDITOR_SELECT_ALL
@ HOTKEY_LABEL_TEAM_TERRAIN
@ HOTKEY_EDITOR_DRAW_COORDINATES
@ HOTKEY_UNIT_HOLD_POSITION
@ HOTKEY_EDITOR_TOOL_NEXT
@ HOTKEY_EDITOR_SELECTION_EXPORT
@ HOTKEY_EDITOR_PARTIAL_UPDATE_TRANSITIONS
@ HOTKEY_EDITOR_MAP_CREATE_MASK_TO
@ HOTKEY_REPLAY_NEXT_TURN
@ HOTKEY_EDITOR_SELECTION_CUT
@ HOTKEY_EDITOR_UNIT_CHANGE_ID
@ HOTKEY_SELECT_AND_ACTION
@ HOTKEY_REPLAY_SHOW_EVERYTHING
@ HOTKEY_REPLAY_SHOW_TEAM1
@ HOTKEY_MINIMAP_DRAW_TERRAIN
@ HOTKEY_LABEL_TERRAIN
@ HOTKEY_EDITOR_DRAW_NUM_OF_BITMAPS
@ 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_HELP_TEXT_SHOWN
@ HOTKEY_EDITOR_CHANGE_ADDON_ID
@ HOTKEY_LOAD_AUTOSAVES
@ 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_EDITOR_BRUSH_2
@ HOTKEY_EDITOR_TOOL_STARTING_POSITION
@ HOTKEY_MINIMAP_CODING_TERRAIN
@ HOTKEY_EDITOR_NO_UPDATE_TRANSITIONS
@ HOTKEY_WB_EXECUTE_ACTION
@ HOTKEY_EDITOR_SELECTION_COPY
@ HOTKEY_MINIMAP_DRAW_UNITS
@ HOTKEY_EDITOR_PALETTE_DOWNSCROLL
@ HOTKEY_EDITOR_UNIT_TOGGLE_LOYAL
@ TITLE_SCREEN__PREVIOUS_TIP
@ HOTKEY_DELAY_SHROUD
@ HOTKEY_WB_BUMP_UP_ACTION
@ HOTKEY_EDITOR_MAP_APPLY_MASK
@ HOTKEY_EDITOR_LOCAL_TIME
@ HOTKEY_EDITOR_UNIT_FACING
@ HOTKEY_STATUS_TABLE
@ HOTKEY_REPLAY_NEXT_SIDE
@ HOTKEY_REPLAY_NEXT_MOVE
@ HOTKEY_REPLAY_RESET
@ HOTKEY_EDITOR_EDIT_UNIT
@ HOTKEY_EDITOR_SIDE_NEW
@ HOTKEY_EDITOR_SELECTION_RANDOMIZE
@ HOTKEY_START_NETWORK
@ HOTKEY_EDITOR_SCENARIO_NEW
@ HOTKEY_EDITOR_MAP_SWITCH
@ HOTKEY_EDITOR_SELECT_INVERSE
@ HOTKEY_EDITOR_TOGGLE_TRANSITIONS
@ 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_EDITOR_DRAW_TERRAIN_CODES
@ HOTKEY_EDITOR_MAP_TO_SCENARIO
@ HOTKEY_EDITOR_AREA_REMOVE
@ 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_EDITOR_SELECT_ADDON
@ 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_OPEN_ADDON
@ HOTKEY_EDITOR_MAP_REVERT
@ HOTKEY_WB_DELETE_ACTION
@ HOTKEY_EDITOR_CLIPBOARD_FLIP_HORIZONTAL
@ HOTKEY_MINIMAP_CODING_UNIT
STL namespace.
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
bool null() const
checks weather this is the null hotkey_command
HOTKEY_CATEGORY category
The category of the command.
static map_location::direction s