The Battle for Wesnoth  1.13.10+dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
editor_controller.hpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2008 - 2017 by Tomasz Sniatowski <kailoran@gmail.com>
3  Part of the Battle for Wesnoth Project http://www.wesnoth.org/
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY.
11 
12  See the COPYING file for more details.
13 */
14 
15 #pragma once
16 
18 #include "editor/editor_main.hpp"
23 
24 #include "controller_base.hpp"
25 #include "help/help.hpp"
27 #include "mouse_handler_base.hpp"
28 #include "tooltips.hpp"
29 
30 #include "sound_music_track.hpp"
31 
32 class map_generator;
33 
34 namespace tooltips {
35 struct manager;
36 }
37 
38 namespace font {
40 }
41 
42 namespace editor {
43 
44 class editor_map;
45 
47 
48 enum menu_type {
49  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:
73  editor_controller(const editor_controller&) = delete;
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  */
83 
85 
86  /** Editor main loop */
88 
89  /** Takes a screenshot **/
90  void do_screenshot(const std::string& screenshot_filename = "map_screenshot.bmp");
91 
92  /** Process a hotkey quit command */
93  void hotkey_quit();
94 
95  /** Show a quit confirmation dialog and returns true if the user pressed 'yes' */
96  bool quit_confirm();
97 
98  /** Display the settings dialog, used to control e.g. the lighting settings */
99  void custom_tods_dialog();
100 
101  /** Save the map, open dialog if not named yet. */
102  void save_map() override {context_manager_->save_map();}
103 
104  /** command_executor override */
105  bool can_execute_command(const hotkey::hotkey_command& command, int index = -1) const override;
106 
107  /** command_executor override */
109 
110  /** command_executor override */
111  bool execute_command(const hotkey::hotkey_command& command, int index = -1, bool press=true) override;
112 
113  /** controller_base override */
114  void show_menu(const std::vector<config>& items_arg, int xloc, int yloc, bool context_menu, display& disp) override;
115 
116  void show_help() override;
117  void status_table() override;
118 
119  /** Show the preferences dialog */
120  void preferences() override;
121 
122  /** Handle hotkeys to scroll map */
123  void scroll_up(bool on) override;
124  void scroll_down(bool on) override;
125  void scroll_left(bool on) override;
126  void scroll_right(bool on) override;
127 
128  /** Grid toggle */
129  void toggle_grid() override;
130 
131  void terrain_description() override;
132  void unit_description() override;
133  void change_unit_id();
134  void rename_unit() override;
135 
136  void unit_list() override;
137 
138  /** Copy the selection on the current map to the clipboard */
139  void copy_selection();
140 
141  /** Cut the selection from the current map to the clipboard */
142  void cut_selection();
143 
144  /** Export the WML-compatible list of selected tiles to the system clipboard */
146 
148 
149  /** Save the current selection to the active area. */
150  void save_area();
151 
152  /** Add a new area to the current context, filled with the selection if any. */
153  void add_area();
154 
155  /* mouse_handler_base overrides */
156  void mouse_motion(int x, int y, const bool browse, bool update, map_location new_loc = map_location::null_location()) override;
157  editor_display& gui() override { return *gui_; }
158  const editor_display& gui() const override { return *gui_; }
159  bool allow_mouse_wheel_scroll(int x, int y) override;
160  bool right_click_show_menu(int x, int y, const bool browse) override;
161  bool left_click(int x, int y, const bool browse) override;
162  void left_drag_end(int x, int y, const bool browse) override;
163  void left_mouse_up(int x, int y, const bool browse) override;
164  bool right_click(int x, int y, const bool browse) override;
165  void right_drag_end(int x, int y, const bool browse) override;
166  void right_mouse_up(int x, int y, const bool browse) override;
167 
169 
171  {
172  return context_manager_->get_map_context();
173  }
174 
175  protected:
176  /* controller_base overrides */
177  void process_keyup_event(const SDL_Event& event) override;
178  mouse_handler_base& get_mouse_handler_base() override { return *this; }
179  editor_display& get_display() override { return *gui_; }
180 
181  /** Get the current mouse action */
182  const mouse_action& get_mouse_action() const { return toolkit_->get_mouse_action(); }
183  /** Get the current mouse action */
184  mouse_action& get_mouse_action() { return toolkit_->get_mouse_action(); }
185 
186  /**
187  * Perform an action, then delete the action object.
188  * The pointer can be nullptr, in which case nothing will happen.
189  */
190  void perform_delete(editor_action* action);
191 
192  /**
193  * Peform an action on the current map_context, then refresh the display
194  * and delete the pointer. The pointer can be nullptr, in which case nothing will happen.
195  */
196  void perform_refresh_delete(editor_action* action, bool drag_part = false);
197 
198 
199  virtual std::vector<std::string> additional_actions_pressed() override;
200 
201  private:
202 
203  /** init the display object and general set-up */
204  void init_gui();
205 
206  /** init the available time-of-day settings */
207  void init_tods(const config& game_config);
208 
209  /** init background music for the editor */
210  void init_music(const config& game_config);
211 
212  /** Load editor-specific tooltips */
213  void load_tooltips();
214 
215  /** Reload images */
216  void refresh_image_cache();
217 
218  /**
219  * Callback function passed to display to be called on each redraw_everything run.
220  * Redraws toolbar, brush bar and related items.
221  */
223 
224  /**
225  * Undos an action in the current map context
226  */
227  void undo() override;
228 
229  /**
230  * Redos an action in the current map context
231  */
232  void redo() override;
233 
235 
236  /** Reports object. Must be initialized before the gui_ */
237  const std::unique_ptr<reports> reports_;
238 
239  /** The display object used and owned by the editor. */
240  const std::unique_ptr<editor_display> gui_;
241 
242  /** Pre-defined time of day lighting settings for the settings dialog */
243  typedef std::map<std::string, std::pair<std::string ,std::vector<time_of_day> > > tods_map;
244  tods_map tods_;
245 
246  /* managers */
247  public:
248  const std::unique_ptr<context_manager> context_manager_;
249  private:
250  std::unique_ptr<editor_toolkit> toolkit_;
252  std::unique_ptr<font::floating_label_context> floating_label_manager_;
253 
254  std::unique_ptr<help::help_manager> help_manager_;
255 
256  /** Quit main loop flag */
257  bool do_quit_;
259 
260  std::vector<sound::music_track> music_tracks_;
261 };
262 
263 } //end namespace editor
void perform_refresh_delete(editor_action *action, bool drag_part=false)
Peform an action on the current map_context, then refresh the display and delete the pointer...
void copy_selection()
Copy the selection on the current map to the clipboard.
std::vector< char_t > string
size_t index(const utf8::string &str, const size_t index)
Codepoint index corresponding to the nth character in a UTF-8 string.
Definition: unicode.cpp:71
std::unique_ptr< font::floating_label_context > floating_label_manager_
tooltips::manager tooltip_manager_
void save_map() override
Save the map, open dialog if not named yet.
void export_selection_coords()
Export the WML-compatible list of selected tiles to the system clipboard.
void do_screenshot(const std::string &screenshot_filename="map_screenshot.bmp")
Takes a screenshot.
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.
Note: Specific to sdl_ttf.
std::string get_left_button_function()
bool quit_confirm()
Show a quit confirmation dialog and returns true if the user pressed 'yes'.
std::unique_ptr< editor_toolkit > toolkit_
void custom_tods_dialog()
Display the settings dialog, used to control e.g.
void process_keyup_event(const SDL_Event &event) override
Process keyup (always).
void left_drag_end(int x, int y, const bool browse) override
Called whenever the left mouse drag has "ended".
Definition: video.hpp:29
editor_display & gui() override
Reference to the used display objects.
bool can_execute_command(const hotkey::hotkey_command &command, int index=-1) const override
command_executor override
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...
void save_area()
Save the current selection to the active area.
void preferences() override
Show the preferences dialog.
Stores all information related to functions that can be bound to hotkeys.
editor_display & get_display() override
Get a reference to a display member a derived class uses.
void add_area()
Add a new area to the current context, filled with the selection if any.
controller_base framework: controller_base is roughly analogous to a "dialog" class in a GUI toolkit ...
The editor_controller class contains the mouse and keyboard event handling routines for the editor...
editor_controller & operator=(const editor_controller &)=delete
void load_tooltips()
Load editor-specific tooltips.
const std::unique_ptr< editor_display > gui_
The display object used and owned by the editor.
map_context & get_current_map_context() const
void show_menu(const std::vector< config > &items_arg, int xloc, int yloc, bool context_menu, display &disp) override
controller_base override
void right_mouse_up(int x, int y, const bool browse) override
Called when the right mouse button is up.
void right_drag_end(int x, int y, const bool browse) override
Called whenever the right mouse drag has "ended".
void init_tods(const config &game_config)
init the available time-of-day settings
Implements a quit confirmation dialog.
void undo() override
Undos an action in the current map context.
bool execute_command(const hotkey::hotkey_command &command, int index=-1, bool press=true) override
command_executor override
virtual hotkey::command_executor * get_hotkey_command_executor() override
Optionally get a command executor to handle context menu events.
void refresh_image_cache()
Reload images.
Manage the empty-palette in the editor.
Definition: action.cpp:29
static const map_location & null_location()
Definition: location.hpp:220
Encapsulates the map of the game.
Definition: location.hpp:40
tooltips.
void init_gui()
init the display object and general set-up
void scroll_right(bool on) override
void left_mouse_up(int x, int y, const bool browse) override
Called when the left mouse button is up.
Game configuration data as global variables.
Definition: build_info.cpp:53
structure which will hide all current floating labels, and cause floating labels instantiated after i...
Base class for all editor actions.
Definition: action_base.hpp:40
virtual std::vector< std::string > additional_actions_pressed() override
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 each redraw_everything run.
This class wraps around a map to provide a concise interface for the editor to work with...
Definition: map_context.hpp:55
editor_controller(const editor_controller &)=delete
std::vector< sound::music_track > music_tracks_
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.
mouse_handler_base & get_mouse_handler_base() override
Get a reference to a mouse handler member a derived class uses.
void toggle_grid() override
Grid toggle.
const mouse_action & get_mouse_action() const
Get the current mouse action.
void perform_delete(editor_action *action)
Perform an action, then delete the action object.
bool allow_mouse_wheel_scroll(int x, int y) override
Derived classes can override this to disable mousewheel scrolling under some circumstances, e.g.
void scroll_left(bool on) override
bool left_click(int x, int y, const bool browse) override
Overridden in derived classes, called on a left click (mousedown).
bool do_quit_
Quit main loop flag.
EXIT_STATUS main_loop()
Editor main loop.
std::unique_ptr< help::help_manager > help_manager_
const editor_display & gui() const override
Const version of gui.
void init_music(const config &game_config)
init background music for the editor
A mouse action receives events from the controller, and responds to them by creating an appropriate e...
const std::unique_ptr< context_manager > context_manager_
A config object defines a single node in a WML file, with access to child nodes.
Definition: config.hpp:93
void scroll_down(bool on) override
void hotkey_quit()
Process a hotkey quit command.
void scroll_up(bool on) override
Handle hotkeys to scroll map.
bool right_click(int x, int y, const bool browse) override
Overridden in derived classes, called on a right click (mousedown).
const std::unique_ptr< reports > reports_
Reports object.
void redo() override
Redos an action in the current map context.
hotkey::ACTION_STATE get_action_state(hotkey::HOTKEY_COMMAND command, int index) const override
command_executor override
mouse_action & get_mouse_action()
Get the current mouse action.