Browse Source

Fix popup visibility for OptionButton, MenuButton and ColorPickerButton

Hide popup when its button or another parent object is hidden

Fixes #26937
Nikolay Neupokoev 6 years ago
parent
commit
ebe54833a9
4 changed files with 22 additions and 0 deletions
  1. 6 0
      scene/gui/color_picker.cpp
  2. 10 0
      scene/gui/menu_button.cpp
  3. 1 0
      scene/gui/menu_button.h
  4. 5 0
      scene/gui/option_button.cpp

+ 6 - 0
scene/gui/color_picker.cpp

@@ -776,6 +776,12 @@ void ColorPickerButton::_notification(int p_what) {
 	if (p_what == MainLoop::NOTIFICATION_WM_QUIT_REQUEST && popup) {
 		popup->hide();
 	}
+
+	if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+		if (popup && !is_visible_in_tree()) {
+			popup->hide();
+		}
+	}
 }
 
 void ColorPickerButton::set_pick_color(const Color &p_color) {

+ 10 - 0
scene/gui/menu_button.cpp

@@ -91,6 +91,16 @@ bool MenuButton::is_switch_on_hover() {
 	return switch_on_hover;
 }
 
+void MenuButton::_notification(int p_what) {
+
+	if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+
+		if (!is_visible_in_tree()) {
+			popup->hide();
+		}
+	}
+}
+
 void MenuButton::_bind_methods() {
 
 	ClassDB::bind_method(D_METHOD("get_popup"), &MenuButton::get_popup);

+ 1 - 0
scene/gui/menu_button.h

@@ -52,6 +52,7 @@ class MenuButton : public Button {
 	void _gui_input(Ref<InputEvent> p_event);
 
 protected:
+	void _notification(int p_what);
 	static void _bind_methods();
 
 public:

+ 5 - 0
scene/gui/option_button.cpp

@@ -72,6 +72,11 @@ void OptionButton::_notification(int p_what) {
 
 		Point2 ofs(size.width - arrow->get_width() - get_constant("arrow_margin"), int(Math::abs((size.height - arrow->get_height()) / 2)));
 		arrow->draw(ci, ofs, clr);
+	} else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+
+		if (!is_visible_in_tree()) {
+			popup->hide();
+		}
 	}
 }