Просмотр исходного кода

properly pass events to parent controls, closes #4701

Juan Linietsky 9 лет назад
Родитель
Сommit
aec5506414
1 измененных файлов с 24 добавлено и 16 удалено
  1. 24 16
      scene/main/viewport.cpp

+ 24 - 16
scene/main/viewport.cpp

@@ -1492,22 +1492,30 @@ void Viewport::_gui_call_input(Control *p_control,const InputEvent& p_input) {
 
 //	_block();
 
-	while(p_control) {
-
-		p_control->call_multilevel(SceneStringNames::get_singleton()->_input_event,p_input);
-		if (gui.key_event_accepted)
-			break;
-		if (!p_control->is_inside_tree())
-			break;
-		p_control->emit_signal(SceneStringNames::get_singleton()->input_event,p_input);
-		if (!p_control->is_inside_tree() || p_control->is_set_as_toplevel()) {
-			break;
-		}
-		if (gui.key_event_accepted)
-			break;
-		if (p_control->data.stop_mouse && (p_input.type==InputEvent::MOUSE_BUTTON || p_input.type==InputEvent::MOUSE_MOTION))
-			break;
-		p_control=p_control->data.parent;
+    CanvasItem *ci=p_control;
+    while(ci) {
+
+        Control *control = ci->cast_to<Control>();
+        if (control) {
+            control->call_multilevel(SceneStringNames::get_singleton()->_input_event,p_input);
+            if (gui.key_event_accepted)
+                break;
+            if (!control->is_inside_tree())
+                break;
+            control->emit_signal(SceneStringNames::get_singleton()->input_event,p_input);
+            if (!control->is_inside_tree() || control->is_set_as_toplevel()) {
+                break;
+            }
+            if (gui.key_event_accepted)
+                break;
+            if (control->data.stop_mouse && (p_input.type==InputEvent::MOUSE_BUTTON || p_input.type==InputEvent::MOUSE_MOTION))
+                break;
+        }
+
+        if (ci->is_set_as_toplevel())
+            break;
+
+        ci=ci->get_parent_item();
 	}
 
 	//_unblock();