浏览代码

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

Juan Linietsky 9 年之前
父节点
当前提交
ba5bc57816
共有 5 个文件被更改,包括 18 次插入1 次删除
  1. 5 0
      scene/gui/base_button.cpp
  2. 3 0
      scene/main/viewport.cpp
  3. 1 0
      scene/main/viewport.h
  4. 4 0
      tools/editor/editor_node.cpp
  5. 5 1
      tools/editor/scene_tree_dock.cpp

+ 5 - 0
scene/gui/base_button.cpp

@@ -31,6 +31,7 @@
 #include "print_string.h"
 #include "print_string.h"
 #include "button_group.h"
 #include "button_group.h"
 #include "scene/scene_string_names.h"
 #include "scene/scene_string_names.h"
+#include "scene/main/viewport.h"
 
 
 void BaseButton::_input_event(InputEvent p_event) {
 void BaseButton::_input_event(InputEvent p_event) {
 
 
@@ -416,6 +417,10 @@ Ref<ShortCut> BaseButton:: get_shortcut() const {
 void BaseButton::_unhandled_input(InputEvent p_event) {
 void BaseButton::_unhandled_input(InputEvent p_event) {
 
 
 	if (!is_disabled() && is_visible() && shortcut.is_valid() && shortcut->is_shortcut(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()) {
 		if (is_toggle_mode()) {
 			set_pressed(!is_pressed());
 			set_pressed(!is_pressed());
 			emit_signal("toggled",is_pressed());
 			emit_signal("toggled",is_pressed());

+ 3 - 0
scene/main/viewport.cpp

@@ -2502,6 +2502,9 @@ Variant Viewport::gui_get_drag_data() const {
 	return gui.drag_data;
 	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 {
 String Viewport::get_configuration_warning() const {
 
 

+ 1 - 0
scene/main/viewport.h

@@ -374,6 +374,7 @@ public:
 	bool gui_has_modal_stack() const;
 	bool gui_has_modal_stack() const;
 
 
 	Variant gui_get_drag_data() const;
 	Variant gui_get_drag_data() const;
+	Control *get_modal_stack_top() const;
 
 
 	virtual String get_configuration_warning() const;
 	virtual String get_configuration_warning() const;
 
 

+ 4 - 0
tools/editor/editor_node.cpp

@@ -168,6 +168,10 @@ void EditorNode::_update_title() {
 
 
 void EditorNode::_unhandled_input(const InputEvent& p_event) {
 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()) {
 	if (p_event.type==InputEvent::KEY && p_event.key.pressed && !p_event.key.echo && !gui_base->get_viewport()->gui_has_modal_stack()) {
 
 
 
 

+ 5 - 1
tools/editor/scene_tree_dock.cpp

@@ -39,16 +39,20 @@
 #include "multi_node_edit.h"
 #include "multi_node_edit.h"
 #include "tools/editor/plugins/animation_player_editor_plugin.h"
 #include "tools/editor/plugins/animation_player_editor_plugin.h"
 #include "animation_editor.h"
 #include "animation_editor.h"
-
+#include "scene/main/viewport.h"
 
 
 
 
 
 
 void SceneTreeDock::_unhandled_key_input(InputEvent p_event) {
 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();
 	uint32_t sc = p_event.key.get_scancode_with_modifiers();
 	if (!p_event.key.pressed || p_event.key.echo)
 	if (!p_event.key.pressed || p_event.key.echo)
 		return;
 		return;
 
 
+
 	if (ED_IS_SHORTCUT("scene_tree/add_child_node", p_event)) {
 	if (ED_IS_SHORTCUT("scene_tree/add_child_node", p_event)) {
 		_tool_selected(TOOL_NEW);
 		_tool_selected(TOOL_NEW);
 	}
 	}