Compare commits

...

14 Commits

Author SHA1 Message Date
Wilson E. Alvarez bbb4512437
Add guards around PROPERTY_HINT_NO_NODEPATH which is not available in GDExtension 2025-02-15 11:29:36 -05:00
Wilson E. Alvarez 43ec612949
Fix broken conversion: Ref<Script> to const String 2025-02-15 09:48:16 -05:00
Wilson E. Alvarez 998bf212b7
Fix unhandled PROPERTY_HINT_NO_NODEPATH warning
Due to upstream change:

	6f7525c396
2025-02-15 09:48:16 -05:00
Wilson E. Alvarez ec8eb4bf91
Override renamed EditorPlugin::get_name() method
Due to upstream change:

	0ab3dc273e
2025-02-15 09:48:16 -05:00
Wilson E. Alvarez 05cd3e67b0
Refactor EditorHelpBit usage
Due to upstream change:

	4e19ab8afe
2025-02-15 09:48:16 -05:00
Wilson E. Alvarez ed9762e62f
Fix unhandled PROPERTY_HINT_ONESHOT warning
Due to upstream change:

	761a20f7a7
2025-02-15 09:48:16 -05:00
Wilson E. Alvarez ac0b68aa13
Fix forbidden comparisons between Ref and nullptr.
Necessary when compiling with strict_checks=yes.

Due to upstream change:

	df29cc696f
2025-02-15 09:48:16 -05:00
Wilson E. Alvarez c3da26caba
Fix internal Button set_icon calls to set_button_icon
Due to upstream change:

    562c666e3d
2025-02-15 09:48:16 -05:00
Wilson E. Alvarez e9f6a6fea5
Fix unhandled PROPERTY_HINT_TOOL_BUTTON warning
Due to upstream change:

	85dfd89653
2025-02-15 09:48:16 -05:00
Wilson E. Alvarez c3144875df
Fix unhandled PROPERTY_HINT_DICTIONARY_TYPE warning
Due to upstream change:

	9853a69144
2025-02-15 09:48:16 -05:00
Wilson E. Alvarez e37ff39641
Update EditorMainScreen calls after its extraction
Due to upstream change:

	5e1c9d68aa
2025-02-15 09:48:16 -05:00
Serhii Snitsaruk 6292ee4404
chore: Move `update_rst` to `scripts/` dir 2025-02-15 13:40:54 +01:00
Serhii Snitsaruk 77dc9b3b85
GHA: Build editor targets for iOS & web GDExtension libs (#285)
Compile iOS & Web GDExtension libs with editor support.
2025-02-13 11:58:03 +01:00
Serhii Snitsaruk 88701e9f20
GDExtension: Build Android libs with editor features (#284)
Also, fix the macOS Vulkan SDK installation step in CI.

Resolves GH-282.
2025-02-12 12:05:50 +01:00
29 changed files with 117 additions and 107 deletions

View File

@ -108,7 +108,7 @@ jobs:
- name: 🌐 Web (wasm32, debug) - name: 🌐 Web (wasm32, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: web platform: web
target: template_debug target: editor
arch: wasm32 arch: wasm32
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -122,7 +122,7 @@ jobs:
- name: 🤖 Android (arm64, debug) - name: 🤖 Android (arm64, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: android platform: android
target: template_debug target: editor
arch: arm64 arch: arm64
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -136,7 +136,7 @@ jobs:
- name: 🤖 Android (arm32, debug) - name: 🤖 Android (arm32, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: android platform: android
target: template_debug target: editor
arch: arm32 arch: arm32
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -150,7 +150,7 @@ jobs:
- name: 🤖 Android (x86_64, debug) - name: 🤖 Android (x86_64, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: android platform: android
target: template_debug target: editor
arch: x86_64 arch: x86_64
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -164,7 +164,7 @@ jobs:
- name: 🤖 Android (x86_32, debug) - name: 🤖 Android (x86_32, debug)
runner: ubuntu-20.04 runner: ubuntu-20.04
platform: android platform: android
target: template_debug target: editor
arch: x86_32 arch: x86_32
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -178,7 +178,7 @@ jobs:
- name: 🍏 iOS (arm64, debug) - name: 🍏 iOS (arm64, debug)
runner: macos-latest runner: macos-latest
platform: ios platform: ios
target: template_debug target: editor
arch: arm64 arch: arm64
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}
@ -193,7 +193,7 @@ jobs:
- name: 🍏 iOS (simulator, debug) - name: 🍏 iOS (simulator, debug)
runner: macos-latest runner: macos-latest
platform: ios platform: ios
target: template_debug target: editor
arch: universal arch: universal
scons-flags: ios_simulator=yes scons-flags: ios_simulator=yes
should-build: ${{ !inputs.test-build }} should-build: ${{ !inputs.test-build }}

View File

@ -168,10 +168,12 @@ jobs:
# ! Note: Vulkan SDK changed packaging, so we need to inline these steps for the time being. # ! Note: Vulkan SDK changed packaging, so we need to inline these steps for the time being.
#sh misc/scripts/install_vulkan_sdk_macos.sh #sh misc/scripts/install_vulkan_sdk_macos.sh
curl -L "https://sdk.lunarg.com/sdk/download/latest/mac/config.json" -o /tmp/vulkan-sdk.json
sdk_version=`jq -r '.version' /tmp/vulkan-sdk.json`
curl -L "https://sdk.lunarg.com/sdk/download/latest/mac/vulkan-sdk.zip" -o /tmp/vulkan-sdk.zip curl -L "https://sdk.lunarg.com/sdk/download/latest/mac/vulkan-sdk.zip" -o /tmp/vulkan-sdk.zip
unzip /tmp/vulkan-sdk.zip -d /tmp unzip /tmp/vulkan-sdk.zip -d /tmp
/tmp/InstallVulkan.app/Contents/MacOS/InstallVulkan --accept-licenses --default-answer --confirm-command install /tmp/InstallVulkan-${sdk_version}.app/Contents/MacOS/InstallVulkan-${sdk_version} --accept-licenses --default-answer --confirm-command install
rm -Rf /tmp/InstallVulkan.app rm -Rf /tmp/InstallVulkan-${sdk_version}.app
rm -f /tmp/vulkan-sdk.zip rm -f /tmp/vulkan-sdk.zip
- name: Set up scons cache - name: Set up scons cache

View File

@ -13,7 +13,7 @@
Variant BBNode::get_value(Node *p_scene_root, const Ref<Blackboard> &p_blackboard, const Variant &p_default) { Variant BBNode::get_value(Node *p_scene_root, const Ref<Blackboard> &p_blackboard, const Variant &p_default) {
ERR_FAIL_NULL_V_MSG(p_scene_root, Variant(), "BBNode: get_value() failed - scene_root is null."); ERR_FAIL_NULL_V_MSG(p_scene_root, Variant(), "BBNode: get_value() failed - scene_root is null.");
ERR_FAIL_NULL_V_MSG(p_blackboard, Variant(), "BBNode: get_value() failed - blackboard is null."); ERR_FAIL_COND_V_MSG(p_blackboard.is_null(), Variant(), "BBNode: get_value() failed - blackboard is null.");
Variant val; Variant val;
if (get_value_source() == SAVED_VALUE) { if (get_value_source() == SAVED_VALUE) {

View File

@ -532,7 +532,7 @@ void BlackboardPlan::populate_blackboard(const Ref<Blackboard> &p_blackboard, bo
if (has_mapping) { if (has_mapping) {
StringName target_var = parent_scope_mapping[p.first]; StringName target_var = parent_scope_mapping[p.first];
if (target_var != StringName()) { if (target_var != StringName()) {
ERR_CONTINUE_MSG(p_blackboard->get_parent() == nullptr, vformat("BlackboardPlan: Cannot link variable %s to parent scope because the parent scope is not set.", LimboUtility::get_singleton()->decorate_var(p.first))); ERR_CONTINUE_MSG(p_blackboard->get_parent().is_null(), vformat("BlackboardPlan: Cannot link variable %s to parent scope because the parent scope is not set.", LimboUtility::get_singleton()->decorate_var(p.first)));
p_blackboard->link_var(p.first, p_blackboard->get_parent(), target_var); p_blackboard->link_var(p.first, p_blackboard->get_parent(), target_var);
} }
} else if (is_bound) { } else if (is_bound) {

View File

@ -78,10 +78,10 @@ void BehaviorTree::copy_other(const Ref<BehaviorTree> &p_other) {
} }
Ref<BTInstance> BehaviorTree::instantiate(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_instance_owner, Node *p_custom_scene_root) const { Ref<BTInstance> BehaviorTree::instantiate(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_instance_owner, Node *p_custom_scene_root) const {
ERR_FAIL_COND_V_MSG(root_task == nullptr, nullptr, "BehaviorTree: Instantiation failed - BT has no valid root task."); ERR_FAIL_COND_V_MSG(root_task.is_null(), nullptr, "BehaviorTree: Instantiation failed - BT has no valid root task.");
ERR_FAIL_NULL_V_MSG(p_agent, nullptr, "BehaviorTree: Instantiation failed - agent can't be null."); ERR_FAIL_NULL_V_MSG(p_agent, nullptr, "BehaviorTree: Instantiation failed - agent can't be null.");
ERR_FAIL_NULL_V_MSG(p_instance_owner, nullptr, "BehaviorTree: Instantiation failed -- instance owner can't be null."); ERR_FAIL_NULL_V_MSG(p_instance_owner, nullptr, "BehaviorTree: Instantiation failed -- instance owner can't be null.");
ERR_FAIL_NULL_V_MSG(p_blackboard, nullptr, "BehaviorTree: Instantiation failed - blackboard can't be null."); ERR_FAIL_COND_V_MSG(p_blackboard.is_null(), nullptr, "BehaviorTree: Instantiation failed - blackboard can't be null.");
Node *scene_root = p_custom_scene_root ? p_custom_scene_root : p_instance_owner->get_owner(); Node *scene_root = p_custom_scene_root ? p_custom_scene_root : p_instance_owner->get_owner();
ERR_FAIL_NULL_V_MSG(scene_root, nullptr, "BehaviorTree: Instantiation failed - unable to establish scene root. This is likely due to the instance owner not being owned by a scene node and custom_scene_root being null."); ERR_FAIL_NULL_V_MSG(scene_root, nullptr, "BehaviorTree: Instantiation failed - unable to establish scene root. This is likely due to the instance owner not being owned by a scene node and custom_scene_root being null.");
Ref<BTTask> root_copy = root_task->clone(); Ref<BTTask> root_copy = root_task->clone();

View File

@ -25,7 +25,7 @@
#endif #endif
Ref<BTInstance> BTInstance::create(Ref<BTTask> p_root_task, String p_source_bt_path, Node *p_owner_node) { Ref<BTInstance> BTInstance::create(Ref<BTTask> p_root_task, String p_source_bt_path, Node *p_owner_node) {
ERR_FAIL_NULL_V(p_root_task, nullptr); ERR_FAIL_COND_V(p_root_task.is_null(), nullptr);
ERR_FAIL_NULL_V(p_owner_node, nullptr); ERR_FAIL_NULL_V(p_owner_node, nullptr);
Ref<BTInstance> inst; Ref<BTInstance> inst;
inst.instantiate(); inst.instantiate();
@ -103,7 +103,7 @@ double BTInstance::_get_mean_update_time_msec_and_reset() {
void BTInstance::_add_custom_monitor() { void BTInstance::_add_custom_monitor() {
ERR_FAIL_NULL(get_owner_node()); ERR_FAIL_NULL(get_owner_node());
ERR_FAIL_NULL(root_task); ERR_FAIL_COND(root_task.is_null());
ERR_FAIL_NULL(root_task->get_agent()); ERR_FAIL_NULL(root_task->get_agent());
if (monitor_id == StringName()) { if (monitor_id == StringName()) {

View File

@ -98,7 +98,7 @@ void BTState::_update(double p_delta) {
// Bail out if a transition happened in the meantime. // Bail out if a transition happened in the meantime.
return; return;
} }
ERR_FAIL_NULL(bt_instance); ERR_FAIL_COND(bt_instance.is_null());
BT::Status status = bt_instance->update(p_delta); BT::Status status = bt_instance->update(p_delta);
if (status == BTTask::SUCCESS) { if (status == BTTask::SUCCESS) {
get_root()->dispatch(success_event, Variant()); get_root()->dispatch(success_event, Variant());

View File

@ -30,7 +30,7 @@ PackedStringArray BTComment::get_configuration_warnings() {
if (get_child_count_excluding_comments() > 0) { if (get_child_count_excluding_comments() > 0) {
warnings.append("Can only have other comment tasks as children."); warnings.append("Can only have other comment tasks as children.");
} }
if (get_parent() == nullptr) { if (get_parent().is_null()) {
warnings.append("Can't be the root task."); warnings.append("Can't be the root task.");
} }
return warnings; return warnings;

View File

@ -163,7 +163,7 @@ void BTTask::set_custom_name(const String &p_name) {
void BTTask::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_scene_root) { void BTTask::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_scene_root) {
ERR_FAIL_NULL(p_agent); ERR_FAIL_NULL(p_agent);
ERR_FAIL_NULL(p_blackboard); ERR_FAIL_COND(p_blackboard.is_null());
ERR_FAIL_NULL(p_scene_root); ERR_FAIL_NULL(p_scene_root);
data.agent = p_agent; data.agent = p_agent;
data.blackboard = p_blackboard; data.blackboard = p_blackboard;

View File

@ -80,7 +80,7 @@ void BTCooldown::_chill() {
timer->set_time_left(duration); timer->set_time_left(duration);
} else { } else {
timer = SCENE_TREE()->create_timer(duration, process_pause); timer = SCENE_TREE()->create_timer(duration, process_pause);
ERR_FAIL_NULL(timer); ERR_FAIL_COND(timer.is_null());
timer->connect(LW_NAME(timeout), callable_mp(this, &BTCooldown::_on_timeout), CONNECT_ONE_SHOT); timer->connect(LW_NAME(timeout), callable_mp(this, &BTCooldown::_on_timeout), CONNECT_ONE_SHOT);
} }
} }

View File

@ -32,16 +32,16 @@ void BTNewScope::set_blackboard_plan(const Ref<BlackboardPlan> &p_plan) {
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
void BTNewScope::_set_parent_scope_plan_from_bt() { void BTNewScope::_set_parent_scope_plan_from_bt() {
ERR_FAIL_NULL(get_blackboard_plan()); ERR_FAIL_COND(get_blackboard_plan().is_null());
Ref<BehaviorTree> bt = get_root()->editor_get_behavior_tree(); Ref<BehaviorTree> bt = get_root()->editor_get_behavior_tree();
ERR_FAIL_NULL(bt); ERR_FAIL_COND(bt.is_null());
get_blackboard_plan()->set_parent_scope_plan_provider(Callable(bt.ptr(), "get_blackboard_plan")); get_blackboard_plan()->set_parent_scope_plan_provider(Callable(bt.ptr(), "get_blackboard_plan"));
} }
#endif // TOOLS_ENABLED #endif // TOOLS_ENABLED
void BTNewScope::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_scene_root) { void BTNewScope::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard, Node *p_scene_root) {
ERR_FAIL_COND(p_agent == nullptr); ERR_FAIL_COND(p_agent == nullptr);
ERR_FAIL_COND(p_blackboard == nullptr); ERR_FAIL_COND(p_blackboard.is_null());
Ref<Blackboard> bb; Ref<Blackboard> bb;
if (blackboard_plan.is_valid()) { if (blackboard_plan.is_valid()) {

View File

@ -66,5 +66,5 @@ option again to update and tidy up the XML files.
Sphinx RST files for the class documentation are generated from Sphinx RST files for the class documentation are generated from
XML files using the Godot script ``make_rst.py`` and stored in the ``doc/source/classes`` directory. XML files using the Godot script ``make_rst.py`` and stored in the ``doc/source/classes`` directory.
This process is performed using our own script ``gdextension/update_rst.sh``. RST files This process is performed using our own script ``scripts/update_rst.sh``. RST files
in ``doc/source/classes`` should not be edited manually. in ``doc/source/classes`` should not be edited manually.

View File

@ -46,7 +46,7 @@ LineEdit *BlackboardPlanEditor::_get_name_edit(int p_row_index) const {
} }
void BlackboardPlanEditor::_add_var() { void BlackboardPlanEditor::_add_var() {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
int suffix = 1; int suffix = 1;
StringName var_name = default_var_name == StringName() ? "var" : default_var_name; StringName var_name = default_var_name == StringName() ? "var" : default_var_name;
@ -65,14 +65,14 @@ void BlackboardPlanEditor::_add_var() {
} }
void BlackboardPlanEditor::_trash_var(int p_index) { void BlackboardPlanEditor::_trash_var(int p_index) {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
StringName var_name = plan->get_var_by_index(p_index).first; StringName var_name = plan->get_var_by_index(p_index).first;
plan->remove_var(var_name); plan->remove_var(var_name);
_refresh(); _refresh();
} }
void BlackboardPlanEditor::_rename_var(const StringName &p_new_name, int p_index) { void BlackboardPlanEditor::_rename_var(const StringName &p_new_name, int p_index) {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
LineEdit *name_edit = _get_name_edit(p_index); LineEdit *name_edit = _get_name_edit(p_index);
ERR_FAIL_NULL(name_edit); ERR_FAIL_NULL(name_edit);
@ -96,7 +96,7 @@ void BlackboardPlanEditor::_rename_var(const StringName &p_new_name, int p_index
} }
void BlackboardPlanEditor::_change_var_type(Variant::Type p_new_type, int p_index) { void BlackboardPlanEditor::_change_var_type(Variant::Type p_new_type, int p_index) {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
BBVariable var = plan->get_var_by_index(p_index).second; BBVariable var = plan->get_var_by_index(p_index).second;
if (var.get_type() == p_new_type) { if (var.get_type() == p_new_type) {
@ -115,14 +115,14 @@ void BlackboardPlanEditor::_change_var_type(Variant::Type p_new_type, int p_inde
} }
void BlackboardPlanEditor::_change_var_hint(PropertyHint p_new_hint, int p_index) { void BlackboardPlanEditor::_change_var_hint(PropertyHint p_new_hint, int p_index) {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
plan->get_var_by_index(p_index).second.set_hint(p_new_hint); plan->get_var_by_index(p_index).second.set_hint(p_new_hint);
plan->notify_property_list_changed(); plan->notify_property_list_changed();
_refresh(); _refresh();
} }
void BlackboardPlanEditor::_change_var_hint_string(const String &p_new_hint_string, int p_index) { void BlackboardPlanEditor::_change_var_hint_string(const String &p_new_hint_string, int p_index) {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
plan->get_var_by_index(p_index).second.set_hint_string(p_new_hint_string); plan->get_var_by_index(p_index).second.set_hint_string(p_new_hint_string);
plan->notify_property_list_changed(); plan->notify_property_list_changed();
} }
@ -278,7 +278,7 @@ void BlackboardPlanEditor::_refresh() {
Button *drag_button = memnew(Button); Button *drag_button = memnew(Button);
props_hbox->add_child(drag_button); props_hbox->add_child(drag_button);
drag_button->set_custom_minimum_size(Size2(28.0, 28.0) * EDSCALE); drag_button->set_custom_minimum_size(Size2(28.0, 28.0) * EDSCALE);
BUTTON_SET_ICON(drag_button, theme_cache.grab_icon); drag_button->set_button_icon(theme_cache.grab_icon);
drag_button->connect(LW_NAME(gui_input), callable_mp(this, &BlackboardPlanEditor::_drag_button_gui_input)); drag_button->connect(LW_NAME(gui_input), callable_mp(this, &BlackboardPlanEditor::_drag_button_gui_input));
drag_button->connect(LW_NAME(button_down), callable_mp(this, &BlackboardPlanEditor::_drag_button_down).bind(row_panel)); drag_button->connect(LW_NAME(button_down), callable_mp(this, &BlackboardPlanEditor::_drag_button_down).bind(row_panel));
drag_button->connect(LW_NAME(button_up), callable_mp(this, &BlackboardPlanEditor::_drag_button_up)); drag_button->connect(LW_NAME(button_up), callable_mp(this, &BlackboardPlanEditor::_drag_button_up));
@ -297,7 +297,7 @@ void BlackboardPlanEditor::_refresh() {
type_choice->set_custom_minimum_size(Size2(170, 0.0) * EDSCALE); type_choice->set_custom_minimum_size(Size2(170, 0.0) * EDSCALE);
type_choice->set_text(Variant::get_type_name(var.get_type())); type_choice->set_text(Variant::get_type_name(var.get_type()));
type_choice->set_tooltip_text(Variant::get_type_name(var.get_type())); type_choice->set_tooltip_text(Variant::get_type_name(var.get_type()));
BUTTON_SET_ICON(type_choice, get_theme_icon(Variant::get_type_name(var.get_type()), LW_NAME(EditorIcons))); type_choice->set_button_icon(get_theme_icon(Variant::get_type_name(var.get_type()), LW_NAME(EditorIcons)));
type_choice->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS); type_choice->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
type_choice->set_flat(true); type_choice->set_flat(true);
type_choice->set_text_alignment(HORIZONTAL_ALIGNMENT_LEFT); type_choice->set_text_alignment(HORIZONTAL_ALIGNMENT_LEFT);
@ -326,7 +326,7 @@ void BlackboardPlanEditor::_refresh() {
Button *trash_button = memnew(Button); Button *trash_button = memnew(Button);
props_hbox->add_child(trash_button); props_hbox->add_child(trash_button);
trash_button->set_custom_minimum_size(Size2(24.0, 0.0) * EDSCALE); trash_button->set_custom_minimum_size(Size2(24.0, 0.0) * EDSCALE);
BUTTON_SET_ICON(trash_button, theme_cache.trash_icon); trash_button->set_button_icon(theme_cache.trash_icon);
trash_button->connect(LW_NAME(pressed), callable_mp(this, &BlackboardPlanEditor::_trash_var).bind(i)); trash_button->connect(LW_NAME(pressed), callable_mp(this, &BlackboardPlanEditor::_trash_var).bind(i));
} }
} }
@ -337,7 +337,7 @@ void BlackboardPlanEditor::_notification(int p_what) {
theme_cache.trash_icon = get_theme_icon(LW_NAME(Remove), LW_NAME(EditorIcons)); theme_cache.trash_icon = get_theme_icon(LW_NAME(Remove), LW_NAME(EditorIcons));
theme_cache.grab_icon = get_theme_icon(LW_NAME(TripleBar), LW_NAME(EditorIcons)); theme_cache.grab_icon = get_theme_icon(LW_NAME(TripleBar), LW_NAME(EditorIcons));
BUTTON_SET_ICON(add_var_tool, get_theme_icon(LW_NAME(Add), LW_NAME(EditorIcons))); add_var_tool->set_button_icon(get_theme_icon(LW_NAME(Add), LW_NAME(EditorIcons)));
type_menu->clear(); type_menu->clear();
for (int i = 0; i < Variant::VARIANT_MAX; i++) { for (int i = 0; i < Variant::VARIANT_MAX; i++) {
@ -472,14 +472,14 @@ BlackboardPlanEditor::BlackboardPlanEditor() {
// ***** EditorInspectorPluginBBPlan ***** // ***** EditorInspectorPluginBBPlan *****
void EditorInspectorPluginBBPlan::_edit_plan(const Ref<BlackboardPlan> &p_plan) { void EditorInspectorPluginBBPlan::_edit_plan(const Ref<BlackboardPlan> &p_plan) {
ERR_FAIL_NULL(p_plan); ERR_FAIL_COND(p_plan.is_null());
plan_editor->edit_plan(p_plan); plan_editor->edit_plan(p_plan);
plan_editor->popup_centered(); plan_editor->popup_centered();
} }
void EditorInspectorPluginBBPlan::_open_base_plan(const Ref<BlackboardPlan> &p_plan) { void EditorInspectorPluginBBPlan::_open_base_plan(const Ref<BlackboardPlan> &p_plan) {
ERR_FAIL_NULL(p_plan); ERR_FAIL_COND(p_plan.is_null());
ERR_FAIL_NULL(p_plan->get_base_plan()); ERR_FAIL_COND(p_plan->get_base_plan().is_null());
EditorInterface::get_singleton()->call_deferred("edit_resource", p_plan->get_base_plan()); EditorInterface::get_singleton()->call_deferred("edit_resource", p_plan->get_base_plan());
} }
@ -501,7 +501,7 @@ void EditorInspectorPluginBBPlan::parse_begin(Object *p_object) {
void EditorInspectorPluginBBPlan::_parse_begin(Object *p_object) { void EditorInspectorPluginBBPlan::_parse_begin(Object *p_object) {
#endif #endif
Ref<BlackboardPlan> plan = Object::cast_to<BlackboardPlan>(p_object); Ref<BlackboardPlan> plan = Object::cast_to<BlackboardPlan>(p_object);
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
PanelContainer *panel = memnew(PanelContainer); PanelContainer *panel = memnew(PanelContainer);
ADD_STYLEBOX_OVERRIDE(panel, LW_NAME(panel), toolbar_style); ADD_STYLEBOX_OVERRIDE(panel, LW_NAME(panel), toolbar_style);
@ -522,7 +522,7 @@ void EditorInspectorPluginBBPlan::_parse_begin(Object *p_object) {
goto_btn->set_text(TTR("Edit Base")); goto_btn->set_text(TTR("Edit Base"));
goto_btn->set_h_size_flags(Control::SIZE_SHRINK_CENTER); goto_btn->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
goto_btn->set_custom_minimum_size(Size2(150.0, 0.0) * EDSCALE); goto_btn->set_custom_minimum_size(Size2(150.0, 0.0) * EDSCALE);
BUTTON_SET_ICON(goto_btn, EditorInterface::get_singleton()->get_editor_theme()->get_icon(LW_NAME(Edit), LW_NAME(EditorIcons))); goto_btn->set_button_icon(EditorInterface::get_singleton()->get_editor_theme()->get_icon(LW_NAME(Edit), LW_NAME(EditorIcons)));
goto_btn->connect(LW_NAME(pressed), callable_mp(this, &EditorInspectorPluginBBPlan::_open_base_plan).bind(plan)); goto_btn->connect(LW_NAME(pressed), callable_mp(this, &EditorInspectorPluginBBPlan::_open_base_plan).bind(plan));
} else { } else {
Button *edit_btn = memnew(Button); Button *edit_btn = memnew(Button);
@ -530,7 +530,7 @@ void EditorInspectorPluginBBPlan::_parse_begin(Object *p_object) {
edit_btn->set_text(TTR("Manage...")); edit_btn->set_text(TTR("Manage..."));
edit_btn->set_h_size_flags(Control::SIZE_SHRINK_CENTER); edit_btn->set_h_size_flags(Control::SIZE_SHRINK_CENTER);
edit_btn->set_custom_minimum_size(Size2(150.0, 0.0) * EDSCALE); edit_btn->set_custom_minimum_size(Size2(150.0, 0.0) * EDSCALE);
BUTTON_SET_ICON(edit_btn, EditorInterface::get_singleton()->get_editor_theme()->get_icon(LW_NAME(EditAddRemove), LW_NAME(EditorIcons))); edit_btn->set_button_icon(EditorInterface::get_singleton()->get_editor_theme()->get_icon(LW_NAME(EditAddRemove), LW_NAME(EditorIcons)));
edit_btn->connect(LW_NAME(pressed), callable_mp(this, &EditorInspectorPluginBBPlan::_edit_plan).bind(plan)); edit_btn->connect(LW_NAME(pressed), callable_mp(this, &EditorInspectorPluginBBPlan::_edit_plan).bind(plan));
} }

View File

@ -209,7 +209,7 @@ void LimboDebuggerTab::_notification(int p_what) {
} break; } break;
case NOTIFICATION_THEME_CHANGED: { case NOTIFICATION_THEME_CHANGED: {
alert_icon->set_texture(get_theme_icon(LW_NAME(StatusWarning), LW_NAME(EditorIcons))); alert_icon->set_texture(get_theme_icon(LW_NAME(StatusWarning), LW_NAME(EditorIcons)));
BUTTON_SET_ICON(resource_header, LimboUtility::get_singleton()->get_task_icon("BehaviorTree")); resource_header->set_button_icon(LimboUtility::get_singleton()->get_task_icon("BehaviorTree"));
} break; } break;
} }
} }

View File

@ -287,14 +287,14 @@ void EditorPropertyBBParam::update_property() {
variable_editor->update_property(); variable_editor->update_property();
variable_editor->show(); variable_editor->show();
bottom_container->hide(); bottom_container->hide();
type_choice->set_icon(get_editor_theme_icon(SNAME("LimboExtraVariable"))); type_choice->set_button_icon(get_editor_theme_icon(SNAME("LimboExtraVariable")));
} else { } else {
_create_value_editor(param->get_type()); _create_value_editor(param->get_type());
variable_editor->hide(); variable_editor->hide();
value_editor->show(); value_editor->show();
value_editor->set_object_and_property(param.ptr(), SNAME("saved_value")); value_editor->set_object_and_property(param.ptr(), SNAME("saved_value"));
value_editor->update_property(); value_editor->update_property();
type_choice->set_icon(get_editor_theme_icon(Variant::get_type_name(param->get_type()))); type_choice->set_button_icon(get_editor_theme_icon(Variant::get_type_name(param->get_type())));
} }
} }
@ -316,7 +316,7 @@ void EditorPropertyBBParam::_notification(int p_what) {
{ {
String type = Variant::get_type_name(_get_edited_param()->get_type()); String type = Variant::get_type_name(_get_edited_param()->get_type());
type_choice->set_icon(get_editor_theme_icon(type)); type_choice->set_button_icon(get_editor_theme_icon(type));
} }
// Initialize type choice. // Initialize type choice.

View File

@ -156,7 +156,7 @@ void EditorPropertyPropertyPath::_notification(int p_what) {
switch (p_what) { switch (p_what) {
case NOTIFICATION_ENTER_TREE: case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: { case NOTIFICATION_THEME_CHANGED: {
BUTTON_SET_ICON(action_menu, get_theme_icon(LW_NAME(GuiTabMenuHl), LW_NAME(EditorIcons))); action_menu->set_button_icon(get_theme_icon(LW_NAME(GuiTabMenuHl), LW_NAME(EditorIcons)));
action_menu->get_popup()->set_item_icon(ACTION_CLEAR, get_theme_icon(LW_NAME(Clear), LW_NAME(EditorIcons))); action_menu->get_popup()->set_item_icon(ACTION_CLEAR, get_theme_icon(LW_NAME(Clear), LW_NAME(EditorIcons)));
action_menu->get_popup()->set_item_icon(ACTION_COPY, get_theme_icon(LW_NAME(ActionCopy), LW_NAME(EditorIcons))); action_menu->get_popup()->set_item_icon(ACTION_COPY, get_theme_icon(LW_NAME(ActionCopy), LW_NAME(EditorIcons)));
action_menu->get_popup()->set_item_icon(ACTION_EDIT, get_theme_icon(LW_NAME(Edit), LW_NAME(EditorIcons))); action_menu->get_popup()->set_item_icon(ACTION_EDIT, get_theme_icon(LW_NAME(Edit), LW_NAME(EditorIcons)));

View File

@ -36,7 +36,7 @@ int EditorPropertyVariableName::last_caret_column = 0;
//***** EditorPropertyVariableName //***** EditorPropertyVariableName
void EditorPropertyVariableName::_show_variables_popup() { void EditorPropertyVariableName::_show_variables_popup() {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
variables_popup->clear(); variables_popup->clear();
variables_popup->reset_size(); variables_popup->reset_size();
@ -86,30 +86,30 @@ void EditorPropertyVariableName::_update_status() {
} }
String var_name = name_edit->get_text(); String var_name = name_edit->get_text();
if (var_name.is_empty() && allow_empty) { if (var_name.is_empty() && allow_empty) {
BUTTON_SET_ICON(status_btn, theme_cache.var_empty_icon); status_btn->set_button_icon(theme_cache.var_empty_icon);
status_btn->set_tooltip_text(TTR("Variable name not specified.\nClick to open the blackboard plan.")); status_btn->set_tooltip_text(TTR("Variable name not specified.\nClick to open the blackboard plan."));
} else if (plan->has_var(var_name)) { } else if (plan->has_var(var_name)) {
if (expected_type == Variant::NIL || plan->get_var(var_name).get_type() == Variant::NIL || plan->get_var(var_name).get_type() == expected_type) { if (expected_type == Variant::NIL || plan->get_var(var_name).get_type() == Variant::NIL || plan->get_var(var_name).get_type() == expected_type) {
BUTTON_SET_ICON(status_btn, theme_cache.var_exists_icon); status_btn->set_button_icon(theme_cache.var_exists_icon);
status_btn->set_tooltip_text(TTR("This variable is present in the blackboard plan.\nClick to open the blackboard plan.")); status_btn->set_tooltip_text(TTR("This variable is present in the blackboard plan.\nClick to open the blackboard plan."));
} else { } else {
BUTTON_SET_ICON(status_btn, theme_cache.var_error_icon); status_btn->set_button_icon(theme_cache.var_error_icon);
status_btn->set_tooltip_text(TTR(vformat( status_btn->set_tooltip_text(TTR(vformat(
"The %s variable in the blackboard plan should be of type %s.\nClick to open the blackboard plan.", "The %s variable in the blackboard plan should be of type %s.\nClick to open the blackboard plan.",
LimboUtility::get_singleton()->decorate_var(var_name), LimboUtility::get_singleton()->decorate_var(var_name),
Variant::get_type_name(expected_type)))); Variant::get_type_name(expected_type))));
} }
} else if (name_edit->get_text().begins_with("_")) { } else if (name_edit->get_text().begins_with("_")) {
BUTTON_SET_ICON(status_btn, theme_cache.var_private_icon); status_btn->set_button_icon(theme_cache.var_private_icon);
status_btn->set_tooltip_text(TTR("This variable is private and is not included in the blackboard plan.\nClick to open the blackboard plan.")); status_btn->set_tooltip_text(TTR("This variable is private and is not included in the blackboard plan.\nClick to open the blackboard plan."));
} else { } else {
BUTTON_SET_ICON(status_btn, theme_cache.var_not_found_icon); status_btn->set_button_icon(theme_cache.var_not_found_icon);
status_btn->set_tooltip_text(TTR("No matching variable found in the blackboard plan!\nClick to open the blackboard plan.")); status_btn->set_tooltip_text(TTR("No matching variable found in the blackboard plan!\nClick to open the blackboard plan."));
} }
} }
void EditorPropertyVariableName::_status_pressed() { void EditorPropertyVariableName::_status_pressed() {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
if (!plan->has_var(name_edit->get_text())) { if (!plan->has_var(name_edit->get_text())) {
BlackboardPlanEditor::get_singleton()->set_defaults(name_edit->get_text(), BlackboardPlanEditor::get_singleton()->set_defaults(name_edit->get_text(),
expected_type == Variant::NIL ? Variant::FLOAT : expected_type, expected_type == Variant::NIL ? Variant::FLOAT : expected_type,
@ -120,14 +120,14 @@ void EditorPropertyVariableName::_status_pressed() {
} }
void EditorPropertyVariableName::_status_mouse_entered() { void EditorPropertyVariableName::_status_mouse_entered() {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
if (!plan->has_var(name_edit->get_text())) { if (!plan->has_var(name_edit->get_text())) {
BUTTON_SET_ICON(status_btn, theme_cache.var_add_icon); status_btn->set_button_icon(theme_cache.var_add_icon);
} }
} }
void EditorPropertyVariableName::_status_mouse_exited() { void EditorPropertyVariableName::_status_mouse_exited() {
ERR_FAIL_NULL(plan); ERR_FAIL_COND(plan.is_null());
_update_status(); _update_status();
} }
@ -182,7 +182,7 @@ void EditorPropertyVariableName::_notification(int p_what) {
} }
} break; } break;
case NOTIFICATION_THEME_CHANGED: { case NOTIFICATION_THEME_CHANGED: {
BUTTON_SET_ICON(drop_btn, get_theme_icon(LW_NAME(GuiOptionArrow), LW_NAME(EditorIcons))); drop_btn->set_button_icon(get_theme_icon(LW_NAME(GuiOptionArrow), LW_NAME(EditorIcons)));
theme_cache.var_add_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarAdd)); theme_cache.var_add_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarAdd));
theme_cache.var_exists_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarExists)); theme_cache.var_exists_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarExists));
theme_cache.var_not_found_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarNotFound)); theme_cache.var_not_found_icon = LimboUtility::get_singleton()->get_task_icon(LW_NAME(LimboVarNotFound));
@ -262,7 +262,7 @@ bool EditorInspectorPluginVariableName::_parse_property(Object *p_object, const
Variant default_value; Variant default_value;
if (is_mapping) { if (is_mapping) {
plan.reference_ptr(Object::cast_to<BlackboardPlan>(p_object)); plan.reference_ptr(Object::cast_to<BlackboardPlan>(p_object));
ERR_FAIL_NULL_V(plan, false); ERR_FAIL_COND_V(plan.is_null(), false);
String var_name = p_path.trim_prefix("mapping/"); String var_name = p_path.trim_prefix("mapping/");
if (plan->has_var(var_name)) { if (plan->has_var(var_name)) {
BBVariable variable = plan->get_var(var_name); BBVariable variable = plan->get_var(var_name);
@ -277,7 +277,7 @@ bool EditorInspectorPluginVariableName::_parse_property(Object *p_object, const
plan = parent_plan; plan = parent_plan;
} }
} }
ERR_FAIL_NULL_V(plan, false); ERR_FAIL_COND_V(plan.is_null(), false);
} else { } else {
plan = editor_plan_provider.call(); plan = editor_plan_provider.call();
} }

View File

@ -200,7 +200,7 @@ void LimboAIEditor::_remove_task(const Ref<BTTask> &p_task) {
ERR_FAIL_COND(p_task.is_null()); ERR_FAIL_COND(p_task.is_null());
ERR_FAIL_COND(task_tree->get_bt().is_null()); ERR_FAIL_COND(task_tree->get_bt().is_null());
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Remove BT Task")); EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Remove BT Task"));
if (p_task->get_parent() == nullptr) { if (p_task->get_parent().is_null()) {
ERR_FAIL_COND(task_tree->get_bt()->get_root_task() != p_task); ERR_FAIL_COND(task_tree->get_bt()->get_root_task() != p_task);
undo_redo->add_do_method(task_tree->get_bt().ptr(), LW_NAME(set_root_task), Variant()); undo_redo->add_do_method(task_tree->get_bt().ptr(), LW_NAME(set_root_task), Variant());
undo_redo->add_undo_method(task_tree->get_bt().ptr(), LW_NAME(set_root_task), task_tree->get_bt()->get_root_task()); undo_redo->add_undo_method(task_tree->get_bt().ptr(), LW_NAME(set_root_task), task_tree->get_bt()->get_root_task());
@ -745,7 +745,7 @@ void LimboAIEditor::_action_selected(int p_id) {
void LimboAIEditor::_on_probability_edited(double p_value) { void LimboAIEditor::_on_probability_edited(double p_value) {
Ref<BTTask> selected = task_tree->get_selected(); Ref<BTTask> selected = task_tree->get_selected();
ERR_FAIL_COND(selected == nullptr); ERR_FAIL_COND(selected.is_null());
Ref<BTProbabilitySelector> probability_selector = selected->get_parent(); Ref<BTProbabilitySelector> probability_selector = selected->get_parent();
ERR_FAIL_COND(probability_selector.is_null()); ERR_FAIL_COND(probability_selector.is_null());
if (percent_mode->is_pressed()) { if (percent_mode->is_pressed()) {
@ -1252,7 +1252,7 @@ void LimboAIEditor::_tab_menu_option_selected(int p_id) {
} break; } break;
case TAB_JUMP_TO_OWNER: { case TAB_JUMP_TO_OWNER: {
Ref<BehaviorTree> bt = history[idx_history]; Ref<BehaviorTree> bt = history[idx_history];
ERR_FAIL_NULL(bt); ERR_FAIL_COND(bt.is_null());
String bt_path = bt->get_path(); String bt_path = bt->get_path();
if (!bt_path.is_empty()) { if (!bt_path.is_empty()) {
owner_picker->pick_and_open_owner_of_resource(bt_path); owner_picker->pick_and_open_owner_of_resource(bt_path);
@ -1370,7 +1370,7 @@ void LimboAIEditor::_update_favorite_tasks() {
} }
btn->set_text(task_name); btn->set_text(task_name);
btn->set_meta(LW_NAME(task_meta), task_meta); btn->set_meta(LW_NAME(task_meta), task_meta);
BUTTON_SET_ICON(btn, LimboUtility::get_singleton()->get_task_icon(task_meta)); btn->set_button_icon(LimboUtility::get_singleton()->get_task_icon(task_meta));
btn->set_tooltip_text(vformat(TTR("Add %s task."), task_name)); btn->set_tooltip_text(vformat(TTR("Add %s task."), task_name));
btn->set_flat(true); btn->set_flat(true);
btn->add_theme_constant_override(LW_NAME(icon_max_width), 16 * EDSCALE); // Force user icons to be of the proper size. btn->add_theme_constant_override(LW_NAME(icon_max_width), 16 * EDSCALE); // Force user icons to be of the proper size.
@ -1542,11 +1542,11 @@ void LimboAIEditor::_notification(int p_what) {
ADD_STYLEBOX_OVERRIDE(tab_bar_panel, "panel", get_theme_stylebox("tabbar_background", "TabContainer")); ADD_STYLEBOX_OVERRIDE(tab_bar_panel, "panel", get_theme_stylebox("tabbar_background", "TabContainer"));
BUTTON_SET_ICON(new_btn, get_theme_icon(LW_NAME(New), LW_NAME(EditorIcons))); new_btn->set_button_icon(get_theme_icon(LW_NAME(New), LW_NAME(EditorIcons)));
BUTTON_SET_ICON(load_btn, get_theme_icon(LW_NAME(Load), LW_NAME(EditorIcons))); load_btn->set_button_icon(get_theme_icon(LW_NAME(Load), LW_NAME(EditorIcons)));
BUTTON_SET_ICON(save_btn, get_theme_icon(LW_NAME(Save), LW_NAME(EditorIcons))); save_btn->set_button_icon(get_theme_icon(LW_NAME(Save), LW_NAME(EditorIcons)));
BUTTON_SET_ICON(new_script_btn, get_theme_icon(LW_NAME(ScriptCreate), LW_NAME(EditorIcons))); new_script_btn->set_button_icon(get_theme_icon(LW_NAME(ScriptCreate), LW_NAME(EditorIcons)));
BUTTON_SET_ICON(misc_btn, get_theme_icon(LW_NAME(Tools), LW_NAME(EditorIcons))); misc_btn->set_button_icon(get_theme_icon(LW_NAME(Tools), LW_NAME(EditorIcons)));
_update_favorite_tasks(); _update_favorite_tasks();
} break; } break;

View File

@ -26,6 +26,7 @@
#include "core/object/class_db.h" #include "core/object/class_db.h"
#include "core/object/object.h" #include "core/object/object.h"
#include "core/templates/hash_set.h" #include "core/templates/hash_set.h"
#include "editor/editor_main_screen.h"
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "editor/editor_undo_redo_manager.h" #include "editor/editor_undo_redo_manager.h"
#include "editor/gui/editor_spin_slider.h" #include "editor/gui/editor_spin_slider.h"
@ -42,6 +43,7 @@
#include "scene/gui/popup.h" #include "scene/gui/popup.h"
#include "scene/gui/popup_menu.h" #include "scene/gui/popup_menu.h"
#include "scene/gui/split_container.h" #include "scene/gui/split_container.h"
#include "scene/gui/tab_bar.h"
#include "scene/gui/tree.h" #include "scene/gui/tree.h"
#include "scene/resources/texture.h" #include "scene/resources/texture.h"
#endif // LIMBOAI_MODULE #endif // LIMBOAI_MODULE
@ -295,7 +297,7 @@ public:
#ifdef LIMBOAI_MODULE #ifdef LIMBOAI_MODULE
bool has_main_screen() const override { return true; } bool has_main_screen() const override { return true; }
virtual String get_name() const override { return "LimboAI"; } virtual String get_plugin_name() const override { return "LimboAI"; }
virtual void make_visible(bool p_visible) override; virtual void make_visible(bool p_visible) override;
virtual void edit(Object *p_object) override; virtual void edit(Object *p_object) override;
virtual bool handles(Object *p_object) const override; virtual bool handles(Object *p_object) const override;

View File

@ -44,7 +44,7 @@ private:
_FORCE_INLINE_ void _set_mode_by_index(int p_index) { _FORCE_INLINE_ void _set_mode_by_index(int p_index) {
current_mode_index = p_index; current_mode_index = p_index;
BUTTON_SET_ICON(this, modes[current_mode_index].icon); this->set_button_icon(modes[current_mode_index].icon);
if (!modes[current_mode_index].tooltip.is_empty()) { if (!modes[current_mode_index].tooltip.is_empty()) {
set_tooltip_text(modes[current_mode_index].tooltip); set_tooltip_text(modes[current_mode_index].tooltip);
} }

View File

@ -68,9 +68,6 @@ Control *TaskButton::_do_make_tooltip() const {
help_symbol = "class|" + task_meta + "|"; help_symbol = "class|" + task_meta + "|";
} }
EditorHelpBit *help_bit = memnew(EditorHelpBit(help_symbol));
help_bit->set_content_height_limits(1, 360 * EDSCALE);
String desc = _module_get_help_description(task_meta); String desc = _module_get_help_description(task_meta);
if (desc.is_empty() && is_resource) { if (desc.is_empty() && is_resource) {
// ! HACK: Force documentation parsing. // ! HACK: Force documentation parsing.
@ -84,14 +81,10 @@ Control *TaskButton::_do_make_tooltip() const {
desc = _module_get_help_description(task_meta); desc = _module_get_help_description(task_meta);
} }
} }
if (desc.is_empty() && help_bit->get_description().is_empty()) { if (desc.is_empty()) {
desc = "[i]" + TTR("No description.") + "[/i]"; desc = "[i]" + TTR("No description.") + "[/i]";
} }
if (!desc.is_empty()) { EditorHelpBitTooltip::show_tooltip(const_cast<TaskButton *>(this), help_symbol, desc);
help_bit->set_description(desc);
}
EditorHelpBitTooltip::show_tooltip(help_bit, const_cast<TaskButton *>(this));
#endif // LIMBOAI_MODULE #endif // LIMBOAI_MODULE
#ifdef LIMBOAI_GDEXTENSION #ifdef LIMBOAI_GDEXTENSION
@ -184,7 +177,7 @@ void TaskPaletteSection::set_filter(String p_filter_text) {
void TaskPaletteSection::add_task_button(const String &p_name, const Ref<Texture> &icon, const String &p_meta) { void TaskPaletteSection::add_task_button(const String &p_name, const Ref<Texture> &icon, const String &p_meta) {
TaskButton *btn = memnew(TaskButton); TaskButton *btn = memnew(TaskButton);
btn->set_text(p_name); btn->set_text(p_name);
BUTTON_SET_ICON(btn, icon); btn->set_button_icon(icon);
btn->set_tooltip_text("dummy_text"); // Force tooltip to be shown. btn->set_tooltip_text("dummy_text"); // Force tooltip to be shown.
btn->set_task_meta(p_meta); btn->set_task_meta(p_meta);
btn->add_theme_constant_override(LW_NAME(icon_max_width), 16 * EDSCALE); // Force user icons to be of the proper size. btn->add_theme_constant_override(LW_NAME(icon_max_width), 16 * EDSCALE); // Force user icons to be of the proper size.
@ -195,7 +188,7 @@ void TaskPaletteSection::add_task_button(const String &p_name, const Ref<Texture
void TaskPaletteSection::set_collapsed(bool p_collapsed) { void TaskPaletteSection::set_collapsed(bool p_collapsed) {
tasks_container->set_visible(!p_collapsed); tasks_container->set_visible(!p_collapsed);
BUTTON_SET_ICON(section_header, (p_collapsed ? theme_cache.arrow_right_icon : theme_cache.arrow_down_icon)); section_header->set_button_icon((p_collapsed ? theme_cache.arrow_right_icon : theme_cache.arrow_down_icon));
} }
bool TaskPaletteSection::is_collapsed() const { bool TaskPaletteSection::is_collapsed() const {
@ -214,7 +207,7 @@ void TaskPaletteSection::_notification(int p_what) {
} break; } break;
case NOTIFICATION_THEME_CHANGED: { case NOTIFICATION_THEME_CHANGED: {
_do_update_theme_item_cache(); _do_update_theme_item_cache();
BUTTON_SET_ICON(section_header, (is_collapsed() ? theme_cache.arrow_right_icon : theme_cache.arrow_down_icon)); section_header->set_button_icon((is_collapsed() ? theme_cache.arrow_right_icon : theme_cache.arrow_down_icon));
section_header->add_theme_font_override(LW_NAME(font), get_theme_font(LW_NAME(bold), LW_NAME(EditorFonts))); section_header->add_theme_font_override(LW_NAME(font), get_theme_font(LW_NAME(bold), LW_NAME(EditorFonts)));
} break; } break;
} }
@ -600,13 +593,13 @@ void TaskPalette::_notification(int p_what) {
case NOTIFICATION_THEME_CHANGED: { case NOTIFICATION_THEME_CHANGED: {
_do_update_theme_item_cache(); _do_update_theme_item_cache();
BUTTON_SET_ICON(tool_filters, get_theme_icon(LW_NAME(AnimationFilter), LW_NAME(EditorIcons))); tool_filters->set_button_icon(get_theme_icon(LW_NAME(AnimationFilter), LW_NAME(EditorIcons)));
BUTTON_SET_ICON(tool_refresh, get_theme_icon(LW_NAME(Reload), LW_NAME(EditorIcons))); tool_refresh->set_button_icon(get_theme_icon(LW_NAME(Reload), LW_NAME(EditorIcons)));
filter_edit->set_right_icon(get_theme_icon(LW_NAME(Search), LW_NAME(EditorIcons))); filter_edit->set_right_icon(get_theme_icon(LW_NAME(Search), LW_NAME(EditorIcons)));
BUTTON_SET_ICON(select_all, LimboUtility::get_singleton()->get_task_icon("LimboSelectAll")); select_all->set_button_icon(LimboUtility::get_singleton()->get_task_icon("LimboSelectAll"));
BUTTON_SET_ICON(deselect_all, LimboUtility::get_singleton()->get_task_icon("LimboDeselectAll")); deselect_all->set_button_icon(LimboUtility::get_singleton()->get_task_icon("LimboDeselectAll"));
category_choice->queue_redraw(); category_choice->queue_redraw();

View File

@ -192,7 +192,7 @@ void TaskTree::_on_item_collapsed(Object *p_obj) {
} }
Ref<BTTask> task = item->get_metadata(0); Ref<BTTask> task = item->get_metadata(0);
ERR_FAIL_NULL(task); ERR_FAIL_COND(task.is_null());
task->set_display_collapsed(item->is_collapsed()); task->set_display_collapsed(item->is_collapsed());
} }
@ -574,7 +574,7 @@ void TaskTree::_bind_methods() {
// TreeSearch API // TreeSearch API
void TaskTree::tree_search_show_and_focus() { void TaskTree::tree_search_show_and_focus() {
ERR_FAIL_NULL(tree_search); ERR_FAIL_COND(tree_search.is_null());
tree_search_panel->set_visible(true); tree_search_panel->set_visible(true);
tree_search_panel->focus_editor(); tree_search_panel->focus_editor();
} }
@ -587,7 +587,7 @@ TreeSearch::SearchInfo TaskTree::tree_search_get_search_info() const {
} }
void TaskTree::tree_search_set_search_info(const TreeSearch::SearchInfo &p_search_info) { void TaskTree::tree_search_set_search_info(const TreeSearch::SearchInfo &p_search_info) {
ERR_FAIL_NULL(tree_search); ERR_FAIL_COND(tree_search.is_null());
tree_search_panel->set_search_info(p_search_info); tree_search_panel->set_search_info(p_search_info);
} }

View File

@ -158,7 +158,7 @@ void TreeSearch::_draw_highlight_item(TreeItem *p_tree_item, const Rect2 p_rect,
if (font.is_null()) { if (font.is_null()) {
font = p_tree_item->get_tree()->get_theme_font(LW_NAME(font)); font = p_tree_item->get_tree()->get_theme_font(LW_NAME(font));
} }
ERR_FAIL_NULL(font); ERR_FAIL_COND(font.is_null());
float font_size = p_tree_item->get_custom_font_size(0); float font_size = p_tree_item->get_custom_font_size(0);
if (font_size == -1) { if (font_size == -1) {
font_size = p_tree_item->get_tree()->get_theme_font_size(LW_NAME(font)); font_size = p_tree_item->get_tree()->get_theme_font_size(LW_NAME(font));
@ -176,7 +176,7 @@ void TreeSearch::_draw_highlight_item(TreeItem *p_tree_item, const Rect2 p_rect,
// Stylebox // Stylebox
Ref<StyleBox> stylebox = p_tree_item->get_tree()->get_theme_stylebox(LW_NAME(Focus)); Ref<StyleBox> stylebox = p_tree_item->get_tree()->get_theme_stylebox(LW_NAME(Focus));
ERR_FAIL_NULL(stylebox); ERR_FAIL_COND(stylebox.is_null());
// Extract separation // Extract separation
float h_sep = p_tree_item->get_tree()->get_theme_constant(LW_NAME(h_separation)); float h_sep = p_tree_item->get_tree()->get_theme_constant(LW_NAME(h_separation));
@ -559,9 +559,9 @@ void TreeSearchPanel::_notification(int p_what) {
break; break;
} }
case NOTIFICATION_THEME_CHANGED: { case NOTIFICATION_THEME_CHANGED: {
BUTTON_SET_ICON(close_button, get_theme_icon(LW_NAME(Close), LW_NAME(EditorIcons))); close_button->set_button_icon(get_theme_icon(LW_NAME(Close), LW_NAME(EditorIcons)));
BUTTON_SET_ICON(find_prev_button, get_theme_icon("MoveUp", LW_NAME(EditorIcons))); find_prev_button->set_button_icon(get_theme_icon("MoveUp", LW_NAME(EditorIcons)));
BUTTON_SET_ICON(find_next_button, get_theme_icon("MoveDown", LW_NAME(EditorIcons))); find_next_button->set_button_icon(get_theme_icon("MoveDown", LW_NAME(EditorIcons)));
label_filter->set_text(TTR("Filter")); label_filter->set_text(TTR("Filter"));
break; break;
} }

View File

@ -17,19 +17,19 @@ linux.debug.arm64 = "res://addons/limboai/bin/liblimboai.linux.editor.arm64.so"
linux.release.arm64 = "res://addons/limboai/bin/liblimboai.linux.template_release.arm64.so" linux.release.arm64 = "res://addons/limboai/bin/liblimboai.linux.template_release.arm64.so"
linux.debug.rv64 = "res://addons/limboai/bin/liblimboai.linux.editor.rv64.so" linux.debug.rv64 = "res://addons/limboai/bin/liblimboai.linux.editor.rv64.so"
linux.release.rv64 = "res://addons/limboai/bin/liblimboai.linux.template_release.rv64.so" linux.release.rv64 = "res://addons/limboai/bin/liblimboai.linux.template_release.rv64.so"
android.debug.arm64 = "res://addons/limboai/bin/liblimboai.android.template_debug.arm64.so" android.debug.arm64 = "res://addons/limboai/bin/liblimboai.android.editor.arm64.so"
android.release.arm64 = "res://addons/limboai/bin/liblimboai.android.template_release.arm64.so" android.release.arm64 = "res://addons/limboai/bin/liblimboai.android.template_release.arm64.so"
android.debug.arm32 = "res://addons/limboai/bin/liblimboai.android.template_debug.arm32.so" android.debug.arm32 = "res://addons/limboai/bin/liblimboai.android.editor.arm32.so"
android.release.arm32 = "res://addons/limboai/bin/liblimboai.android.template_release.arm32.so" android.release.arm32 = "res://addons/limboai/bin/liblimboai.android.template_release.arm32.so"
android.debug.x86_64 = "res://addons/limboai/bin/liblimboai.android.template_debug.x86_64.so" android.debug.x86_64 = "res://addons/limboai/bin/liblimboai.android.editor.x86_64.so"
android.release.x86_64 = "res://addons/limboai/bin/liblimboai.android.template_release.x86_64.so" android.release.x86_64 = "res://addons/limboai/bin/liblimboai.android.template_release.x86_64.so"
android.debug.x86_32 = "res://addons/limboai/bin/liblimboai.android.template_debug.x86_32.so" android.debug.x86_32 = "res://addons/limboai/bin/liblimboai.android.editor.x86_32.so"
android.release.x86_32 = "res://addons/limboai/bin/liblimboai.android.template_release.x86_32.so" android.release.x86_32 = "res://addons/limboai/bin/liblimboai.android.template_release.x86_32.so"
ios.debug.arm64 = "res://addons/limboai/bin/liblimboai.ios.editor.arm64.dylib"
ios.release.arm64 = "res://addons/limboai/bin/liblimboai.ios.template_release.arm64.dylib" ios.release.arm64 = "res://addons/limboai/bin/liblimboai.ios.template_release.arm64.dylib"
ios.debug.arm64 = "res://addons/limboai/bin/liblimboai.ios.template_debug.arm64.dylib" ios.debug.simulator = "res://addons/limboai/bin/liblimboai.ios.editor.universal.dylib"
ios.release.simulator = "res://addons/limboai/bin/liblimboai.ios.template_release.universal.dylib" ios.release.simulator = "res://addons/limboai/bin/liblimboai.ios.template_release.universal.dylib"
ios.debug.simulator = "res://addons/limboai/bin/liblimboai.ios.template_debug.universal.dylib" web.debug.wasm32 = "res://addons/limboai/bin/liblimboai.web.editor.wasm32.wasm"
web.debug.wasm32 = "res://addons/limboai/bin/liblimboai.web.template_debug.wasm32.wasm"
web.release.wasm32 = "res://addons/limboai/bin/liblimboai.web.template_release.wasm32.wasm" web.release.wasm32 = "res://addons/limboai/bin/liblimboai.web.template_release.wasm32.wasm"
[icons] [icons]

View File

@ -78,7 +78,7 @@ TEST_CASE("[Modules][LimboAI] BTTask") {
SUBCASE("Test next_sibling()") { SUBCASE("Test next_sibling()") {
CHECK(child1->next_sibling() == child2); CHECK(child1->next_sibling() == child2);
CHECK(child2->next_sibling() == child3); CHECK(child2->next_sibling() == child3);
CHECK(child3->next_sibling() == nullptr); CHECK(child3->next_sibling().is_null());
} }
SUBCASE("Test remove_child()") { SUBCASE("Test remove_child()") {
task->remove_child(child2); task->remove_child(child2);
@ -153,7 +153,7 @@ TEST_CASE("[Modules][LimboAI] BTTask") {
CHECK(child3->get_root() == task); CHECK(child3->get_root() == task);
} }
SUBCASE("Test get_parent()") { SUBCASE("Test get_parent()") {
CHECK(task->get_parent() == nullptr); CHECK(task->get_parent().is_null());
CHECK(child1->get_parent() == task); CHECK(child1->get_parent() == task);
CHECK(child2->get_parent() == task); CHECK(child2->get_parent() == task);
CHECK(child2->get_parent() == task); CHECK(child2->get_parent() == task);

View File

@ -16,6 +16,7 @@
#ifdef TOOLS_ENABLED #ifdef TOOLS_ENABLED
#include "core/io/resource.h" #include "core/io/resource.h"
#include "core/variant/variant.h" #include "core/variant/variant.h"
#include "editor/editor_main_screen.h"
#include "editor/editor_node.h" #include "editor/editor_node.h"
#include "editor/plugins/script_editor_plugin.h" #include "editor/plugins/script_editor_plugin.h"
#endif // TOOLS_ENABLED #endif // TOOLS_ENABLED
@ -213,7 +214,7 @@ Variant VARIANT_DEFAULT(Variant::Type p_type) {
void SHOW_BUILTIN_DOC(const String &p_topic) { void SHOW_BUILTIN_DOC(const String &p_topic) {
#ifdef LIMBOAI_MODULE #ifdef LIMBOAI_MODULE
ScriptEditor::get_singleton()->goto_help(p_topic); ScriptEditor::get_singleton()->goto_help(p_topic);
EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT); EditorNode::get_singleton()->get_editor_main_screen()->select(EditorMainScreen::EDITOR_SCRIPT);
#elif LIMBOAI_GDEXTENSION #elif LIMBOAI_GDEXTENSION
TypedArray<ScriptEditorBase> open_editors = EditorInterface::get_singleton()->get_script_editor()->get_open_script_editors(); TypedArray<ScriptEditorBase> open_editors = EditorInterface::get_singleton()->get_script_editor()->get_open_script_editors();
ERR_FAIL_COND_MSG(open_editors.size() == 0, "Can't open help page. Need at least one script open in the script editor."); ERR_FAIL_COND_MSG(open_editors.size() == 0, "Can't open help page. Need at least one script open in the script editor.");

View File

@ -28,7 +28,7 @@
#define EDITOR_FILE_SYSTEM() (EditorFileSystem::get_singleton()) #define EDITOR_FILE_SYSTEM() (EditorFileSystem::get_singleton())
#define EDITOR_SETTINGS() (EditorSettings::get_singleton()) #define EDITOR_SETTINGS() (EditorSettings::get_singleton())
#define BASE_CONTROL() (EditorNode::get_singleton()->get_gui_base()) #define BASE_CONTROL() (EditorNode::get_singleton()->get_gui_base())
#define MAIN_SCREEN_CONTROL() (EditorNode::get_singleton()->get_main_screen_control()) #define MAIN_SCREEN_CONTROL() (EditorNode::get_singleton()->get_editor_main_screen())
#define SCENE_TREE() (SceneTree::get_singleton()) #define SCENE_TREE() (SceneTree::get_singleton())
#define IS_DEBUGGER_ACTIVE() (EngineDebugger::is_active()) #define IS_DEBUGGER_ACTIVE() (EngineDebugger::is_active())
#define FS_DOCK_SELECT_FILE(m_path) FileSystemDock::get_singleton()->select_file(m_path) #define FS_DOCK_SELECT_FILE(m_path) FileSystemDock::get_singleton()->select_file(m_path)
@ -37,7 +37,6 @@
#define IS_CLASS(m_obj, m_class) (m_obj->is_class_ptr(m_class::get_class_ptr_static())) #define IS_CLASS(m_obj, m_class) (m_obj->is_class_ptr(m_class::get_class_ptr_static()))
#define RAND_RANGE(m_from, m_to) (Math::random(m_from, m_to)) #define RAND_RANGE(m_from, m_to) (Math::random(m_from, m_to))
#define RANDF() (Math::randf()) #define RANDF() (Math::randf())
#define BUTTON_SET_ICON(m_btn, m_icon) m_btn->set_icon(m_icon)
#define RESOURCE_LOAD(m_path, m_hint) ResourceLoader::load(m_path, m_hint) #define RESOURCE_LOAD(m_path, m_hint) ResourceLoader::load(m_path, m_hint)
#define RESOURCE_LOAD_NO_CACHE(m_path, m_hint) ResourceLoader::load(m_path, m_hint, ResourceFormatLoader::CACHE_MODE_IGNORE) #define RESOURCE_LOAD_NO_CACHE(m_path, m_hint) ResourceLoader::load(m_path, m_hint, ResourceFormatLoader::CACHE_MODE_IGNORE)
#define RESOURCE_SAVE(m_res, m_path, m_flags) ResourceSaver::save(m_res, m_path, m_flags) #define RESOURCE_SAVE(m_res, m_path, m_flags) ResourceSaver::save(m_res, m_path, m_flags)
@ -47,7 +46,7 @@
#define GET_PROJECT_SETTINGS_DIR() EditorPaths::get_singleton()->get_project_settings_dir() #define GET_PROJECT_SETTINGS_DIR() EditorPaths::get_singleton()->get_project_settings_dir()
#define EDIT_RESOURCE(m_res) EditorNode::get_singleton()->edit_resource(m_res) #define EDIT_RESOURCE(m_res) EditorNode::get_singleton()->edit_resource(m_res)
#define INSPECTOR_GET_EDITED_OBJECT() (InspectorDock::get_inspector_singleton()->get_edited_object()) #define INSPECTOR_GET_EDITED_OBJECT() (InspectorDock::get_inspector_singleton()->get_edited_object())
#define SET_MAIN_SCREEN_EDITOR(m_name) (EditorNode::get_singleton()->select_editor_by_name(m_name)) #define SET_MAIN_SCREEN_EDITOR(m_name) (EditorNode::get_singleton()->get_editor_main_screen()->select_by_name(m_name))
#define FILE_EXISTS(m_path) FileAccess::exists(m_path) #define FILE_EXISTS(m_path) FileAccess::exists(m_path)
#define DIR_ACCESS_CREATE() DirAccess::create(DirAccess::ACCESS_RESOURCES) #define DIR_ACCESS_CREATE() DirAccess::create(DirAccess::ACCESS_RESOURCES)
#define PERFORMANCE_ADD_CUSTOM_MONITOR(m_id, m_callable) (Performance::get_singleton()->add_custom_monitor(m_id, m_callable, Variant())) #define PERFORMANCE_ADD_CUSTOM_MONITOR(m_id, m_callable) (Performance::get_singleton()->add_custom_monitor(m_id, m_callable, Variant()))
@ -96,7 +95,6 @@ using namespace godot;
#define IS_CLASS(m_obj, m_class) (m_obj->is_class(#m_class)) #define IS_CLASS(m_obj, m_class) (m_obj->is_class(#m_class))
#define RAND_RANGE(m_from, m_to) (UtilityFunctions::randf_range(m_from, m_to)) #define RAND_RANGE(m_from, m_to) (UtilityFunctions::randf_range(m_from, m_to))
#define RANDF() (UtilityFunctions::randf()) #define RANDF() (UtilityFunctions::randf())
#define BUTTON_SET_ICON(m_btn, m_icon) m_btn->set_button_icon(m_icon)
#define RESOURCE_LOAD(m_path, m_hint) ResourceLoader::get_singleton()->load(m_path, m_hint) #define RESOURCE_LOAD(m_path, m_hint) ResourceLoader::get_singleton()->load(m_path, m_hint)
#define RESOURCE_LOAD_NO_CACHE(m_path, m_hint) ResourceLoader::get_singleton()->load(m_path, m_hint, ResourceLoader::CACHE_MODE_IGNORE) #define RESOURCE_LOAD_NO_CACHE(m_path, m_hint) ResourceLoader::get_singleton()->load(m_path, m_hint, ResourceLoader::CACHE_MODE_IGNORE)
#define RESOURCE_SAVE(m_res, m_path, m_flags) ResourceSaver::get_singleton()->save(m_res, m_path, m_flags) #define RESOURCE_SAVE(m_res, m_path, m_flags) ResourceSaver::get_singleton()->save(m_res, m_path, m_flags)

View File

@ -93,7 +93,7 @@ Ref<Texture2D> LimboUtility::get_task_icon(String p_class_or_script_path) const
} }
EditorData &ed = EditorNode::get_editor_data(); EditorData &ed = EditorNode::get_editor_data();
Ref<Texture2D> script_icon = ed.get_script_icon(s); Ref<Texture2D> script_icon = ed.get_script_icon(s->get_path());
if (script_icon.is_valid()) { if (script_icon.is_valid()) {
return script_icon; return script_icon;
} }
@ -395,6 +395,20 @@ String LimboUtility::get_property_hint_text(PropertyHint p_hint) const {
case PROPERTY_HINT_ARRAY_TYPE: { case PROPERTY_HINT_ARRAY_TYPE: {
return "ARRAY_TYPE"; return "ARRAY_TYPE";
} }
case PROPERTY_HINT_DICTIONARY_TYPE: {
return "DICTIONARY_TYPE";
}
case PROPERTY_HINT_TOOL_BUTTON: {
return "TOOL_BUTTON";
}
case PROPERTY_HINT_ONESHOT: {
return "ONESHOT";
}
#ifdef LIMBOAI_MODULE
case PROPERTY_HINT_NO_NODEPATH: {
return "NO_NODEPATH";
}
#endif // ! LIMBOAI_MODULE
case PROPERTY_HINT_LOCALE_ID: { case PROPERTY_HINT_LOCALE_ID: {
return "LOCALE_ID"; return "LOCALE_ID";
} }