Merge pull request #58042 from Sauermann/fix-viewport-border-notifications

Fix Viewport mouse enter+exit notifications
This commit is contained in:
Rémi Verschelde 2022-02-19 09:07:07 +01:00 committed by GitHub
commit 417698c202
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 37 additions and 2 deletions

View file

@ -856,6 +856,14 @@
</constant> </constant>
<constant name="NOTIFICATION_WM_SIZE_CHANGED" value="1008"> <constant name="NOTIFICATION_WM_SIZE_CHANGED" value="1008">
</constant> </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"> <constant name="NOTIFICATION_OS_MEMORY_WARNING" value="2009">
Notification received from the OS when the application is exceeding its allocated memory. Notification received from the OS when the application is exceeding its allocated memory.
Specific to the iOS platform. Specific to the iOS platform.

View file

@ -6,6 +6,7 @@
<description> <description>
A [Container] node that holds a [SubViewport], automatically setting its size. 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] 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> </description>
<tutorials> <tutorials>
</tutorials> </tutorials>

View file

@ -148,6 +148,24 @@ void SubViewportContainer::_notification(int p_what) {
} }
} }
} break; } 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);
} }
} }

View file

@ -38,6 +38,7 @@ class SubViewportContainer : public Container {
bool stretch = false; bool stretch = false;
int shrink = 1; int shrink = 1;
void _notify_viewports(int p_notification);
protected: protected:
void _notification(int p_what); void _notification(int p_what);

View file

@ -2863,6 +2863,9 @@ void Node::_bind_methods() {
BIND_CONSTANT(NOTIFICATION_WM_CLOSE_REQUEST); BIND_CONSTANT(NOTIFICATION_WM_CLOSE_REQUEST);
BIND_CONSTANT(NOTIFICATION_WM_GO_BACK_REQUEST); BIND_CONSTANT(NOTIFICATION_WM_GO_BACK_REQUEST);
BIND_CONSTANT(NOTIFICATION_WM_SIZE_CHANGED); 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_OS_MEMORY_WARNING);
BIND_CONSTANT(NOTIFICATION_TRANSLATION_CHANGED); BIND_CONSTANT(NOTIFICATION_TRANSLATION_CHANGED);
BIND_CONSTANT(NOTIFICATION_WM_ABOUT); BIND_CONSTANT(NOTIFICATION_WM_ABOUT);

View file

@ -268,6 +268,8 @@ public:
NOTIFICATION_WM_GO_BACK_REQUEST = 1007, NOTIFICATION_WM_GO_BACK_REQUEST = 1007,
NOTIFICATION_WM_SIZE_CHANGED = 1008, NOTIFICATION_WM_SIZE_CHANGED = 1008,
NOTIFICATION_WM_DPI_CHANGE = 1009, 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_OS_MEMORY_WARNING = MainLoop::NOTIFICATION_OS_MEMORY_WARNING,
NOTIFICATION_TRANSLATION_CHANGED = MainLoop::NOTIFICATION_TRANSLATION_CHANGED, NOTIFICATION_TRANSLATION_CHANGED = MainLoop::NOTIFICATION_TRANSLATION_CHANGED,

View file

@ -496,11 +496,11 @@ void Viewport::_notification(int p_what) {
#endif // _3D_DISABLED #endif // _3D_DISABLED
} break; } break;
case NOTIFICATION_WM_MOUSE_ENTER: { case NOTIFICATION_VP_MOUSE_ENTER: {
gui.mouse_in_window = true; gui.mouse_in_window = true;
} break; } break;
case NOTIFICATION_WM_MOUSE_EXIT: { case NOTIFICATION_VP_MOUSE_EXIT: {
gui.mouse_in_window = false; gui.mouse_in_window = false;
_drop_physics_mouseover(); _drop_physics_mouseover();
_drop_mouse_over(); _drop_mouse_over();

View file

@ -340,9 +340,11 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) {
case DisplayServer::WINDOW_EVENT_MOUSE_ENTER: { case DisplayServer::WINDOW_EVENT_MOUSE_ENTER: {
_propagate_window_notification(this, NOTIFICATION_WM_MOUSE_ENTER); _propagate_window_notification(this, NOTIFICATION_WM_MOUSE_ENTER);
emit_signal(SNAME("mouse_entered")); emit_signal(SNAME("mouse_entered"));
notification(NOTIFICATION_VP_MOUSE_ENTER);
DisplayServer::get_singleton()->cursor_set_shape(DisplayServer::CURSOR_ARROW); //restore cursor shape DisplayServer::get_singleton()->cursor_set_shape(DisplayServer::CURSOR_ARROW); //restore cursor shape
} break; } break;
case DisplayServer::WINDOW_EVENT_MOUSE_EXIT: { case DisplayServer::WINDOW_EVENT_MOUSE_EXIT: {
notification(NOTIFICATION_VP_MOUSE_EXIT);
_propagate_window_notification(this, NOTIFICATION_WM_MOUSE_EXIT); _propagate_window_notification(this, NOTIFICATION_WM_MOUSE_EXIT);
emit_signal(SNAME("mouse_exited")); emit_signal(SNAME("mouse_exited"));
} break; } break;