Sfoglia il codice sorgente

Connect notifications from Container to Viewport
mouse enter+exit

Markus Sauermann 3 anni fa
parent
commit
415042ac89

+ 8 - 0
doc/classes/Node.xml

@@ -853,6 +853,14 @@
 		</constant>
 		<constant name="NOTIFICATION_WM_SIZE_CHANGED" value="1008">
 		</constant>
+		<constant name="NOTIFICATION_WM_DPI_CHANGE" value="1009">
+		</constant>
+		<constant name="NOTIFICATION_VP_MOUSE_ENTER" value="1010">
+			Notification received when the mouse enters the viewport.
+		</constant>
+		<constant name="NOTIFICATION_VP_MOUSE_EXIT" value="1011">
+			Notification received when the mouse leaves the viewport.
+		</constant>
 		<constant name="NOTIFICATION_OS_MEMORY_WARNING" value="2009">
 			Notification received from the OS when the application is exceeding its allocated memory.
 			Specific to the iOS platform.

+ 1 - 0
doc/classes/SubViewportContainer.xml

@@ -6,6 +6,7 @@
 	<description>
 		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.
 	</description>
 	<tutorials>
 	</tutorials>

+ 18 - 0
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<SubViewport>(get_child(i));
+		if (!c) {
+			continue;
+		}
+		c->notification(p_notification);
 	}
 }
 

+ 1 - 0
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);

+ 3 - 0
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);

+ 2 - 0
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,

+ 2 - 2
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();

+ 2 - 0
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;