From 415042ac89d1c9c7f8ca97fa83fc1165350a01da Mon Sep 17 00:00:00 2001 From: Markus Sauermann <6299227+Sauermann@users.noreply.github.com> Date: Tue, 15 Feb 2022 22:14:39 +0100 Subject: [PATCH] Connect notifications from Container to Viewport mouse enter+exit --- doc/classes/Node.xml | 8 ++++++++ doc/classes/SubViewportContainer.xml | 1 + scene/gui/subviewport_container.cpp | 18 ++++++++++++++++++ scene/gui/subviewport_container.h | 1 + scene/main/node.cpp | 3 +++ scene/main/node.h | 2 ++ scene/main/viewport.cpp | 4 ++-- scene/main/window.cpp | 2 ++ 8 files changed, 37 insertions(+), 2 deletions(-) diff --git a/doc/classes/Node.xml b/doc/classes/Node.xml index 5ae50f86d4c..962ad00a569 100644 --- a/doc/classes/Node.xml +++ b/doc/classes/Node.xml @@ -853,6 +853,14 @@ + + + + Notification received when the mouse enters the viewport. + + + Notification received when the mouse leaves the viewport. + Notification received from the OS when the application is exceeding its allocated memory. Specific to the iOS platform. diff --git a/doc/classes/SubViewportContainer.xml b/doc/classes/SubViewportContainer.xml index bd48f2b6db5..050186a8837 100644 --- a/doc/classes/SubViewportContainer.xml +++ b/doc/classes/SubViewportContainer.xml @@ -6,6 +6,7 @@ A [Container] node that holds a [SubViewport], automatically setting its size. [b]Note:[/b] Changing a SubViewportContainer's [member Control.rect_scale] will cause its contents to appear distorted. To change its visual size without causing distortion, adjust the node's margins instead (if it's not already in a container). + [b]Note:[/b] The SubViewportContainer forwards mouse-enter and mouse-exit notifications to its sub-viewports. diff --git a/scene/gui/subviewport_container.cpp b/scene/gui/subviewport_container.cpp index ce78c286f58..c66e145bc41 100644 --- a/scene/gui/subviewport_container.cpp +++ b/scene/gui/subviewport_container.cpp @@ -148,6 +148,24 @@ void SubViewportContainer::_notification(int p_what) { } } } break; + + case NOTIFICATION_MOUSE_ENTER: { + _notify_viewports(NOTIFICATION_VP_MOUSE_ENTER); + } break; + + case NOTIFICATION_MOUSE_EXIT: { + _notify_viewports(NOTIFICATION_VP_MOUSE_EXIT); + } break; + } +} + +void SubViewportContainer::_notify_viewports(int p_notification) { + for (int i = 0; i < get_child_count(); i++) { + SubViewport *c = Object::cast_to(get_child(i)); + if (!c) { + continue; + } + c->notification(p_notification); } } diff --git a/scene/gui/subviewport_container.h b/scene/gui/subviewport_container.h index 3138a6144c0..f52f01e4e23 100644 --- a/scene/gui/subviewport_container.h +++ b/scene/gui/subviewport_container.h @@ -38,6 +38,7 @@ class SubViewportContainer : public Container { bool stretch = false; int shrink = 1; + void _notify_viewports(int p_notification); protected: void _notification(int p_what); diff --git a/scene/main/node.cpp b/scene/main/node.cpp index 42a2e41a085..8b557f92eff 100644 --- a/scene/main/node.cpp +++ b/scene/main/node.cpp @@ -2845,6 +2845,9 @@ void Node::_bind_methods() { BIND_CONSTANT(NOTIFICATION_WM_CLOSE_REQUEST); BIND_CONSTANT(NOTIFICATION_WM_GO_BACK_REQUEST); BIND_CONSTANT(NOTIFICATION_WM_SIZE_CHANGED); + BIND_CONSTANT(NOTIFICATION_WM_DPI_CHANGE); + BIND_CONSTANT(NOTIFICATION_VP_MOUSE_ENTER); + BIND_CONSTANT(NOTIFICATION_VP_MOUSE_EXIT); BIND_CONSTANT(NOTIFICATION_OS_MEMORY_WARNING); BIND_CONSTANT(NOTIFICATION_TRANSLATION_CHANGED); BIND_CONSTANT(NOTIFICATION_WM_ABOUT); diff --git a/scene/main/node.h b/scene/main/node.h index f2dcdf4b43d..8b4599c79ed 100644 --- a/scene/main/node.h +++ b/scene/main/node.h @@ -268,6 +268,8 @@ public: NOTIFICATION_WM_GO_BACK_REQUEST = 1007, NOTIFICATION_WM_SIZE_CHANGED = 1008, NOTIFICATION_WM_DPI_CHANGE = 1009, + NOTIFICATION_VP_MOUSE_ENTER = 1010, + NOTIFICATION_VP_MOUSE_EXIT = 1011, NOTIFICATION_OS_MEMORY_WARNING = MainLoop::NOTIFICATION_OS_MEMORY_WARNING, NOTIFICATION_TRANSLATION_CHANGED = MainLoop::NOTIFICATION_TRANSLATION_CHANGED, diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 2831e76fba7..691482808a8 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -496,11 +496,11 @@ void Viewport::_notification(int p_what) { #endif // _3D_DISABLED } break; - case NOTIFICATION_WM_MOUSE_ENTER: { + case NOTIFICATION_VP_MOUSE_ENTER: { gui.mouse_in_window = true; } break; - case NOTIFICATION_WM_MOUSE_EXIT: { + case NOTIFICATION_VP_MOUSE_EXIT: { gui.mouse_in_window = false; _drop_physics_mouseover(); _drop_mouse_over(); diff --git a/scene/main/window.cpp b/scene/main/window.cpp index e7a575f40a6..0ce556d36c6 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -340,9 +340,11 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) { case DisplayServer::WINDOW_EVENT_MOUSE_ENTER: { _propagate_window_notification(this, NOTIFICATION_WM_MOUSE_ENTER); emit_signal(SNAME("mouse_entered")); + notification(NOTIFICATION_VP_MOUSE_ENTER); DisplayServer::get_singleton()->cursor_set_shape(DisplayServer::CURSOR_ARROW); //restore cursor shape } break; case DisplayServer::WINDOW_EVENT_MOUSE_EXIT: { + notification(NOTIFICATION_VP_MOUSE_EXIT); _propagate_window_notification(this, NOTIFICATION_WM_MOUSE_EXIT); emit_signal(SNAME("mouse_exited")); } break;