Browse Source

Fix PopupMenu and MenuButton not activating items with shortcut inside submenus

Bojidar Marinov 9 years ago
parent
commit
b7d79c93f4
3 changed files with 24 additions and 22 deletions
  1. 1 17
      scene/gui/menu_button.cpp
  2. 22 4
      scene/gui/popup_menu.cpp
  3. 1 1
      scene/gui/popup_menu.h

+ 1 - 17
scene/gui/menu_button.cpp

@@ -53,23 +53,7 @@ void MenuButton::_unhandled_key_input(InputEvent p_event) {
 			code|=KEY_MASK_SHIFT;
 
 
-		int item = popup->find_item_by_accelerator(code);
-
-
-		if (item>=0 && ! popup->is_item_disabled(item))
-			popup->activate_item(item);
-		/*
-		for(int i=0;i<items.size();i++) {
-
-
-			if (items[i].accel==0)
-				continue;
-
-			if (items[i].accel==code) {
-
-				emit_signal("item_pressed",items[i].ID);
-			}
-		}*/
+		int item = popup->activate_item_by_accelerator(code);
 	}
 
 }

+ 22 - 4
scene/gui/popup_menu.cpp

@@ -740,15 +740,33 @@ int PopupMenu::get_item_count() const {
 	return items.size();
 }
 
-int PopupMenu::find_item_by_accelerator(uint32_t p_accel) const {
+bool PopupMenu::activate_item_by_accelerator(uint32_t p_accel) {
 
 	int il=items.size();
 	for(int i=0;i<il;i++) {
+		if (is_item_disabled(i))
+			continue;
 
-		if (items[i].accel==p_accel)
-			return i;
+		if (items[i].accel==p_accel) {
+			activate_item(i);
+			return true;
+		}
+
+		if (items[i].submenu!="") {
+			Node* n = get_node(items[i].submenu);
+			if(!n)
+				continue;
+
+			PopupMenu* pm = n->cast_to<PopupMenu>();
+			if(!pm)
+				continue;
+
+			if(pm->activate_item_by_accelerator(p_accel)) {
+				return true;
+			}
+		}
 	}
-	return -1;
+	return false;
 }
 
 void PopupMenu::activate_item(int p_item) {

+ 1 - 1
scene/gui/popup_menu.h

@@ -117,7 +117,7 @@ public:
 
 	int get_item_count() const;
 
-	int find_item_by_accelerator(uint32_t p_accel) const;
+	bool activate_item_by_accelerator(uint32_t p_accel);
 	void activate_item(int p_item);
 
 	void remove_item(int p_idx);