Update mouse cursor shape after changes
This fixes some cases where the mouse cursor shape did not change automatically, but instead required a MouseMove to update.
This commit is contained in:
parent
e5594c26b1
commit
52da6f1a44
5 changed files with 29 additions and 2 deletions
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -392,6 +392,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);
|
||||
}
|
||||
|
|
|
@ -220,6 +220,8 @@ public:
|
|||
void set_visible(bool p_visible);
|
||||
bool is_visible() const;
|
||||
|
||||
void update_mouse_cursor_shape();
|
||||
|
||||
void show();
|
||||
void hide();
|
||||
|
||||
|
|
Loading…
Reference in a new issue