From 7626c84633c7986360d45d9ed50e35d2feb87515 Mon Sep 17 00:00:00 2001 From: Serhii Snitsaruk Date: Thu, 29 Feb 2024 23:00:35 +0100 Subject: [PATCH] New `task_selected` signal for BehaviorTreeView --- doc_classes/BehaviorTreeView.xml | 9 +++++++ editor/debugger/behavior_tree_view.cpp | 34 +++++++++++++++++++++++--- editor/debugger/behavior_tree_view.h | 1 + 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/doc_classes/BehaviorTreeView.xml b/doc_classes/BehaviorTreeView.xml index 6c191b2..1df9fac 100644 --- a/doc_classes/BehaviorTreeView.xml +++ b/doc_classes/BehaviorTreeView.xml @@ -22,4 +22,13 @@ Minimum delay between two updates (in milliseconds). Set to higher values for a lower CPU load. + + + + + + Emitted when a task item is selected in [BehaviorTreeView]. + + + diff --git a/editor/debugger/behavior_tree_view.cpp b/editor/debugger/behavior_tree_view.cpp index c8e05d2..40c6a4a 100644 --- a/editor/debugger/behavior_tree_view.cpp +++ b/editor/debugger/behavior_tree_view.cpp @@ -34,6 +34,22 @@ #include #endif // LIMBOAI_GDEXTENSION +inline static uint64_t item_get_task_id(TreeItem *p_item) { + return p_item->get_metadata(0); +} + +inline static BTTask::Status item_get_task_status(TreeItem *p_item) { + return VariantCaster::cast(p_item->get_metadata(1)); +} + +inline static String item_get_task_type(TreeItem *p_item) { + return ((String)p_item->get_metadata(2)).get_slicec('|', 0); +} + +inline static String item_get_task_script_path(TreeItem *p_item) { + return ((String)p_item->get_metadata(2)).get_slicec('|', 1); +} + void BehaviorTreeView::_draw_running_status(Object *p_obj, Rect2 p_rect) { p_rect = p_rect.grow_side(SIDE_LEFT, p_rect.get_position().x); theme_cache.sbf_running->draw(tree->get_canvas_item(), p_rect); @@ -54,15 +70,21 @@ void BehaviorTreeView::_item_collapsed(Object *p_obj) { if (!item) { return; } - uint64_t id = item->get_metadata(0); + uint64_t id = item_get_task_id(item); bool collapsed = item->is_collapsed(); if (!collapsed_ids.has(id) && collapsed) { - collapsed_ids.push_back(item->get_metadata(0)); + collapsed_ids.push_back(item_get_task_id(item)); } else if (collapsed_ids.has(id) && !collapsed) { collapsed_ids.erase(id); } } +void BehaviorTreeView::_item_selected() { + TreeItem *item = tree->get_selected(); + ERR_FAIL_NULL(item); + emit_signal(LW_NAME(task_selected), item_get_task_type(item), item_get_task_script_path(item)); +} + double BehaviorTreeView::_get_editor_scale() const { if (Engine::get_singleton()->is_editor_hint()) { return EDSCALE; @@ -85,7 +107,7 @@ void BehaviorTreeView::_update_tree(const Ref &p_data) { // Remember selected. uint64_t selected_id = 0; if (tree->get_selected()) { - selected_id = tree->get_selected()->get_metadata(0); + selected_id = item_get_task_id(tree->get_selected()); } if (last_root_id != 0 && p_data->tasks.size() > 0 && last_root_id == (uint64_t)p_data->tasks[0].id) { @@ -98,7 +120,7 @@ void BehaviorTreeView::_update_tree(const Ref &p_data) { ERR_FAIL_COND(idx >= p_data->tasks.size()); const BTTask::Status current_status = (BTTask::Status)p_data->tasks[idx].status; - const BTTask::Status last_status = VariantCaster::cast(item->get_metadata(1)); + const BTTask::Status last_status = item_get_task_status(item); const bool status_changed = last_status != p_data->tasks[idx].status; if (status_changed) { @@ -166,6 +188,7 @@ void BehaviorTreeView::_update_tree(const Ref &p_data) { item->set_metadata(0, task_data.id); item->set_metadata(1, task_data.status); + item->set_metadata(2, task_data.type_name + String("|") + task_data.script_path); item->set_text(0, task_data.name); if (task_data.is_custom_name) { @@ -262,6 +285,7 @@ void BehaviorTreeView::_notification(int p_what) { switch (p_what) { case NOTIFICATION_READY: { tree->connect(LW_NAME(item_collapsed), callable_mp(this, &BehaviorTreeView::_item_collapsed)); + tree->connect(LW_NAME(item_selected), callable_mp(this, &BehaviorTreeView::_item_selected)); } break; case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: case NOTIFICATION_TRANSLATION_CHANGED: @@ -292,6 +316,8 @@ void BehaviorTreeView::_bind_methods() { 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"); + + ADD_SIGNAL(MethodInfo("task_selected", PropertyInfo(Variant::STRING, "p_type_name"), PropertyInfo(Variant::STRING, "p_script_path"))); } BehaviorTreeView::BehaviorTreeView() { diff --git a/editor/debugger/behavior_tree_view.h b/editor/debugger/behavior_tree_view.h index 3194348..bfbc599 100644 --- a/editor/debugger/behavior_tree_view.h +++ b/editor/debugger/behavior_tree_view.h @@ -61,6 +61,7 @@ private: void _draw_failure_status(Object *p_obj, Rect2 p_rect); void _draw_fresh(Object *p_obj, Rect2 p_rect) {} void _item_collapsed(Object *p_obj); + void _item_selected(); double _get_editor_scale() const; void _update_tree(const Ref &p_data);