Browse Source

Opens the menu with the same parent on mouse focus

Guilherme Felipe 7 years ago
parent
commit
d1f5deabd8
4 changed files with 30 additions and 4 deletions
  1. 0 1
      scene/gui/control.cpp
  2. 0 1
      scene/gui/control.h
  3. 2 1
      scene/gui/menu_button.h
  4. 28 1
      scene/main/viewport.cpp

+ 0 - 1
scene/gui/control.cpp

@@ -2972,7 +2972,6 @@ Control::Control() {
 	data.SI = NULL;
 	data.MI = NULL;
 	data.RI = NULL;
-	data.modal = false;
 	data.theme_owner = NULL;
 	data.modal_exclusive = false;
 	data.default_cursor = CURSOR_ARROW;

+ 0 - 1
scene/gui/control.h

@@ -182,7 +182,6 @@ private:
 
 		Control *parent;
 		ObjectID drag_owner;
-		bool modal;
 		bool modal_exclusive;
 		uint64_t modal_frame; //frame used to put something as modal
 		Ref<Theme> theme;

+ 2 - 1
scene/gui/menu_button.h

@@ -43,7 +43,6 @@ class MenuButton : public Button {
 	bool clicked;
 	bool disable_shortcuts;
 	PopupMenu *popup;
-	virtual void pressed();
 
 	void _unhandled_key_input(Ref<InputEvent> p_event);
 	Array _get_items() const;
@@ -55,6 +54,8 @@ protected:
 	static void _bind_methods();
 
 public:
+	virtual void pressed();
+
 	PopupMenu *get_popup() const;
 	void set_disable_shortcuts(bool p_disabled);
 

+ 28 - 1
scene/main/viewport.cpp

@@ -41,7 +41,10 @@
 #include "scene/3d/spatial.h"
 #include "scene/gui/control.h"
 #include "scene/gui/label.h"
+#include "scene/gui/menu_button.h"
+#include "scene/gui/panel.h"
 #include "scene/gui/panel_container.h"
+#include "scene/gui/popup_menu.h"
 #include "scene/main/timer.h"
 #include "scene/resources/mesh.h"
 #include "scene/scene_string_names.h"
@@ -1853,8 +1856,32 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
 		if (gui.drag_data.get_type() == Variant::NIL && over && !gui.modal_stack.empty()) {
 
 			Control *top = gui.modal_stack.back()->get();
+
 			if (over != top && !top->is_a_parent_of(over)) {
-				over = NULL; //nothing can be found outside the modal stack
+
+				PopupMenu *popup_menu = Object::cast_to<PopupMenu>(top);
+				MenuButton *popup_menu_parent;
+				MenuButton *menu_button = Object::cast_to<MenuButton>(over);
+
+				if (popup_menu)
+					popup_menu_parent = Object::cast_to<MenuButton>(popup_menu->get_parent());
+
+				// If the mouse is over a menu button, this menu will open automatically
+				// if there is already a pop-up menu open at the same hierarchical level.
+				if (popup_menu_parent && menu_button &&
+						popup_menu_parent->get_icon().is_null() &&
+						menu_button->get_icon().is_null() &&
+						(popup_menu->get_parent()->get_parent()->is_a_parent_of(menu_button) ||
+								menu_button->get_parent()->is_a_parent_of(popup_menu))) {
+
+					popup_menu->notification(Control::NOTIFICATION_MODAL_CLOSE);
+					popup_menu->_modal_stack_remove();
+					popup_menu->hide();
+
+					menu_button->pressed();
+				} else {
+					over = NULL; //nothing can be found outside the modal stack
+				}
 			}
 		}