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;