diff options
author | Juan Linietsky <reduzio@gmail.com> | 2016-06-27 20:14:59 -0300 |
---|---|---|
committer | Juan Linietsky <reduzio@gmail.com> | 2016-06-27 20:14:59 -0300 |
commit | ba5bc57816999804e3c392e9d1f94b528baa8c18 (patch) | |
tree | a1ab244a844c14dae70c0e2c928f5ae3dff0f362 | |
parent | 972c2ad09f6a89e45e61987c9aa89cc3716d2b2b (diff) |
Figured out a way to fix event propagation for shortcuts and some other cases so they properly stop shortcuts if a modal window is open, closes #4848
-rw-r--r-- | scene/gui/base_button.cpp | 5 | ||||
-rw-r--r-- | scene/main/viewport.cpp | 3 | ||||
-rw-r--r-- | scene/main/viewport.h | 1 | ||||
-rw-r--r-- | tools/editor/editor_node.cpp | 4 | ||||
-rw-r--r-- | tools/editor/scene_tree_dock.cpp | 6 |
5 files changed, 18 insertions, 1 deletions
diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index d7632b14b8..a2b7cd2e0a 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -31,6 +31,7 @@ #include "print_string.h" #include "button_group.h" #include "scene/scene_string_names.h" +#include "scene/main/viewport.h" void BaseButton::_input_event(InputEvent p_event) { @@ -416,6 +417,10 @@ Ref<ShortCut> BaseButton:: get_shortcut() const { void BaseButton::_unhandled_input(InputEvent p_event) { if (!is_disabled() && is_visible() && shortcut.is_valid() && shortcut->is_shortcut(p_event)) { + + if (get_viewport()->get_modal_stack_top() && !get_viewport()->get_modal_stack_top()->is_a_parent_of(this)) + return; //ignore because of modal window + if (is_toggle_mode()) { set_pressed(!is_pressed()); emit_signal("toggled",is_pressed()); diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index f09fac6c71..ff8f0d05f1 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -2502,6 +2502,9 @@ Variant Viewport::gui_get_drag_data() const { return gui.drag_data; } +Control *Viewport::get_modal_stack_top() const { + return gui.modal_stack.size()?gui.modal_stack.back()->get():NULL; +} String Viewport::get_configuration_warning() const { diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 545020dfc7..aaa640e0e6 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -374,6 +374,7 @@ public: bool gui_has_modal_stack() const; Variant gui_get_drag_data() const; + Control *get_modal_stack_top() const; virtual String get_configuration_warning() const; diff --git a/tools/editor/editor_node.cpp b/tools/editor/editor_node.cpp index 991444966d..962993a5d0 100644 --- a/tools/editor/editor_node.cpp +++ b/tools/editor/editor_node.cpp @@ -168,6 +168,10 @@ void EditorNode::_update_title() { void EditorNode::_unhandled_input(const InputEvent& p_event) { + if (Node::get_viewport()->get_modal_stack_top()) + return; //ignore because of modal window + + if (p_event.type==InputEvent::KEY && p_event.key.pressed && !p_event.key.echo && !gui_base->get_viewport()->gui_has_modal_stack()) { diff --git a/tools/editor/scene_tree_dock.cpp b/tools/editor/scene_tree_dock.cpp index 30ffdf6664..ab5c6e5044 100644 --- a/tools/editor/scene_tree_dock.cpp +++ b/tools/editor/scene_tree_dock.cpp @@ -39,16 +39,20 @@ #include "multi_node_edit.h" #include "tools/editor/plugins/animation_player_editor_plugin.h" #include "animation_editor.h" - +#include "scene/main/viewport.h" void SceneTreeDock::_unhandled_key_input(InputEvent p_event) { + if (get_viewport()->get_modal_stack_top()) + return; //ignore because of modal window + uint32_t sc = p_event.key.get_scancode_with_modifiers(); if (!p_event.key.pressed || p_event.key.echo) return; + if (ED_IS_SHORTCUT("scene_tree/add_child_node", p_event)) { _tool_selected(TOOL_NEW); } |