The Battle for Wesnoth  1.17.21+dev
editor_controller.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 - 2023
3  by Tomasz Sniatowski <kailoran@gmail.com>
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 
19 #include "editor/editor_main.hpp"
24 
25 #include "controller_base.hpp"
26 #include "help/help.hpp"
28 #include "mouse_handler_base.hpp"
29 #include "tooltips.hpp"
30 
31 #include "sound_music_track.hpp"
32 
33 class map_generator;
34 
35 namespace tooltips {
36 class manager;
37 }
38 
39 namespace font {
41 }
42 
43 namespace editor {
44 
45 class editor_map;
46 
47 enum menu_type {
48  MAP,
60 };
61 
62 /**
63  * The editor_controller class contains the mouse and keyboard event handling
64  * routines for the editor. It also serves as the main editor class with the
65  * general logic.
66  */
71 {
72  public:
75 
76  /**
77  * The constructor. A initial map context can be specified here, the controller
78  * will assume ownership and delete the pointer during destruction, but changes
79  * to the map can be retrieved between the main loop's end and the controller's
80  * destruction.
81  */
82  editor_controller(bool clear_id);
83 
85 
86  /** Editor main loop */
88 
89  /** Takes a screenshot **/
90  void do_screenshot(const std::string& screenshot_filename = "map_screenshot.png");
91 
92  /** Show a quit confirmation dialog and returns true if the user pressed 'yes' */
93  bool quit_confirm();
94 
95  /** Display the settings dialog, used to control e.g. the lighting settings */
96  void custom_tods_dialog();
97 
98  /** Save the map, open dialog if not named yet. */
99  void save_map() override {context_manager_->save_map();}
100 
101  /** command_executor override */
102  bool can_execute_command(const hotkey::ui_command& command) const override;
103 
104  /** command_executor override */
105  hotkey::ACTION_STATE get_action_state(const hotkey::ui_command& command) const override;
106 
107  /** command_executor override */
108  bool do_execute_command(const hotkey::ui_command& command, bool press = true, bool release = false) override;
109 
110  /** controller_base override */
111  void show_menu(const std::vector<config>& items_arg, int xloc, int yloc, bool context_menu, display& disp) override;
112 
113  void show_help() override;
114  void status_table() override;
115 
116  /** Show the preferences dialog */
117  void preferences() override;
118 
119  /** Handle hotkeys to scroll map */
120  void scroll_up(bool on) override;
121  void scroll_down(bool on) override;
122  void scroll_left(bool on) override;
123  void scroll_right(bool on) override;
124 
125  /** Grid toggle */
126  void toggle_grid() override;
127 
128  void terrain_description() override;
129  void unit_description() override;
130  void change_unit_id();
131  void rename_unit() override;
132 
133  void unit_list() override;
134 
135  /** Copy the selection on the current map to the clipboard */
136  void copy_selection();
137 
138  /** Cut the selection from the current map to the clipboard */
139  void cut_selection();
140 
141  /** Export the WML-compatible list of selected tiles to the system clipboard */
143 
144  /** Save the current selection to the active area. */
145  void save_area();
146 
147  /** Add a new area to the current context, filled with the selection if any. */
148  void add_area();
149 
150  /* mouse_handler_base overrides */
151  void mouse_motion(int x, int y, const bool browse, bool update, map_location new_loc = map_location::null_location()) override;
152  void touch_motion(int x, int y, const bool browse, bool update=false, map_location new_loc = map_location::null_location()) override;
153  editor_display& gui() override { return *gui_; }
154  const editor_display& gui() const override { return *gui_; }
155  bool allow_mouse_wheel_scroll(int x, int y) override;
156  bool right_click_show_menu(int x, int y, const bool browse) override;
157  bool left_click(int x, int y, const bool browse) override;
158  void left_drag_end(int x, int y, const bool browse) override;
159  void left_mouse_up(int x, int y, const bool browse) override;
160  bool right_click(int x, int y, const bool browse) override;
161  void right_drag_end(int x, int y, const bool browse) override;
162  void right_mouse_up(int x, int y, const bool browse) override;
163 
165 
167  {
168  return context_manager_->get_map_context();
169  }
170 
171  protected:
172  /* controller_base overrides */
173  void process_keyup_event(const SDL_Event& event) override;
174  mouse_handler_base& get_mouse_handler_base() override { return *this; }
175  editor_display& get_display() override { return *gui_; }
176 
177  /** Get the current mouse action */
178  const mouse_action& get_mouse_action() const { return toolkit_->get_mouse_action(); }
179  /** Get the current mouse action */
180  mouse_action& get_mouse_action() { return toolkit_->get_mouse_action(); }
181 
182  /**
183  * Perform an action, then delete the action object.
184  * The pointer can be nullptr, in which case nothing will happen.
185  */
186  void perform_delete(std::unique_ptr<editor_action> action);
187 
188  /**
189  * Peform an action on the current map_context, then refresh the display
190  * and delete the pointer. The pointer can be nullptr, in which case nothing will happen.
191  */
192  void perform_refresh_delete(std::unique_ptr<editor_action> action, bool drag_part = false);
193 
194 
195  virtual std::vector<std::string> additional_actions_pressed() override;
196 
197  private:
198 
199  /** init the display object and general set-up */
200  void init_gui();
201 
202  /** init the available time-of-day settings */
204 
205  /** init background music for the editor */
207 
208  /** Reload images */
209  void refresh_image_cache();
210 
211  /**
212  * Callback function passed to display to be called on queue_rerender.
213  * Redraws toolbar, brush bar and related items.
214  */
216 
217  /**
218  * Undos an action in the current map context
219  */
220  void undo() override;
221 
222  /**
223  * Redos an action in the current map context
224  */
225  void redo() override;
226 
228 
229  /** Reports object. Must be initialized before the gui_ */
230  const std::unique_ptr<reports> reports_;
231 
232  /** The display object used and owned by the editor. */
233  const std::unique_ptr<editor_display> gui_;
234 
235  /** Pre-defined time of day lighting settings for the settings dialog */
236  typedef std::map<std::string, std::pair<std::string ,std::vector<time_of_day>>> tods_map;
238 
239  /* managers */
240  public:
241  const std::unique_ptr<context_manager> context_manager_;
242 
243  static std::string current_addon_id_;
244  private:
245  std::unique_ptr<editor_toolkit> toolkit_;
247  std::unique_ptr<font::floating_label_context> floating_label_manager_;
248 
249  std::unique_ptr<help::help_manager> help_manager_;
250 
251  /** Quit main loop flag */
252  bool do_quit_;
254 
255  std::vector<sound::music_track> music_tracks_;
256 };
257 
258 } //end namespace editor
Sort-of-Singleton that many classes, both GUI and non-GUI, use to access the game data.
Definition: display.hpp:87
The editor_controller class contains the mouse and keyboard event handling routines for the editor.
const std::unique_ptr< context_manager > context_manager_
void preferences() override
Show the preferences dialog.
void refresh_image_cache()
Reload images.
void right_drag_end(int x, int y, const bool browse) override
Called whenever the right mouse drag has "ended".
bool can_execute_command(const hotkey::ui_command &command) const override
command_executor override
bool quit_confirm()
Show a quit confirmation dialog and returns true if the user pressed 'yes'.
tooltips::manager tooltip_manager_
void scroll_up(bool on) override
Handle hotkeys to scroll map.
void cut_selection()
Cut the selection from the current map to the clipboard.
void display_redraw_callback(display &)
Callback function passed to display to be called on queue_rerender.
std::unique_ptr< font::floating_label_context > floating_label_manager_
void show_menu(const std::vector< config > &items_arg, int xloc, int yloc, bool context_menu, display &disp) override
controller_base override
void undo() override
Undos an action in the current map context.
void left_mouse_up(int x, int y, const bool browse) override
Called when the left mouse button is up.
bool left_click(int x, int y, const bool browse) override
Overridden in derived classes, called on a left click (mousedown).
mouse_handler_base & get_mouse_handler_base() override
Get a reference to a mouse handler member a derived class uses.
bool allow_mouse_wheel_scroll(int x, int y) override
Derived classes can override this to disable mousewheel scrolling under some circumstances,...
void touch_motion(int x, int y, const bool browse, bool update=false, map_location new_loc=map_location::null_location()) override
virtual std::vector< std::string > additional_actions_pressed() override
void perform_refresh_delete(std::unique_ptr< editor_action > action, bool drag_part=false)
Peform an action on the current map_context, then refresh the display and delete the pointer.
void init_tods(const game_config_view &game_config)
init the available time-of-day settings
const mouse_action & get_mouse_action() const
Get the current mouse action.
map_context & get_current_map_context() const
std::unique_ptr< editor_toolkit > toolkit_
void scroll_right(bool on) override
void init_music(const game_config_view &game_config)
init background music for the editor
editor_controller & operator=(const editor_controller &)=delete
const std::unique_ptr< editor_display > gui_
The display object used and owned by the editor.
bool do_execute_command(const hotkey::ui_command &command, bool press=true, bool release=false) override
command_executor override
void export_selection_coords()
Export the WML-compatible list of selected tiles to the system clipboard.
void redo() override
Redos an action in the current map context.
editor_display & gui() override
Reference to the used display objects.
hotkey::ACTION_STATE get_action_state(const hotkey::ui_command &command) const override
command_executor override
void perform_delete(std::unique_ptr< editor_action > action)
Perform an action, then delete the action object.
void right_mouse_up(int x, int y, const bool browse) override
Called when the right mouse button is up.
virtual hotkey::command_executor * get_hotkey_command_executor() override
Optionally get a command executor to handle context menu events.
std::map< std::string, std::pair< std::string,std::vector< time_of_day > > > tods_map
Pre-defined time of day lighting settings for the settings dialog.
void mouse_motion(int x, int y, const bool browse, bool update, map_location new_loc=map_location::null_location()) override
Called when a mouse motion event takes place.
EXIT_STATUS main_loop()
Editor main loop.
editor_controller(const editor_controller &)=delete
void custom_tods_dialog()
Display the settings dialog, used to control e.g.
void do_screenshot(const std::string &screenshot_filename="map_screenshot.png")
Takes a screenshot.
void toggle_grid() override
Grid toggle.
void scroll_left(bool on) override
bool right_click(int x, int y, const bool browse) override
Overridden in derived classes, called on a right click (mousedown).
void save_area()
Save the current selection to the active area.
void process_keyup_event(const SDL_Event &event) override
Process keyup (always).
editor_display & get_display() override
Get a reference to a display member a derived class uses.
void copy_selection()
Copy the selection on the current map to the clipboard.
mouse_action & get_mouse_action()
Get the current mouse action.
void init_gui()
init the display object and general set-up
std::unique_ptr< help::help_manager > help_manager_
std::vector< sound::music_track > music_tracks_
bool right_click_show_menu(int x, int y, const bool browse) override
Called in the default right_click when the context menu is about to be shown, can be used for preproc...
static std::string current_addon_id_
void add_area()
Add a new area to the current context, filled with the selection if any.
const std::unique_ptr< reports > reports_
Reports object.
void scroll_down(bool on) override
void left_drag_end(int x, int y, const bool browse) override
Called whenever the left mouse drag has "ended".
bool do_quit_
Quit main loop flag.
const editor_display & gui() const override
Const version of gui.
void save_map() override
Save the map, open dialog if not named yet.
This class wraps around a map to provide a concise interface for the editor to work with.
Definition: map_context.hpp:63
A mouse action receives events from the controller, and responds to them by creating an appropriate e...
A class grating read only view to a vector of config objects, viewed as one config with all children ...
Implements a quit confirmation dialog.
controller_base framework: controller_base is roughly analogous to a "dialog" class in a GUI toolkit ...
static void update()
Manage the empty-palette in the editor.
Definition: action.cpp:31
Collection of helper functions relating to Pango formatting.
Game configuration data as global variables.
Definition: build_info.cpp:63
structure which will hide all current floating labels, and cause floating labels instantiated after i...
Used as the main paramneter for can_execute_command/do_execute_command These functions are used to ex...
Encapsulates the map of the game.
Definition: location.hpp:38
static const map_location & null_location()
Definition: location.hpp:81