1 | // SuperTux |
2 | // Copyright (C) 2015 Hume2 <teratux.mail@gmail.com> |
3 | // |
4 | // This program is free software: you can redistribute it and/or modify |
5 | // it under the terms of the GNU General Public License as published by |
6 | // the Free Software Foundation, either version 3 of the License, or |
7 | // (at your option) any later version. |
8 | // |
9 | // This program is distributed in the hope that it will be useful, |
10 | // but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | // GNU General Public License for more details. |
13 | // |
14 | // You should have received a copy of the GNU General Public License |
15 | // along with this program. If not, see <http://www.gnu.org/licenses/>. |
16 | |
17 | #ifndef HEADER_SUPERTUX_EDITOR_OVERLAY_WIDGET_HPP |
18 | #define |
19 | |
20 | #include <SDL.h> |
21 | |
22 | #include "control/input_manager.hpp" |
23 | #include "editor/widget.hpp" |
24 | #include "math/vector.hpp" |
25 | |
26 | class Color; |
27 | class DrawingContext; |
28 | class Editor; |
29 | class GameObject; |
30 | class MovingObject; |
31 | class NodeMarker; |
32 | class Path; |
33 | class Rectf; |
34 | class Tip; |
35 | |
36 | /** A widget that is drawn on top of the current sector and handles |
37 | mouse input and tool drawing. */ |
38 | class EditorOverlayWidget final : public Widget |
39 | { |
40 | public: |
41 | static bool render_background; |
42 | static bool render_grid; |
43 | static bool snap_to_grid; |
44 | static int selected_snap_grid_size; |
45 | |
46 | public: |
47 | EditorOverlayWidget(Editor& editor); |
48 | virtual ~EditorOverlayWidget(); |
49 | |
50 | virtual void draw(DrawingContext&) override; |
51 | virtual void update(float dt_sec) override; |
52 | |
53 | virtual bool on_mouse_button_up(const SDL_MouseButtonEvent& button) override; |
54 | virtual bool on_mouse_button_down(const SDL_MouseButtonEvent& button) override; |
55 | virtual bool on_mouse_motion(const SDL_MouseMotionEvent& motion) override; |
56 | virtual bool on_key_up(const SDL_KeyboardEvent& key) override; |
57 | virtual bool on_key_down(const SDL_KeyboardEvent& key) override; |
58 | |
59 | void update_pos(); |
60 | void delete_markers(); |
61 | void update_node_iterators(); |
62 | void on_level_change(); |
63 | |
64 | void edit_path(Path* path, GameObject* new_marked_object = nullptr); |
65 | |
66 | private: |
67 | void input_tile(const Vector& pos, uint32_t tile); |
68 | void put_tile(); |
69 | void draw_rectangle(); |
70 | void fill(); |
71 | void put_object(); |
72 | |
73 | void rubber_object(); |
74 | void rubber_rect(); |
75 | |
76 | void grab_object(); |
77 | void move_object(); |
78 | void clone_object(); |
79 | void hover_object(); |
80 | void (GameObject& object); |
81 | void select_object(); |
82 | void add_path_node(); |
83 | |
84 | void draw_tile_tip(DrawingContext&); |
85 | void draw_tile_grid(DrawingContext&, const Color& line_color, int tile_size = 32); |
86 | void draw_tilemap_border(DrawingContext&); |
87 | void draw_path(DrawingContext&); |
88 | |
89 | void process_left_click(); |
90 | void process_right_click(); |
91 | |
92 | // sp is sector pos, tp is pos on tilemap. |
93 | Vector tp_to_sp(const Vector& tp, int tile_size = 32); |
94 | Vector sp_to_tp(const Vector& sp, int tile_size = 32); |
95 | Vector tile_screen_pos(const Vector& tp, int tile_size = 32); |
96 | |
97 | // in sector position |
98 | Rectf drag_rect(); |
99 | Rectf tile_drag_rect(); |
100 | Rectf selection_draw_rect(); |
101 | void update_tile_selection(); |
102 | |
103 | private: |
104 | Editor& m_editor; |
105 | Vector m_hovered_tile; |
106 | Vector m_sector_pos; |
107 | Vector m_mouse_pos; |
108 | |
109 | bool m_dragging; |
110 | bool m_dragging_right; |
111 | Vector m_drag_start; |
112 | MovingObject* m_dragged_object; |
113 | |
114 | MovingObject* m_hovered_object; |
115 | GameObject* m_selected_object; |
116 | Path* m_edited_path; |
117 | NodeMarker* m_last_node_marker; |
118 | |
119 | std::unique_ptr<Tip> m_object_tip; |
120 | Vector m_obj_mouse_desync; |
121 | |
122 | private: |
123 | EditorOverlayWidget(const EditorOverlayWidget&) = delete; |
124 | EditorOverlayWidget& operator=(const EditorOverlayWidget&) = delete; |
125 | }; |
126 | |
127 | #endif |
128 | |
129 | /* EOF */ |
130 | |