diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 7b3dc332c69..f803e301c14 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -80,6 +80,14 @@ bool SceneTreeTimer::is_pause_mode_process() { return process_pause; } +void SceneTreeTimer::set_ignore_time_scale(bool p_ignore) { + ignore_time_scale = p_ignore; +} + +bool SceneTreeTimer::is_ignore_time_scale() { + return ignore_time_scale; +} + void SceneTreeTimer::release_connections() { List connections; get_all_signal_connections(&connections); @@ -557,8 +565,13 @@ bool SceneTree::idle(float p_time) { E = N; continue; } + float time_left = E->get()->get_time_left(); - time_left -= p_time; + if (E->get()->is_ignore_time_scale()) { + time_left -= Engine::get_singleton()->get_idle_frame_step(); + } else { + time_left -= p_time; + } E->get()->set_time_left(time_left); if (time_left < 0) { diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index afbb6800c39..40fe224ee1e 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -50,6 +50,7 @@ class SceneTreeTimer : public Reference { float time_left; bool process_pause; + bool ignore_time_scale = false; protected: static void _bind_methods(); @@ -61,6 +62,9 @@ public: void set_pause_mode_process(bool p_pause_mode_process); bool is_pause_mode_process(); + void set_ignore_time_scale(bool p_ignore); + bool is_ignore_time_scale(); + void release_connections(); SceneTreeTimer(); diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index ab429a3f894..4e62d66afe9 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -333,7 +333,6 @@ void Viewport::_notification(int p_what) { #endif // Enable processing for tooltips, collision debugging, physics object picking, etc. - set_process_internal(true); set_physics_process_internal(true); } break; @@ -361,16 +360,6 @@ void Viewport::_notification(int p_what) { remove_from_group("_viewports"); VS::get_singleton()->viewport_set_active(viewport, false); - - } break; - case NOTIFICATION_INTERNAL_PROCESS: { - if (gui.tooltip_timer >= 0) { - gui.tooltip_timer -= get_process_delta_time(); - if (gui.tooltip_timer < 0) { - _gui_show_tooltip(); - } - } - } break; case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { if (get_tree()->is_debugging_collisions_hint() && contact_2d_debug.is_valid()) { @@ -1500,7 +1489,10 @@ void Viewport::_gui_sort_roots() { void Viewport::_gui_cancel_tooltip() { gui.tooltip_control = nullptr; - gui.tooltip_timer = -1; + if (gui.tooltip_timer.is_valid()) { + gui.tooltip_timer->release_connections(); + gui.tooltip_timer = Ref(); + } if (gui.tooltip_popup) { gui.tooltip_popup->queue_delete(); gui.tooltip_popup = nullptr; @@ -2241,9 +2233,15 @@ void Viewport::_gui_input_event(Ref p_event) { } if (can_tooltip && !is_tooltip_shown) { + if (gui.tooltip_timer.is_valid()) { + gui.tooltip_timer->release_connections(); + gui.tooltip_timer = Ref(); + } gui.tooltip_control = over; gui.tooltip_pos = mpos; - gui.tooltip_timer = gui.tooltip_delay; + gui.tooltip_timer = get_tree()->create_timer(gui.tooltip_delay); + gui.tooltip_timer->set_ignore_time_scale(true); + gui.tooltip_timer->connect("timeout", this, "_gui_show_tooltip"); } } diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 4f92a13db5d..77890f8147d 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -49,6 +49,7 @@ class Label; class Timer; class Viewport; class CollisionObject; +class SceneTreeTimer; class ViewportTexture : public Texture { GDCLASS(ViewportTexture, Texture); @@ -308,7 +309,7 @@ private: bool drag_attempted; Variant drag_data; ObjectID drag_preview_id; - float tooltip_timer; + Ref tooltip_timer; float tooltip_delay; List modal_stack; Transform2D focus_inv_xform;