瀏覽代碼

Merge pull request #42173 from nekomatata/popup-menu-click-delay

Fix popup menu item selected when opening the menu
Rémi Verschelde 5 年之前
父節點
當前提交
0c449aefa2
共有 2 個文件被更改,包括 8 次插入14 次删除
  1. 7 13
      scene/gui/popup_menu.cpp
  2. 1 1
      scene/gui/popup_menu.h

+ 7 - 13
scene/gui/popup_menu.cpp

@@ -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;

+ 1 - 1
scene/gui/popup_menu.h

@@ -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;