Skip to content

Commit 8e00035

Browse files
committed
Introduce Viewport functions for keeping the mouse over state consistent
1 parent 893bbdf commit 8e00035

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

doc/classes/Viewport.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,20 @@
188188
If [member handle_input_locally] is set to [code]false[/code], this method will try finding the first parent viewport that is set to handle input locally, and return its value for [method is_input_handled] instead.
189189
</description>
190190
</method>
191+
<method name="notify_mouse_entered">
192+
<return type="void" />
193+
<description>
194+
Inform the Viewport that the mouse has entered its area. Use this function before sending an [InputEventMouseButton] or [InputEventMouseMotion] to the [Viewport] with [method Viewport.push_input]. See also [method notify_mouse_exited].
195+
[b]Note:[/b] In most cases, it is not necessary to call this function because [SubViewport] nodes that are children of [SubViewportContainer] are notified automatically. This is only necessary when interacting with viewports in non-default ways, for example as textures in [TextureRect] or with an [Area3D] that forwards input events.
196+
</description>
197+
</method>
198+
<method name="notify_mouse_exited">
199+
<return type="void" />
200+
<description>
201+
Inform the Viewport that the mouse has left its area. Use this function when the node that displays the viewport notices the mouse has left the area of the displayed viewport. See also [method notify_mouse_entered].
202+
[b]Note:[/b] In most cases, it is not necessary to call this function because [SubViewport] nodes that are children of [SubViewportContainer] are notified automatically. This is only necessary when interacting with viewports in non-default ways, for example as textures in [TextureRect] or with an [Area3D] that forwards input events.
203+
</description>
204+
</method>
191205
<method name="push_input">
192206
<return type="void" />
193207
<param index="0" name="event" type="InputEvent" />

scene/main/viewport.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3257,6 +3257,22 @@ void Viewport::_push_unhandled_input_internal(const Ref<InputEvent> &p_event) {
32573257
}
32583258
}
32593259

3260+
void Viewport::notify_mouse_entered() {
3261+
if (gui.mouse_in_viewport) {
3262+
WARN_PRINT_ED("The Viewport was previously notified that the mouse is in its area. There is no need to notify it at this time.");
3263+
return;
3264+
}
3265+
notification(NOTIFICATION_VP_MOUSE_ENTER);
3266+
}
3267+
3268+
void Viewport::notify_mouse_exited() {
3269+
if (!gui.mouse_in_viewport) {
3270+
WARN_PRINT_ED("The Viewport was previously notified that the mouse has left its area. There is no need to notify it at this time.");
3271+
return;
3272+
}
3273+
_mouse_leave_viewport();
3274+
}
3275+
32603276
void Viewport::set_physics_object_picking(bool p_enable) {
32613277
ERR_MAIN_THREAD_GUARD;
32623278
physics_object_picking = p_enable;
@@ -4679,6 +4695,8 @@ void Viewport::_bind_methods() {
46794695
#ifndef DISABLE_DEPRECATED
46804696
ClassDB::bind_method(D_METHOD("push_unhandled_input", "event", "in_local_coords"), &Viewport::push_unhandled_input, DEFVAL(false));
46814697
#endif // DISABLE_DEPRECATED
4698+
ClassDB::bind_method(D_METHOD("notify_mouse_entered"), &Viewport::notify_mouse_entered);
4699+
ClassDB::bind_method(D_METHOD("notify_mouse_exited"), &Viewport::notify_mouse_exited);
46824700

46834701
ClassDB::bind_method(D_METHOD("get_mouse_position"), &Viewport::get_mouse_position);
46844702
ClassDB::bind_method(D_METHOD("warp_mouse", "position"), &Viewport::warp_mouse);

scene/main/viewport.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,8 @@ class Viewport : public Node {
578578
#ifndef DISABLE_DEPRECATED
579579
void push_unhandled_input(const Ref<InputEvent> &p_event, bool p_local_coords = false);
580580
#endif // DISABLE_DEPRECATED
581+
void notify_mouse_entered();
582+
void notify_mouse_exited();
581583

582584
void set_disable_input(bool p_disable);
583585
bool is_input_disabled() const;

0 commit comments

Comments
 (0)