Forráskód Böngészése

Fix crash when pressing up on an empty `PopupMenu`

Michael Alexsander 3 éve
szülő
commit
06df59887b
1 módosított fájl, 69 hozzáadás és 67 törlés
  1. 69 67
      scene/gui/popup_menu.cpp

+ 69 - 67
scene/gui/popup_menu.cpp

@@ -278,102 +278,104 @@ void PopupMenu::_submenu_timeout() {
 void PopupMenu::gui_input(const Ref<InputEvent> &p_event) {
 	ERR_FAIL_COND(p_event.is_null());
 
-	if (p_event->is_action("ui_down") && p_event->is_pressed()) {
-		int search_from = mouse_over + 1;
-		if (search_from >= items.size()) {
-			search_from = 0;
-		}
-
-		bool match_found = false;
-		for (int i = search_from; i < items.size(); i++) {
-			if (!items[i].separator && !items[i].disabled) {
-				mouse_over = i;
-				emit_signal(SNAME("id_focused"), i);
-				scroll_to_item(i);
-				control->update();
-				set_input_as_handled();
-				match_found = true;
-				break;
+	if (!items.is_empty()) {
+		if (p_event->is_action("ui_down") && p_event->is_pressed()) {
+			int search_from = mouse_over + 1;
+			if (search_from >= items.size()) {
+				search_from = 0;
 			}
-		}
 
-		if (!match_found) {
-			// If the last item is not selectable, try re-searching from the start.
-			for (int i = 0; i < search_from; i++) {
+			bool match_found = false;
+			for (int i = search_from; i < items.size(); i++) {
 				if (!items[i].separator && !items[i].disabled) {
 					mouse_over = i;
 					emit_signal(SNAME("id_focused"), i);
 					scroll_to_item(i);
 					control->update();
 					set_input_as_handled();
+					match_found = true;
 					break;
 				}
 			}
-		}
-	} else if (p_event->is_action("ui_up") && p_event->is_pressed()) {
-		int search_from = mouse_over - 1;
-		if (search_from < 0) {
-			search_from = items.size() - 1;
-		}
 
-		bool match_found = false;
-		for (int i = search_from; i >= 0; i--) {
-			if (!items[i].separator && !items[i].disabled) {
-				mouse_over = i;
-				emit_signal(SNAME("id_focused"), i);
-				scroll_to_item(i);
-				control->update();
-				set_input_as_handled();
-				match_found = true;
-				break;
+			if (!match_found) {
+				// If the last item is not selectable, try re-searching from the start.
+				for (int i = 0; i < search_from; i++) {
+					if (!items[i].separator && !items[i].disabled) {
+						mouse_over = i;
+						emit_signal(SNAME("id_focused"), i);
+						scroll_to_item(i);
+						control->update();
+						set_input_as_handled();
+						break;
+					}
+				}
+			}
+		} else if (p_event->is_action("ui_up") && p_event->is_pressed()) {
+			int search_from = mouse_over - 1;
+			if (search_from < 0) {
+				search_from = items.size() - 1;
 			}
-		}
 
-		if (!match_found) {
-			// If the first item is not selectable, try re-searching from the end.
-			for (int i = items.size() - 1; i >= search_from; i--) {
+			bool match_found = false;
+			for (int i = search_from; i >= 0; i--) {
 				if (!items[i].separator && !items[i].disabled) {
 					mouse_over = i;
 					emit_signal(SNAME("id_focused"), i);
 					scroll_to_item(i);
 					control->update();
 					set_input_as_handled();
+					match_found = true;
 					break;
 				}
 			}
-		}
-	} else if (p_event->is_action("ui_left") && p_event->is_pressed()) {
-		Node *n = get_parent();
-		if (n) {
-			if (Object::cast_to<PopupMenu>(n)) {
-				hide();
-				set_input_as_handled();
-			} else if (Object::cast_to<MenuBar>(n)) {
-				Object::cast_to<MenuBar>(n)->gui_input(p_event);
-				set_input_as_handled();
-				return;
+
+			if (!match_found) {
+				// If the first item is not selectable, try re-searching from the end.
+				for (int i = items.size() - 1; i >= search_from; i--) {
+					if (!items[i].separator && !items[i].disabled) {
+						mouse_over = i;
+						emit_signal(SNAME("id_focused"), i);
+						scroll_to_item(i);
+						control->update();
+						set_input_as_handled();
+						break;
+					}
+				}
 			}
-		}
-	} else if (p_event->is_action("ui_right") && p_event->is_pressed()) {
-		if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator && !items[mouse_over].submenu.is_empty() && submenu_over != mouse_over) {
-			_activate_submenu(mouse_over, true);
-			set_input_as_handled();
-		} else {
+		} else if (p_event->is_action("ui_left") && p_event->is_pressed()) {
 			Node *n = get_parent();
-			if (n && Object::cast_to<MenuBar>(n)) {
-				Object::cast_to<MenuBar>(n)->gui_input(p_event);
-				set_input_as_handled();
-				return;
+			if (n) {
+				if (Object::cast_to<PopupMenu>(n)) {
+					hide();
+					set_input_as_handled();
+				} else if (Object::cast_to<MenuBar>(n)) {
+					Object::cast_to<MenuBar>(n)->gui_input(p_event);
+					set_input_as_handled();
+					return;
+				}
 			}
-		}
-	} else if (p_event->is_action("ui_accept") && p_event->is_pressed()) {
-		if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator) {
-			if (!items[mouse_over].submenu.is_empty() && submenu_over != mouse_over) {
+		} else if (p_event->is_action("ui_right") && p_event->is_pressed()) {
+			if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator && !items[mouse_over].submenu.is_empty() && submenu_over != mouse_over) {
 				_activate_submenu(mouse_over, true);
+				set_input_as_handled();
 			} else {
-				activate_item(mouse_over);
+				Node *n = get_parent();
+				if (n && Object::cast_to<MenuBar>(n)) {
+					Object::cast_to<MenuBar>(n)->gui_input(p_event);
+					set_input_as_handled();
+					return;
+				}
+			}
+		} else if (p_event->is_action("ui_accept") && p_event->is_pressed()) {
+			if (mouse_over >= 0 && mouse_over < items.size() && !items[mouse_over].separator) {
+				if (!items[mouse_over].submenu.is_empty() && submenu_over != mouse_over) {
+					_activate_submenu(mouse_over, true);
+				} else {
+					activate_item(mouse_over);
+				}
+				set_input_as_handled();
 			}
-			set_input_as_handled();
 		}
 	}