Merge pull request #201 from limbonaut/fix-undo-redo
Fix editor undo polluting scene history if `BehaviorTree` is not saved to a file
This commit is contained in:
commit
a92fb9da8e
|
@ -43,7 +43,7 @@ BT::Status BTInstance::update(double p_delta) {
|
|||
#endif
|
||||
|
||||
last_status = root_task->execute(p_delta);
|
||||
emit_signal(LimboStringNames::get_singleton()->updated, last_status);
|
||||
emit_signal(LW_NAME(updated), last_status);
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
double end = Time::get_singleton()->get_ticks_usec();
|
||||
|
|
|
@ -125,6 +125,7 @@ String BTTask::get_task_name() {
|
|||
Ref<Script> task_script = get_script();
|
||||
|
||||
if (task_script.is_valid()) {
|
||||
// ! CURSED: Currently, has_method() doesn't return true for ClassDB-registered native virtual methods. This may break in the future.
|
||||
bool has_generate_method = has_method(LW_NAME(_generate_name));
|
||||
ERR_FAIL_COND_V_MSG(has_generate_method && !task_script->is_tool(), _generate_name(), vformat("BTTask: @tool annotation is required if _generate_name is defined: %s", task_script->get_path()));
|
||||
if (task_script->is_tool() && has_generate_method) {
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
#include "editor/editor_interface.h"
|
||||
#include "editor/editor_paths.h"
|
||||
#include "editor/editor_settings.h"
|
||||
#include "editor/editor_undo_redo_manager.h"
|
||||
#include "editor/filesystem_dock.h"
|
||||
#include "editor/gui/editor_bottom_panel.h"
|
||||
#include "editor/inspector_dock.h"
|
||||
|
@ -58,7 +57,6 @@
|
|||
#include <godot_cpp/classes/editor_interface.hpp>
|
||||
#include <godot_cpp/classes/editor_paths.hpp>
|
||||
#include <godot_cpp/classes/editor_settings.hpp>
|
||||
#include <godot_cpp/classes/editor_undo_redo_manager.hpp>
|
||||
#include <godot_cpp/classes/file_access.hpp>
|
||||
#include <godot_cpp/classes/file_system_dock.hpp>
|
||||
#include <godot_cpp/classes/input.hpp>
|
||||
|
@ -82,14 +80,33 @@ _FORCE_INLINE_ String _get_script_template_path() {
|
|||
return templates_search_path.path_join("BTTask").path_join("custom_task.gd");
|
||||
}
|
||||
|
||||
EditorUndoRedoManager *LimboAIEditor::_new_undo_redo_action(const String &p_name, UndoRedo::MergeMode p_mode) {
|
||||
#ifdef LIMBOAI_MODULE
|
||||
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
|
||||
#elif LIMBOAI_GDEXTENSION
|
||||
EditorUndoRedoManager *undo_redo = plugin->get_undo_redo();
|
||||
#endif
|
||||
// ! HACK: Force global history to be used for resources without a set path.
|
||||
undo_redo->create_action(p_name, p_mode, dummy_history_context);
|
||||
undo_redo->force_fixed_history();
|
||||
return undo_redo;
|
||||
}
|
||||
|
||||
void LimboAIEditor::_commit_action_with_update(EditorUndoRedoManager *p_undo_redo) {
|
||||
ERR_FAIL_NULL(p_undo_redo);
|
||||
p_undo_redo->add_do_method(this, LW_NAME(_update_task_tree), task_tree->get_bt());
|
||||
p_undo_redo->add_undo_method(this, LW_NAME(_update_task_tree), task_tree->get_bt());
|
||||
p_undo_redo->commit_action();
|
||||
_mark_as_dirty(true);
|
||||
}
|
||||
|
||||
void LimboAIEditor::_add_task(const Ref<BTTask> &p_task, bool p_as_sibling) {
|
||||
if (task_tree->get_bt().is_null()) {
|
||||
return;
|
||||
}
|
||||
ERR_FAIL_COND(p_task.is_null());
|
||||
|
||||
EditorUndoRedoManager *undo_redo = GET_UNDO_REDO();
|
||||
undo_redo->create_action(TTR("Add BT Task"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Add BT Task"));
|
||||
|
||||
int insert_idx = -1;
|
||||
Ref<BTTask> selected = task_tree->get_selected();
|
||||
|
@ -112,11 +129,7 @@ void LimboAIEditor::_add_task(const Ref<BTTask> &p_task, bool p_as_sibling) {
|
|||
undo_redo->add_do_method(parent.ptr(), LW_NAME(add_child_at_index), p_task, insert_idx);
|
||||
undo_redo->add_undo_method(parent.ptr(), LW_NAME(remove_child), p_task);
|
||||
}
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
|
||||
undo_redo->commit_action();
|
||||
_mark_as_dirty(true);
|
||||
_commit_action_with_update(undo_redo);
|
||||
}
|
||||
|
||||
void LimboAIEditor::_add_task_with_prototype(const Ref<BTTask> &p_prototype) {
|
||||
|
@ -169,8 +182,7 @@ void LimboAIEditor::_add_task_by_class_or_path(const String &p_class_or_path) {
|
|||
void LimboAIEditor::_remove_task(const Ref<BTTask> &p_task) {
|
||||
ERR_FAIL_COND(p_task.is_null());
|
||||
ERR_FAIL_COND(task_tree->get_bt().is_null());
|
||||
EditorUndoRedoManager *undo_redo = GET_UNDO_REDO();
|
||||
undo_redo->create_action(TTR("Remove BT Task"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Remove BT Task"));
|
||||
if (p_task->get_parent() == nullptr) {
|
||||
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());
|
||||
|
@ -179,9 +191,7 @@ void LimboAIEditor::_remove_task(const Ref<BTTask> &p_task) {
|
|||
undo_redo->add_do_method(p_task->get_parent().ptr(), LW_NAME(remove_child), p_task);
|
||||
undo_redo->add_undo_method(p_task->get_parent().ptr(), LW_NAME(add_child_at_index), p_task, p_task->get_index());
|
||||
}
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->commit_action();
|
||||
_commit_action_with_update(undo_redo);
|
||||
}
|
||||
|
||||
void LimboAIEditor::_new_bt() {
|
||||
|
@ -219,6 +229,20 @@ void LimboAIEditor::_load_bt(String p_path) {
|
|||
EDIT_RESOURCE(bt);
|
||||
}
|
||||
|
||||
void LimboAIEditor::_update_task_tree(const Ref<BehaviorTree> &p_bt, const Ref<BTTask> &p_specific_task) {
|
||||
ERR_FAIL_COND(p_bt.is_null());
|
||||
if (task_tree->get_bt() == p_bt) {
|
||||
if (p_specific_task.is_null()) {
|
||||
task_tree->update_tree();
|
||||
} else {
|
||||
task_tree->update_task(p_specific_task);
|
||||
}
|
||||
} else {
|
||||
// The given BT is not being displayed - open it.
|
||||
edit_bt(p_bt);
|
||||
}
|
||||
}
|
||||
|
||||
void LimboAIEditor::_disable_editing() {
|
||||
task_tree->unload();
|
||||
task_palette->hide();
|
||||
|
@ -226,7 +250,7 @@ void LimboAIEditor::_disable_editing() {
|
|||
usage_hint->show();
|
||||
}
|
||||
|
||||
void LimboAIEditor::edit_bt(Ref<BehaviorTree> p_behavior_tree, bool p_force_refresh) {
|
||||
void LimboAIEditor::edit_bt(const Ref<BehaviorTree> &p_behavior_tree, bool p_force_refresh) {
|
||||
ERR_FAIL_COND_MSG(p_behavior_tree.is_null(), "p_behavior_tree is null");
|
||||
|
||||
if (!p_force_refresh && task_tree->get_bt() == p_behavior_tree) {
|
||||
|
@ -327,8 +351,7 @@ void LimboAIEditor::_extract_subtree(const String &p_path) {
|
|||
Ref<BTTask> selected = task_tree->get_selected();
|
||||
ERR_FAIL_COND(selected.is_null());
|
||||
|
||||
EditorUndoRedoManager *undo_redo = GET_UNDO_REDO();
|
||||
undo_redo->create_action(TTR("Extract Subtree"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Extract Subtree"));
|
||||
|
||||
Ref<BehaviorTree> bt = memnew(BehaviorTree);
|
||||
bt->set_root_task(selected->clone());
|
||||
|
@ -348,12 +371,8 @@ void LimboAIEditor::_extract_subtree(const String &p_path) {
|
|||
undo_redo->add_undo_method(selected->get_parent().ptr(), LW_NAME(remove_child), subtree);
|
||||
undo_redo->add_undo_method(selected->get_parent().ptr(), LW_NAME(add_child_at_index), selected, idx);
|
||||
}
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
|
||||
undo_redo->commit_action();
|
||||
_commit_action_with_update(undo_redo);
|
||||
EDIT_RESOURCE(task_tree->get_selected());
|
||||
_mark_as_dirty(true);
|
||||
}
|
||||
|
||||
void LimboAIEditor::_process_shortcut_input(const Ref<InputEvent> &p_event) {
|
||||
|
@ -459,7 +478,6 @@ void LimboAIEditor::_on_tree_rmb(const Vector2 &p_menu_pos) {
|
|||
}
|
||||
|
||||
void LimboAIEditor::_action_selected(int p_id) {
|
||||
EditorUndoRedoManager *undo_redo = GET_UNDO_REDO();
|
||||
switch (p_id) {
|
||||
case ACTION_RENAME: {
|
||||
if (!task_tree->get_selected().is_valid()) {
|
||||
|
@ -537,15 +555,12 @@ void LimboAIEditor::_action_selected(int p_id) {
|
|||
Ref<BTTask> parent = sel->get_parent();
|
||||
int idx = sel->get_index();
|
||||
if (idx > 0 && idx < parent->get_child_count()) {
|
||||
undo_redo->create_action(TTR("Move BT Task"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Move BT Task"));
|
||||
undo_redo->add_do_method(parent.ptr(), LW_NAME(remove_child), sel);
|
||||
undo_redo->add_do_method(parent.ptr(), LW_NAME(add_child_at_index), sel, idx - 1);
|
||||
undo_redo->add_undo_method(parent.ptr(), LW_NAME(remove_child), sel);
|
||||
undo_redo->add_undo_method(parent.ptr(), LW_NAME(add_child_at_index), sel, idx);
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->commit_action();
|
||||
_mark_as_dirty(true);
|
||||
_commit_action_with_update(undo_redo);
|
||||
}
|
||||
}
|
||||
} break;
|
||||
|
@ -555,22 +570,19 @@ void LimboAIEditor::_action_selected(int p_id) {
|
|||
Ref<BTTask> parent = sel->get_parent();
|
||||
int idx = sel->get_index();
|
||||
if (idx >= 0 && idx < (parent->get_child_count() - 1)) {
|
||||
undo_redo->create_action(TTR("Move BT Task"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Move BT Task"));
|
||||
undo_redo->add_do_method(parent.ptr(), LW_NAME(remove_child), sel);
|
||||
undo_redo->add_do_method(parent.ptr(), LW_NAME(add_child_at_index), sel, idx + 1);
|
||||
undo_redo->add_undo_method(parent.ptr(), LW_NAME(remove_child), sel);
|
||||
undo_redo->add_undo_method(parent.ptr(), LW_NAME(add_child_at_index), sel, idx);
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->commit_action();
|
||||
_mark_as_dirty(true);
|
||||
_commit_action_with_update(undo_redo);
|
||||
}
|
||||
}
|
||||
} break;
|
||||
case ACTION_DUPLICATE: {
|
||||
Ref<BTTask> sel = task_tree->get_selected();
|
||||
if (sel.is_valid()) {
|
||||
undo_redo->create_action(TTR("Duplicate BT Task"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Duplicate BT Task"));
|
||||
Ref<BTTask> parent = sel->get_parent();
|
||||
if (parent.is_null()) {
|
||||
parent = sel;
|
||||
|
@ -578,10 +590,7 @@ void LimboAIEditor::_action_selected(int p_id) {
|
|||
const Ref<BTTask> &sel_dup = sel->clone();
|
||||
undo_redo->add_do_method(parent.ptr(), LW_NAME(add_child_at_index), sel_dup, sel->get_index() + 1);
|
||||
undo_redo->add_undo_method(parent.ptr(), LW_NAME(remove_child), sel_dup);
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->commit_action();
|
||||
_mark_as_dirty(true);
|
||||
_commit_action_with_update(undo_redo);
|
||||
}
|
||||
} break;
|
||||
case ACTION_MAKE_ROOT: {
|
||||
|
@ -589,7 +598,7 @@ void LimboAIEditor::_action_selected(int p_id) {
|
|||
if (sel.is_valid() && task_tree->get_bt()->get_root_task() != sel) {
|
||||
Ref<BTTask> parent = sel->get_parent();
|
||||
ERR_FAIL_COND(parent.is_null());
|
||||
undo_redo->create_action(TTR("Make Root"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Make Root"));
|
||||
undo_redo->add_do_method(parent.ptr(), LW_NAME(remove_child), sel);
|
||||
Ref<BTTask> old_root = task_tree->get_bt()->get_root_task();
|
||||
undo_redo->add_do_method(task_tree->get_bt().ptr(), LW_NAME(set_root_task), sel);
|
||||
|
@ -597,10 +606,7 @@ void LimboAIEditor::_action_selected(int p_id) {
|
|||
undo_redo->add_undo_method(sel.ptr(), LW_NAME(remove_child), old_root);
|
||||
undo_redo->add_undo_method(task_tree->get_bt().ptr(), LW_NAME(set_root_task), old_root);
|
||||
undo_redo->add_undo_method(parent.ptr(), LW_NAME(add_child_at_index), sel, sel->get_index());
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->commit_action();
|
||||
_mark_as_dirty(true);
|
||||
_commit_action_with_update(undo_redo);
|
||||
}
|
||||
} break;
|
||||
case ACTION_EXTRACT_SUBTREE: {
|
||||
|
@ -616,8 +622,7 @@ void LimboAIEditor::_action_selected(int p_id) {
|
|||
if (p_id == ACTION_CUT) {
|
||||
clipboard_task = sel->clone();
|
||||
}
|
||||
|
||||
undo_redo->create_action(TTR("Remove BT Task"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Remove BT Task"));
|
||||
if (sel->is_root()) {
|
||||
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());
|
||||
|
@ -625,11 +630,8 @@ void LimboAIEditor::_action_selected(int p_id) {
|
|||
undo_redo->add_do_method(sel->get_parent().ptr(), LW_NAME(remove_child), sel);
|
||||
undo_redo->add_undo_method(sel->get_parent().ptr(), LW_NAME(add_child_at_index), sel, sel->get_index());
|
||||
}
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->commit_action();
|
||||
_commit_action_with_update(undo_redo);
|
||||
EDIT_RESOURCE(task_tree->get_selected());
|
||||
_mark_as_dirty(true);
|
||||
}
|
||||
} break;
|
||||
}
|
||||
|
@ -848,8 +850,7 @@ void LimboAIEditor::_on_task_dragged(Ref<BTTask> p_task, Ref<BTTask> p_to_task,
|
|||
return;
|
||||
}
|
||||
|
||||
EditorUndoRedoManager *undo_redo = GET_UNDO_REDO();
|
||||
undo_redo->create_action(TTR("Drag BT Task"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Drag BT Task"));
|
||||
undo_redo->add_do_method(p_task->get_parent().ptr(), LW_NAME(remove_child), p_task);
|
||||
|
||||
if (p_type == 0) {
|
||||
|
@ -871,11 +872,7 @@ void LimboAIEditor::_on_task_dragged(Ref<BTTask> p_task, Ref<BTTask> p_to_task,
|
|||
|
||||
undo_redo->add_undo_method(p_task->get_parent().ptr(), "add_child_at_index", p_task, p_task->get_index());
|
||||
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
|
||||
undo_redo->commit_action();
|
||||
_mark_as_dirty(true);
|
||||
_commit_action_with_update(undo_redo);
|
||||
}
|
||||
|
||||
void LimboAIEditor::_on_resources_reload(const PackedStringArray &p_resources) {
|
||||
|
@ -943,14 +940,10 @@ void LimboAIEditor::_task_type_selected(const String &p_class_or_path) {
|
|||
Ref<BTTask> new_task = _create_task_by_class_or_path(p_class_or_path);
|
||||
ERR_FAIL_COND_MSG(new_task.is_null(), "LimboAI: Unable to construct task.");
|
||||
|
||||
EditorUndoRedoManager *undo_redo = GET_UNDO_REDO();
|
||||
undo_redo->create_action(TTR("Change BT task type"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Change BT task type"));
|
||||
undo_redo->add_do_method(this, LW_NAME(_replace_task), selected_task, new_task);
|
||||
undo_redo->add_undo_method(this, LW_NAME(_replace_task), new_task, selected_task);
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_tree));
|
||||
undo_redo->commit_action();
|
||||
_mark_as_dirty(true);
|
||||
_commit_action_with_update(undo_redo);
|
||||
}
|
||||
|
||||
void LimboAIEditor::_copy_version_info() {
|
||||
|
@ -1198,12 +1191,11 @@ void LimboAIEditor::_rename_task_confirmed() {
|
|||
ERR_FAIL_COND(!task_tree->get_selected().is_valid());
|
||||
rename_dialog->hide();
|
||||
|
||||
EditorUndoRedoManager *undo_redo = GET_UNDO_REDO();
|
||||
undo_redo->create_action(TTR("Set Custom Name"));
|
||||
EditorUndoRedoManager *undo_redo = _new_undo_redo_action(TTR("Set Custom Name"));
|
||||
undo_redo->add_do_method(task_tree->get_selected().ptr(), LW_NAME(set_custom_name), rename_edit->get_text());
|
||||
undo_redo->add_undo_method(task_tree->get_selected().ptr(), LW_NAME(set_custom_name), task_tree->get_selected()->get_custom_name());
|
||||
undo_redo->add_do_method(task_tree, LW_NAME(update_task), task_tree->get_selected());
|
||||
undo_redo->add_undo_method(task_tree, LW_NAME(update_task), task_tree->get_selected());
|
||||
undo_redo->add_do_method(this, LW_NAME(_update_task_tree), task_tree->get_bt(), task_tree->get_selected());
|
||||
undo_redo->add_undo_method(this, LW_NAME(_update_task_tree), task_tree->get_bt(), task_tree->get_selected());
|
||||
undo_redo->commit_action();
|
||||
}
|
||||
|
||||
|
@ -1227,7 +1219,7 @@ void LimboAIEditor::_update_favorite_tasks() {
|
|||
String task_meta = favorite_tasks[i];
|
||||
|
||||
if (task_meta.is_empty() || (!FILE_EXISTS(task_meta) && !ClassDB::class_exists(task_meta))) {
|
||||
call_deferred(LW_NAME(_update_banners));
|
||||
callable_mp(this, &LimboAIEditor::_update_banners).call_deferred();
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1451,6 +1443,7 @@ void LimboAIEditor::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("_new_bt"), &LimboAIEditor::_new_bt);
|
||||
ClassDB::bind_method(D_METHOD("_save_bt", "path"), &LimboAIEditor::_save_bt);
|
||||
ClassDB::bind_method(D_METHOD("_load_bt", "path"), &LimboAIEditor::_load_bt);
|
||||
ClassDB::bind_method(D_METHOD("_update_task_tree", "bt", "specific_task"), &LimboAIEditor::_update_task_tree, DEFVAL(Variant()));
|
||||
ClassDB::bind_method(D_METHOD("edit_bt", "behavior_tree", "force_refresh"), &LimboAIEditor::edit_bt, Variant(false));
|
||||
ClassDB::bind_method(D_METHOD("_reload_modified"), &LimboAIEditor::_reload_modified);
|
||||
ClassDB::bind_method(D_METHOD("_resave_modified"), &LimboAIEditor::_resave_modified);
|
||||
|
@ -1462,6 +1455,7 @@ void LimboAIEditor::_bind_methods() {
|
|||
LimboAIEditor::LimboAIEditor() {
|
||||
plugin = nullptr;
|
||||
idx_history = 0;
|
||||
dummy_history_context = memnew(Object);
|
||||
|
||||
EDITOR_DEF("limbo_ai/editor/prefer_online_documentation", false);
|
||||
|
||||
|
@ -1795,6 +1789,7 @@ LimboAIEditor::LimboAIEditor() {
|
|||
}
|
||||
|
||||
LimboAIEditor::~LimboAIEditor() {
|
||||
memdelete(dummy_history_context);
|
||||
}
|
||||
|
||||
//**** LimboAIEditor ^
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "core/object/object.h"
|
||||
#include "core/templates/hash_set.h"
|
||||
#include "editor/editor_node.h"
|
||||
#include "editor/editor_undo_redo_manager.h"
|
||||
#include "editor/gui/editor_spin_slider.h"
|
||||
#include "editor/plugins/editor_plugin.h"
|
||||
#include "scene/gui/box_container.h"
|
||||
|
@ -42,9 +43,6 @@
|
|||
#include "scene/gui/split_container.h"
|
||||
#include "scene/gui/tree.h"
|
||||
#include "scene/resources/texture.h"
|
||||
|
||||
#define GET_UNDO_REDO() EditorUndoRedoManager::get_singleton()
|
||||
|
||||
#endif // LIMBOAI_MODULE
|
||||
|
||||
#ifdef LIMBOAI_GDEXTENSION
|
||||
|
@ -52,6 +50,7 @@
|
|||
#include <godot_cpp/classes/control.hpp>
|
||||
#include <godot_cpp/classes/editor_plugin.hpp>
|
||||
#include <godot_cpp/classes/editor_spin_slider.hpp>
|
||||
#include <godot_cpp/classes/editor_undo_redo_manager.hpp>
|
||||
#include <godot_cpp/classes/file_dialog.hpp>
|
||||
#include <godot_cpp/classes/h_box_container.hpp>
|
||||
#include <godot_cpp/classes/h_split_container.hpp>
|
||||
|
@ -67,8 +66,6 @@
|
|||
|
||||
using namespace godot;
|
||||
|
||||
#define GET_UNDO_REDO() plugin->get_undo_redo()
|
||||
|
||||
#endif // LIMBOAI_GDEXTENSION
|
||||
|
||||
class LimboAIEditor : public Control {
|
||||
|
@ -189,6 +186,11 @@ private:
|
|||
|
||||
AcceptDialog *info_dialog;
|
||||
|
||||
// ! HACK: Force global history to be used for resources without a set path.
|
||||
Object *dummy_history_context = nullptr;
|
||||
EditorUndoRedoManager *_new_undo_redo_action(const String &p_name = "", UndoRedo::MergeMode p_mode = UndoRedo::MERGE_DISABLE);
|
||||
void _commit_action_with_update(EditorUndoRedoManager *p_undo_redo);
|
||||
|
||||
void _add_task(const Ref<BTTask> &p_task, bool p_as_sibling);
|
||||
void _add_task_with_prototype(const Ref<BTTask> &p_prototype);
|
||||
Ref<BTTask> _create_task_by_class_or_path(const String &p_class_or_path) const;
|
||||
|
@ -200,6 +202,7 @@ private:
|
|||
void _new_bt();
|
||||
void _save_bt(String p_path);
|
||||
void _load_bt(String p_path);
|
||||
void _update_task_tree(const Ref<BehaviorTree> &p_bt, const Ref<BTTask> &p_specific_task = nullptr);
|
||||
void _disable_editing();
|
||||
void _mark_as_dirty(bool p_dirty);
|
||||
void _create_user_task_dir();
|
||||
|
@ -258,7 +261,7 @@ protected:
|
|||
|
||||
public:
|
||||
void set_plugin(EditorPlugin *p_plugin) { plugin = p_plugin; };
|
||||
void edit_bt(Ref<BehaviorTree> p_behavior_tree, bool p_force_refresh = false);
|
||||
void edit_bt(const Ref<BehaviorTree> &p_behavior_tree, bool p_force_refresh = false);
|
||||
Ref<BlackboardPlan> get_edited_blackboard_plan();
|
||||
|
||||
void apply_changes();
|
||||
|
|
|
@ -420,7 +420,7 @@ void TaskPalette::_category_item_toggled(bool p_pressed, const String &p_categor
|
|||
}
|
||||
|
||||
void TaskPalette::_filter_data_changed() {
|
||||
call_deferred(LW_NAME(refresh));
|
||||
callable_mp(this, &TaskPalette::refresh).call_deferred();
|
||||
_update_filter_button();
|
||||
}
|
||||
|
||||
|
|
|
@ -60,7 +60,7 @@ void LimboHSM::change_active_state(LimboState *p_state) {
|
|||
active_state->_enter();
|
||||
active_state->set_process_input(true);
|
||||
|
||||
emit_signal(LimboStringNames::get_singleton()->active_state_changed, active_state, previous_active);
|
||||
emit_signal(LW_NAME(active_state_changed), active_state, previous_active);
|
||||
}
|
||||
|
||||
void LimboHSM::_enter() {
|
||||
|
|
|
@ -63,7 +63,7 @@ LimboState *LimboState::named(const String &p_name) {
|
|||
void LimboState::_enter() {
|
||||
active = true;
|
||||
GDVIRTUAL_CALL(_enter);
|
||||
emit_signal(LimboStringNames::get_singleton()->entered);
|
||||
emit_signal(LW_NAME(entered));
|
||||
}
|
||||
|
||||
void LimboState::_exit() {
|
||||
|
@ -71,18 +71,18 @@ void LimboState::_exit() {
|
|||
return;
|
||||
}
|
||||
GDVIRTUAL_CALL(_exit);
|
||||
emit_signal(LimboStringNames::get_singleton()->exited);
|
||||
emit_signal(LW_NAME(exited));
|
||||
active = false;
|
||||
}
|
||||
|
||||
void LimboState::_update(double p_delta) {
|
||||
GDVIRTUAL_CALL(_update, p_delta);
|
||||
emit_signal(LimboStringNames::get_singleton()->updated, p_delta);
|
||||
emit_signal(LW_NAME(updated), p_delta);
|
||||
}
|
||||
|
||||
void LimboState::_setup() {
|
||||
GDVIRTUAL_CALL(_setup);
|
||||
emit_signal(LimboStringNames::get_singleton()->setup);
|
||||
emit_signal(LW_NAME(setup));
|
||||
}
|
||||
|
||||
void LimboState::_initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard) {
|
||||
|
@ -154,19 +154,19 @@ bool LimboState::dispatch(const StringName &p_event, const Variant &p_cargo) {
|
|||
|
||||
LimboState *LimboState::call_on_enter(const Callable &p_callable) {
|
||||
ERR_FAIL_COND_V(!p_callable.is_valid(), this);
|
||||
connect(LimboStringNames::get_singleton()->entered, p_callable);
|
||||
connect(LW_NAME(entered), p_callable);
|
||||
return this;
|
||||
}
|
||||
|
||||
LimboState *LimboState::call_on_exit(const Callable &p_callable) {
|
||||
ERR_FAIL_COND_V(!p_callable.is_valid(), this);
|
||||
connect(LimboStringNames::get_singleton()->exited, p_callable);
|
||||
connect(LW_NAME(exited), p_callable);
|
||||
return this;
|
||||
}
|
||||
|
||||
LimboState *LimboState::call_on_update(const Callable &p_callable) {
|
||||
ERR_FAIL_COND_V(!p_callable.is_valid(), this);
|
||||
connect(LimboStringNames::get_singleton()->updated, p_callable);
|
||||
connect(LW_NAME(updated), p_callable);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,15 +27,9 @@
|
|||
LimboStringNames *LimboStringNames::singleton = nullptr;
|
||||
|
||||
LimboStringNames::LimboStringNames() {
|
||||
_enter = SN("_enter");
|
||||
_exit = SN("_exit");
|
||||
_generate_name = SN("_generate_name");
|
||||
_get_configuration_warnings = SN("_get_configuration_warnings");
|
||||
_replace_task = SN("_replace_task");
|
||||
_setup = SN("_setup");
|
||||
_tick = SN("_tick");
|
||||
_update = SN("_update");
|
||||
_update_banners = SN("_update_banners");
|
||||
_update_task_tree = SN("_update_task_tree");
|
||||
_weight_ = SN("_weight_");
|
||||
accent_color = SN("accent_color");
|
||||
ActionCopy = SN("ActionCopy");
|
||||
|
@ -46,19 +40,12 @@ LimboStringNames::LimboStringNames() {
|
|||
add_child = SN("add_child");
|
||||
add_child_at_index = SN("add_child_at_index");
|
||||
AnimationFilter = SN("AnimationFilter");
|
||||
Back = SN("Back");
|
||||
behavior_tree = SN("behavior_tree");
|
||||
behavior_tree_finished = SN("behavior_tree_finished");
|
||||
BehaviorTree = SN("BehaviorTree");
|
||||
bold = SN("bold");
|
||||
BTAlwaysFail = SN("BTAlwaysFail");
|
||||
BTAlwaysSucceed = SN("BTAlwaysSucceed");
|
||||
button_down = SN("button_down");
|
||||
button_up = SN("button_up");
|
||||
call_deferred = SN("call_deferred");
|
||||
changed = SN("changed");
|
||||
connect = SN("connect");
|
||||
dark_color_1 = SN("dark_color_1");
|
||||
dark_color_2 = SN("dark_color_2");
|
||||
Debug = SN("Debug");
|
||||
disabled_font_color = SN("disabled_font_color");
|
||||
|
@ -71,7 +58,6 @@ LimboStringNames::LimboStringNames() {
|
|||
EditorFonts = SN("EditorFonts");
|
||||
EditorIcons = SN("EditorIcons");
|
||||
EditorStyles = SN("EditorStyles");
|
||||
emit_changed = SN("emit_changed");
|
||||
entered = SN("entered");
|
||||
error_value = SN("error_value");
|
||||
EVENT_FAILURE = SN("failure");
|
||||
|
@ -84,7 +70,6 @@ LimboStringNames::LimboStringNames() {
|
|||
font = SN("font");
|
||||
font_color = SN("font_color");
|
||||
font_size = SN("font_size");
|
||||
Forward = SN("Forward");
|
||||
freed = SN("freed");
|
||||
gui_input = SN("gui_input");
|
||||
GuiOptionArrow = SN("GuiOptionArrow");
|
||||
|
@ -97,10 +82,6 @@ LimboStringNames::LimboStringNames() {
|
|||
Info = SN("Info");
|
||||
item_collapsed = SN("item_collapsed");
|
||||
item_selected = SN("item_selected");
|
||||
LimboDeselectAll = SN("LimboDeselectAll");
|
||||
LimboExtraClock = SN("LimboExtraClock");
|
||||
LimboPercent = SN("LimboPercent");
|
||||
LimboSelectAll = SN("LimboSelectAll");
|
||||
LimboVarAdd = SN("LimboVarAdd");
|
||||
LimboVarEmpty = SN("LimboVarEmpty");
|
||||
LimboVarError = SN("LimboVarError");
|
||||
|
@ -125,7 +106,6 @@ LimboStringNames::LimboStringNames() {
|
|||
popup_hide = SN("popup_hide");
|
||||
pressed = SN("pressed");
|
||||
probability_clicked = SN("probability_clicked");
|
||||
refresh = SN("refresh");
|
||||
Reload = SN("Reload");
|
||||
Remove = SN("Remove");
|
||||
remove_child = SN("remove_child");
|
||||
|
@ -158,8 +138,6 @@ LimboStringNames::LimboStringNames() {
|
|||
Tree = SN("Tree");
|
||||
TripleBar = SN("TripleBar");
|
||||
update_mode = SN("update_mode");
|
||||
update_task = SN("update_task");
|
||||
update_tree = SN("update_tree");
|
||||
updated = SN("updated");
|
||||
visibility_changed = SN("visibility_changed");
|
||||
window_visibility_changed = SN("window_visibility_changed");
|
||||
|
|
|
@ -43,15 +43,9 @@ class LimboStringNames {
|
|||
public:
|
||||
_FORCE_INLINE_ static LimboStringNames *get_singleton() { return singleton; }
|
||||
|
||||
StringName _enter;
|
||||
StringName _exit;
|
||||
StringName _generate_name;
|
||||
StringName _get_configuration_warnings;
|
||||
StringName _replace_task;
|
||||
StringName _setup;
|
||||
StringName _tick;
|
||||
StringName _update_banners;
|
||||
StringName _update;
|
||||
StringName _update_task_tree;
|
||||
StringName _weight_;
|
||||
StringName accent_color;
|
||||
StringName ActionCopy;
|
||||
|
@ -62,19 +56,12 @@ public:
|
|||
StringName add_child;
|
||||
StringName Add;
|
||||
StringName AnimationFilter;
|
||||
StringName Back;
|
||||
StringName behavior_tree_finished;
|
||||
StringName behavior_tree;
|
||||
StringName BehaviorTree;
|
||||
StringName bold;
|
||||
StringName BTAlwaysFail;
|
||||
StringName BTAlwaysSucceed;
|
||||
StringName button_down;
|
||||
StringName button_up;
|
||||
StringName call_deferred;
|
||||
StringName changed;
|
||||
StringName connect;
|
||||
StringName dark_color_1;
|
||||
StringName dark_color_2;
|
||||
StringName Debug;
|
||||
StringName disabled_font_color;
|
||||
|
@ -87,7 +74,6 @@ public:
|
|||
StringName EditorFonts;
|
||||
StringName EditorIcons;
|
||||
StringName EditorStyles;
|
||||
StringName emit_changed;
|
||||
StringName entered;
|
||||
StringName error_value;
|
||||
StringName EVENT_FAILURE;
|
||||
|
@ -100,7 +86,6 @@ public:
|
|||
StringName font_color;
|
||||
StringName font_size;
|
||||
StringName font;
|
||||
StringName Forward;
|
||||
StringName freed;
|
||||
StringName gui_input;
|
||||
StringName GuiOptionArrow;
|
||||
|
@ -113,11 +98,6 @@ public:
|
|||
StringName Info;
|
||||
StringName item_collapsed;
|
||||
StringName item_selected;
|
||||
StringName LimboDeselectAll;
|
||||
StringName LimboExtraClock;
|
||||
StringName LimboExtractSubtree;
|
||||
StringName LimboPercent;
|
||||
StringName LimboSelectAll;
|
||||
StringName LimboVarAdd;
|
||||
StringName LimboVarEmpty;
|
||||
StringName LimboVarError;
|
||||
|
@ -142,7 +122,6 @@ public:
|
|||
StringName popup_hide;
|
||||
StringName pressed;
|
||||
StringName probability_clicked;
|
||||
StringName refresh;
|
||||
StringName Reload;
|
||||
StringName remove_child;
|
||||
StringName Remove;
|
||||
|
@ -175,8 +154,6 @@ public:
|
|||
StringName Tree;
|
||||
StringName TripleBar;
|
||||
StringName update_mode;
|
||||
StringName update_task;
|
||||
StringName update_tree;
|
||||
StringName updated;
|
||||
StringName visibility_changed;
|
||||
StringName window_visibility_changed;
|
||||
|
|
Loading…
Reference in New Issue