summaryrefslogtreecommitdiff
path: root/scene/main
diff options
context:
space:
mode:
authorMeriipu <Meriipu@users.noreply.github.com>2020-08-06 15:44:05 +0200
committerMeriipu <Meriipu@users.noreply.github.com>2020-09-28 16:04:01 +0200
commite8804b9978a4bd2647e1367bc2258a19d73dcc95 (patch)
tree538b6a7b5f1426126178c6f09f5ce35f8bdc6bb0 /scene/main
parent44657db3e21faddcf111696d3a05d93046fcea5a (diff)
Make the currently hovered control get updated on mouse-release
Previously, when the mouse was released after dragging a scrollbar, its highlight was not dropped (if the mouse cursor was still inside the viewport). This seems to be because the currently hovered control only gets updated when the mouse is moved. This commit fixes the dropping of the cosmetic highlight by running the check for whether the currently hovered control has changed on mouse-clicks, in addition to to the existing mouse-movements.
Diffstat (limited to 'scene/main')
-rw-r--r--scene/main/viewport.cpp32
1 files changed, 30 insertions, 2 deletions
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index 08a212d58b..b5cba78fe2 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -1801,6 +1801,8 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
if (mb.is_valid()) {
gui.key_event_accepted = false;
+ Control *over = nullptr;
+
Point2 mpos = mb->get_position();
if (mb->is_pressed()) {
Size2 pos = mpos;
@@ -1955,6 +1957,31 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
gui.drag_data=Variant(); //always clear
}*/
+ // In case the mouse was released after for example dragging a scrollbar,
+ // check whether the current control is different from the stored one. If
+ // it is different, rather than wait for it to be updated the next time the
+ // mouse is moved, notify the control so that it can e.g. drop the highlight.
+ // This code is duplicated from the mm.is_valid()-case further below.
+ if (gui.mouse_focus) {
+ over = gui.mouse_focus;
+ } else {
+ over = _gui_find_control(mpos);
+ }
+
+ if (gui.mouse_focus_mask == 0 && over != gui.mouse_over) {
+ if (gui.mouse_over) {
+ _gui_call_notification(gui.mouse_over, Control::NOTIFICATION_MOUSE_EXIT);
+ }
+
+ _gui_cancel_tooltip();
+
+ if (over) {
+ _gui_call_notification(over, Control::NOTIFICATION_MOUSE_ENTER);
+ }
+ }
+
+ gui.mouse_over = over;
+
set_input_as_handled();
}
}
@@ -2015,10 +2042,11 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
}
}
+ // These sections of code are reused in the mb.is_valid() case further up
+ // for the purpose of notifying controls about potential changes in focus
+ // when the mousebutton is released.
if (gui.mouse_focus) {
over = gui.mouse_focus;
- //recompute focus_inv_xform again here
-
} else {
over = _gui_find_control(mpos);
}