4040#include " scene/gui/menu_button.h"
4141
4242void Camera2DEditor::edit (Camera2D *p_camera) {
43- if (p_camera == selected_camera) {
43+ if (p_camera == selected_camera) {
4444 return ;
4545 }
4646 const Callable update_overlays = callable_mp (plugin, &EditorPlugin::update_overlays);
4747
4848 if (selected_camera) {
4949 selected_camera->disconnect (SceneStringName (draw), update_overlays);
50+ if (drag_type != Drag::NONE) {
51+ selected_camera->set_limit_rect (drag_revert);
52+ }
53+ drag_type = Drag::NONE;
54+ hover_type = Drag::NONE;
55+ CanvasItemEditor::get_singleton ()->set_cursor_shape_override (CURSOR_ARROW);
5056 }
5157 selected_camera = p_camera;
5258
@@ -65,32 +71,13 @@ bool Camera2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
6571 if (mb.is_valid ()) {
6672 if (mb->get_button_index () == MouseButton::LEFT) {
6773 if (mb->is_pressed ()) {
68- const Rect2 limit_rect = selected_camera->get_limit_rect ();
69- const Vector2 pos = CanvasItemEditor::get_singleton ()->get_canvas_transform ().affine_inverse ().xform (mb->get_position ());
70- drag_revert = limit_rect;
71-
72- if (pos.y > limit_rect.position .y && pos.y < limit_rect.get_end ().y ) {
73- if (Math::abs (pos.x - limit_rect.position .x ) < 8 ) {
74- drag_type = Drag::LEFT;
75- return true ;
76- } else if (Math::abs (pos.x - limit_rect.get_end ().x ) < 8 ) {
77- drag_type = Drag::RIGHT;
78- return true ;
79- }
80- } else if (pos.x > limit_rect.position .x && pos.x < limit_rect.get_end ().x ) {
81- if (Math::abs (pos.y - limit_rect.position .y ) < 8 ) {
82- drag_type = Drag::TOP;
83- return true ;
84- } else if (Math::abs (pos.y - limit_rect.get_end ().y ) < 8 ) {
85- drag_type = Drag::BOTTOM;
86- return true ;
87- }
88- }
74+ if (hover_type != Drag::NONE) {
75+ Vector2 pos = CanvasItemEditor::get_singleton ()->get_canvas_transform ().affine_inverse ().xform (mb->get_position ());
76+ const Rect2 limit_rect = selected_camera->get_limit_rect ();
8977
90- if (limit_rect. has_point (pos)) {
91- drag_type = Drag::CENTER ;
78+ drag_type = hover_type;
79+ drag_revert = selected_camera-> get_limit_rect () ;
9280 center_drag_point = pos - limit_rect.position ;
93- plugin->update_overlays ();
9481 return true ;
9582 }
9683 } else if (drag_type != Drag::NONE) {
@@ -109,18 +96,21 @@ bool Camera2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
10996 selected_camera->set_limit_rect (drag_revert);
11097 drag_type = Drag::NONE;
11198 plugin->update_overlays ();
99+ _update_hover (mb->get_position ());
112100 return true ;
113101 }
114102 return false ;
115103 }
116104
117- if (drag_type == Drag::NONE) {
118- return false ;
119- }
120-
121105 Ref<InputEventMouseMotion> mm = p_event;
122106 if (mm.is_valid ()) {
123- Vector2 pos = CanvasItemEditor::get_singleton ()->get_canvas_transform ().affine_inverse ().xform (mm->get_position ());
107+ Vector2 pos = mm->get_position ();
108+ if (drag_type == Drag::NONE) {
109+ _update_hover (pos);
110+ return false ;
111+ }
112+
113+ pos = CanvasItemEditor::get_singleton ()->get_canvas_transform ().affine_inverse ().xform (pos);
124114 pos = CanvasItemEditor::get_singleton ()->snap_point (pos);
125115
126116 switch (drag_type) {
@@ -150,6 +140,9 @@ bool Camera2DEditor::forward_canvas_gui_input(const Ref<InputEvent> &p_event) {
150140 selected_camera->set_limit_rect (target_rect);
151141 plugin->update_overlays ();
152142 } break ;
143+
144+ case Drag::NONE: {
145+ } break ;
153146 }
154147 return true ;
155148 }
@@ -193,6 +186,55 @@ void Camera2DEditor::_update_overlays_if_needed(Camera2D *p_camera) {
193186 }
194187}
195188
189+ void Camera2DEditor::_update_hover (const Vector2 &p_mouse_pos) {
190+ if (CanvasItemEditor::get_singleton ()->get_current_tool () != CanvasItemEditor::TOOL_SELECT) {
191+ hover_type = Drag::NONE;
192+ CanvasItemEditor::get_singleton ()->set_cursor_shape_override ();
193+ return ;
194+ }
195+
196+ const Rect2 limit_rect = CanvasItemEditor::get_singleton ()->get_canvas_transform ().xform (selected_camera->get_limit_rect ());
197+ const float drag_tolerance = 8.0 ;
198+
199+ hover_type = Drag::NONE;
200+ if (p_mouse_pos.y > limit_rect.position .y && p_mouse_pos.y < limit_rect.get_end ().y ) {
201+ if (Math::abs (p_mouse_pos.x - limit_rect.position .x ) < drag_tolerance) {
202+ hover_type = Drag::LEFT;
203+ } else if (Math::abs (p_mouse_pos.x - limit_rect.get_end ().x ) < drag_tolerance) {
204+ hover_type = Drag::RIGHT;
205+ }
206+ } else if (p_mouse_pos.x > limit_rect.position .x && p_mouse_pos.x < limit_rect.get_end ().x ) {
207+ if (Math::abs (p_mouse_pos.y - limit_rect.position .y ) < drag_tolerance) {
208+ hover_type = Drag::TOP;
209+ } else if (Math::abs (p_mouse_pos.y - limit_rect.get_end ().y ) < drag_tolerance) {
210+ hover_type = Drag::BOTTOM;
211+ }
212+ }
213+
214+ /* Temporarily disabled, because it needs more changes.
215+ if (hover_type == Drag::NONE && limit_rect.has_point(p_mouse_pos)) {
216+ hover_type = Drag::CENTER;
217+ }
218+ */
219+
220+ switch (hover_type) {
221+ case Drag::NONE: {
222+ CanvasItemEditor::get_singleton ()->set_cursor_shape_override ();
223+ } break ;
224+ case Drag::LEFT:
225+ case Drag::RIGHT: {
226+ CanvasItemEditor::get_singleton ()->set_cursor_shape_override (CURSOR_HSIZE);
227+ } break ;
228+ case Drag::TOP:
229+ case Drag::BOTTOM: {
230+ CanvasItemEditor::get_singleton ()->set_cursor_shape_override (CURSOR_VSIZE);
231+ } break ;
232+ case Drag::CENTER: {
233+ CanvasItemEditor::get_singleton ()->set_cursor_shape_override (CURSOR_MOVE);
234+ } break ;
235+ }
236+ }
237+
196238void Camera2DEditor::_notification (int p_what) {
197239 switch (p_what) {
198240 case NOTIFICATION_THEME_CHANGED: {
0 commit comments