Explorar o código

Merge pull request #58995 from Sauermann/fix-mouse-cursor-change-2

Update mouse cursor shape after changes
Rémi Verschelde %!s(int64=2) %!d(string=hai) anos
pai
achega
e3464c8fc8
Modificáronse 5 ficheiros con 29 adicións e 2 borrados
  1. 12 0
      scene/gui/control.cpp
  2. 1 0
      scene/main/scene_tree.cpp
  3. 2 2
      scene/main/viewport.cpp
  4. 12 0
      scene/main/window.cpp
  5. 2 0
      scene/main/window.h

+ 12 - 0
scene/gui/control.cpp

@@ -2225,7 +2225,19 @@ void Control::_window_find_focus_neighbor(const Vector2 &p_dir, Node *p_at, cons
 void Control::set_default_cursor_shape(CursorShape p_shape) {
 	ERR_FAIL_INDEX(int(p_shape), CURSOR_MAX);
 
+	if (data.default_cursor == p_shape) {
+		return;
+	}
 	data.default_cursor = p_shape;
+
+	if (!is_inside_tree()) {
+		return;
+	}
+	if (!get_global_rect().has_point(get_global_mouse_position())) {
+		return;
+	}
+
+	get_viewport()->get_base_window()->update_mouse_cursor_shape();
 }
 
 Control::CursorShape Control::get_default_cursor_shape() const {

+ 1 - 0
scene/main/scene_tree.cpp

@@ -1085,6 +1085,7 @@ void SceneTree::_change_scene(Node *p_to) {
 	if (p_to) {
 		current_scene = p_to;
 		root->add_child(p_to);
+		root->update_mouse_cursor_shape();
 	}
 }
 

+ 2 - 2
scene/main/viewport.cpp

@@ -1576,7 +1576,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
 					gui.drag_preview_id = ObjectID();
 				}
 				_propagate_viewport_notification(this, NOTIFICATION_DRAG_END);
-				// Change mouse accordingly.
+				get_base_window()->update_mouse_cursor_shape();
 			}
 
 			_gui_cancel_tooltip();
@@ -1597,7 +1597,7 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
 				gui.dragging = false;
 				gui.drag_mouse_over = nullptr;
 				_propagate_viewport_notification(this, NOTIFICATION_DRAG_END);
-				// Change mouse accordingly.
+				get_base_window()->update_mouse_cursor_shape();
 			}
 
 			gui.mouse_focus_mask &= ~mouse_button_to_mask(mb->get_button_index()); // Remove from mask.

+ 12 - 0
scene/main/window.cpp

@@ -395,6 +395,18 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) {
 	}
 }
 
+void Window::update_mouse_cursor_shape() {
+	// The default shape is set in Viewport::_gui_input_event. To instantly
+	// see the shape in the viewport we need to trigger a mouse motion event.
+	Ref<InputEventMouseMotion> mm;
+	Vector2 pos = get_mouse_position();
+	Transform2D xform = get_global_canvas_transform().affine_inverse();
+	mm.instantiate();
+	mm->set_position(pos);
+	mm->set_global_position(xform.xform(pos));
+	push_input(mm);
+}
+
 void Window::show() {
 	set_visible(true);
 }

+ 2 - 0
scene/main/window.h

@@ -220,6 +220,8 @@ public:
 	void set_visible(bool p_visible);
 	bool is_visible() const;
 
+	void update_mouse_cursor_shape();
+
 	void show();
 	void hide();