From efc3ffb816796fbab64d389508d837560b4f220c Mon Sep 17 00:00:00 2001 From: Bernhard Liebl Date: Wed, 22 Nov 2017 09:43:40 +0100 Subject: [PATCH] fix certain popup close clicks with popup buttons --- editor/property_editor.cpp | 2 ++ scene/gui/control.cpp | 11 +++++++++++ scene/gui/control.h | 5 +++++ scene/gui/menu_button.cpp | 1 + scene/gui/option_button.cpp | 1 + scene/main/viewport.cpp | 11 +++++++++++ 6 files changed, 31 insertions(+) diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index eed1efaf9ca..eb2437b889c 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -1948,6 +1948,7 @@ CustomPropertyEditor::CustomPropertyEditor() { type_button->get_popup()->connect("id_pressed", this, "_type_create_selected"); menu = memnew(PopupMenu); + menu->set_pass_on_modal_close_click(false); add_child(menu); menu->connect("id_pressed", this, "_menu_option"); @@ -4288,6 +4289,7 @@ PropertyEditor::PropertyEditor() { set_physics_process(true); custom_editor = memnew(CustomPropertyEditor); + custom_editor->set_pass_on_modal_close_click(false); add_child(custom_editor); tree->connect("custom_popup_edited", this, "_custom_editor_request"); diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index adca78d1d44..81d2b6731f6 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -2470,6 +2470,16 @@ Control::MouseFilter Control::get_mouse_filter() const { return data.mouse_filter; } +void Control::set_pass_on_modal_close_click(bool p_pass_on) { + + data.pass_on_modal_close_click = p_pass_on; +} + +bool Control::pass_on_modal_close_click() const { + + return data.pass_on_modal_close_click; +} + Control *Control::get_focus_owner() const { ERR_FAIL_COND_V(!is_inside_tree(), NULL); @@ -2934,6 +2944,7 @@ Control::Control() { data.parent = NULL; data.mouse_filter = MOUSE_FILTER_STOP; + data.pass_on_modal_close_click = true; data.SI = NULL; data.MI = NULL; diff --git a/scene/gui/control.h b/scene/gui/control.h index 92d1c969fc5..9ac0eb0be34 100644 --- a/scene/gui/control.h +++ b/scene/gui/control.h @@ -165,6 +165,8 @@ private: bool pending_min_size_update; Point2 custom_minimum_size; + bool pass_on_modal_close_click; + MouseFilter mouse_filter; bool clip_contents; @@ -401,6 +403,9 @@ public: void set_mouse_filter(MouseFilter p_filter); MouseFilter get_mouse_filter() const; + void set_pass_on_modal_close_click(bool p_pass_on); + bool pass_on_modal_close_click() const; + /* SKINNING */ void add_icon_override(const StringName &p_name, const Ref &p_icon); diff --git a/scene/gui/menu_button.cpp b/scene/gui/menu_button.cpp index ac450616d63..d850553957f 100644 --- a/scene/gui/menu_button.cpp +++ b/scene/gui/menu_button.cpp @@ -111,6 +111,7 @@ MenuButton::MenuButton() { popup->hide(); add_child(popup); popup->set_as_toplevel(true); + popup->set_pass_on_modal_close_click(false); connect("button_up", popup, "call_deferred", make_binds("grab_click_focus")); set_process_unhandled_key_input(true); set_action_mode(ACTION_MODE_BUTTON_PRESS); diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index b4d07999450..70f3d9ca832 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -323,6 +323,7 @@ OptionButton::OptionButton() { popup = memnew(PopupMenu); popup->hide(); popup->set_as_toplevel(true); + popup->set_pass_on_modal_close_click(false); add_child(popup); popup->connect("id_pressed", this, "_selected"); diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index a785abbc65a..8bf54232bce 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1649,6 +1649,8 @@ void Viewport::_gui_input_event(Ref p_event) { } else { + bool is_handled = false; + _gui_sort_modal_stack(); while (!gui.modal_stack.empty()) { @@ -1666,11 +1668,20 @@ void Viewport::_gui_input_event(Ref p_event) { top->notification(Control::NOTIFICATION_MODAL_CLOSE); top->_modal_stack_remove(); top->hide(); + + if (!top->pass_on_modal_close_click()) { + is_handled = true; + } } else { break; } } + if (is_handled) { + get_tree()->set_input_as_handled(); + return; + } + //Matrix32 parent_xform; /*