Skip to content

Commit

Permalink
Make the currently hovered control get updated on mouse-release
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
Meriipu committed Sep 28, 2020
1 parent 44657db commit e8804b9
Showing 1 changed file with 30 additions and 2 deletions.
32 changes: 30 additions & 2 deletions scene/main/viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
}
}
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit e8804b9

Please sign in to comment.