Fix popup menu item selected when opening the menu

In order to allow selecting items by either holding left click, or click
to open and click again to select, mouse button release was invalidated
based on the amount of mouse motion.

This was causing issues in some scenarios where an item could be
selected while opening the menu if the mouse moved enough between button
press and release.

This case could happen in the language selection of the project manager,
especially on linux, because of the order and timing of the mouse
events on x11.

This change invalidates mouse release based on a timing condition rather
than moved distance to handle any case from the display server properly.
This commit is contained in:
PouleyKetchoupp 2020-09-18 20:45:59 +02:00
parent 377c3bb256
commit 54eaaf456f
2 changed files with 8 additions and 14 deletions

View file

@ -305,12 +305,14 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
during_grabbed_click = false;
initial_button_mask = 0;
int over = _get_mouse_over(b->get_position());
if (invalidated_click) {
invalidated_click = false;
// Disable clicks under a time threshold to avoid selection right when opening the popup.
uint64_t now = OS::get_singleton()->get_ticks_msec();
uint64_t diff = now - popup_time_msec;
if (diff < 100) {
return;
}
int over = _get_mouse_over(b->get_position());
if (over < 0) {
if (!was_during_grabbed_click) {
hide();
@ -338,13 +340,6 @@ void PopupMenu::_gui_input(const Ref<InputEvent> &p_event) {
return;
}
if (invalidated_click) {
moved += m->get_relative();
if (moved.length() > 4) {
invalidated_click = false;
}
}
for (List<Rect2>::Element *E = autohide_areas.front(); E; E = E->next()) {
if (!Rect2(Point2(), get_size()).has_point(m->get_position()) && E->get().has_point(m->get_position())) {
_close_pressed();
@ -1443,7 +1438,7 @@ void PopupMenu::_bind_methods() {
void PopupMenu::popup(const Rect2 &p_bounds) {
moved = Vector2();
invalidated_click = true;
popup_time_msec = OS::get_singleton()->get_ticks_msec();
set_as_minsize();
Popup::popup(p_bounds);
}
@ -1475,7 +1470,6 @@ PopupMenu::PopupMenu() {
submenu_over = -1;
initial_button_mask = 0;
during_grabbed_click = false;
invalidated_click = false;
allow_search = true;
search_time_msec = 0;

View file

@ -105,7 +105,7 @@ class PopupMenu : public Popup {
void _activate_submenu(int over);
void _submenu_timeout();
bool invalidated_click;
uint64_t popup_time_msec = 0;
bool hide_on_item_selection;
bool hide_on_checkable_item_selection;
bool hide_on_multistate_item_selection;