diff --git a/editor/debugger/behavior_tree_view.cpp b/editor/debugger/behavior_tree_view.cpp index b8601b3..228f6d0 100644 --- a/editor/debugger/behavior_tree_view.cpp +++ b/editor/debugger/behavior_tree_view.cpp @@ -22,6 +22,7 @@ #include "core/math/color.h" #include "core/math/math_defs.h" #include "core/object/callable_method_pointer.h" +#include "core/os/time.h" #include "core/typedefs.h" #include "editor/editor_scale.h" #include "editor/editor_settings.h" @@ -30,6 +31,7 @@ #ifdef LIMBOAI_GDEXTENSION #include +#include #endif // LIMBOAI_GDEXTENSION void BehaviorTreeView::_draw_running_status(Object *p_obj, Rect2 p_rect) { @@ -74,6 +76,12 @@ inline void _item_set_elapsed_time(TreeItem *p_item, double p_elapsed) { } void BehaviorTreeView::update_tree(const Ref &p_data) { + update_data = p_data; + update_pending = true; + _notification(NOTIFICATION_PROCESS); +} + +void BehaviorTreeView::_update_tree(const Ref &p_data) { // Remember selected. uint64_t selected_id = 0; if (tree->get_selected()) { @@ -258,6 +266,17 @@ void BehaviorTreeView::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { _do_update_theme_item_cache(); } break; + case NOTIFICATION_VISIBILITY_CHANGED: { + set_process(is_visible_in_tree()); + } + case NOTIFICATION_PROCESS: { + int ticks_msec = Time::get_singleton()->get_ticks_msec(); + if (update_pending && (ticks_msec - last_update_msec) >= update_interval_msec) { + _update_tree(update_data); + update_pending = false; + last_update_msec = ticks_msec; + } + } break; } } @@ -267,6 +286,10 @@ void BehaviorTreeView::_bind_methods() { ClassDB::bind_method(D_METHOD("_draw_failure_status"), &BehaviorTreeView::_draw_failure_status); ClassDB::bind_method(D_METHOD("_item_collapsed"), &BehaviorTreeView::_item_collapsed); ClassDB::bind_method(D_METHOD("update_tree", "p_behavior_tree_data"), &BehaviorTreeView::update_tree); + + ClassDB::bind_method(D_METHOD("set_update_interval_msec", "p_milliseconds"), &BehaviorTreeView::set_update_interval_msec); + ClassDB::bind_method(D_METHOD("get_update_interval_msec"), &BehaviorTreeView::get_update_interval_msec); + ADD_PROPERTY(PropertyInfo(Variant::INT, "update_interval_msec"), "set_update_interval_msec", "get_update_interval_msec"); } BehaviorTreeView::BehaviorTreeView() { diff --git a/editor/debugger/behavior_tree_view.h b/editor/debugger/behavior_tree_view.h index af183d2..3194348 100644 --- a/editor/debugger/behavior_tree_view.h +++ b/editor/debugger/behavior_tree_view.h @@ -51,6 +51,11 @@ private: Vector collapsed_ids; uint64_t last_root_id = 0; + int last_update_msec = 0; + int update_interval_msec = 0; + Ref update_data; + bool update_pending = false; + void _draw_success_status(Object *p_obj, Rect2 p_rect); void _draw_running_status(Object *p_obj, Rect2 p_rect); void _draw_failure_status(Object *p_obj, Rect2 p_rect); @@ -58,6 +63,8 @@ private: void _item_collapsed(Object *p_obj); double _get_editor_scale() const; + void _update_tree(const Ref &p_data); + protected: void _do_update_theme_item_cache(); @@ -66,8 +73,11 @@ protected: static void _bind_methods(); public: - void update_tree(const Ref &p_data); void clear(); + void update_tree(const Ref &p_data); + + void set_update_interval_msec(int p_milliseconds) { update_interval_msec = p_milliseconds; } + int get_update_interval_msec() const { return update_interval_msec; } BehaviorTreeView(); };