| 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 | |