Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to load multiple animation/libraries at once in the animation manager #83503

Merged
merged 1 commit into from
Jan 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
214 changes: 127 additions & 87 deletions editor/plugins/animation_library_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ void AnimationLibraryEditor::_load_library() {
file_dialog->add_filter("*." + K);
}

file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILES);
file_dialog->set_current_file("");
file_dialog->popup_centered_ratio();

Expand Down Expand Up @@ -299,85 +299,9 @@ void AnimationLibraryEditor::_file_popup_selected(int p_id) {
} break;
}
}

void AnimationLibraryEditor::_load_file(String p_path) {
switch (file_dialog_action) {
case FILE_DIALOG_ACTION_OPEN_LIBRARY: {
Ref<AnimationLibrary> al = ResourceLoader::load(p_path);
if (al.is_null()) {
error_dialog->set_text(TTR("Invalid AnimationLibrary file."));
error_dialog->popup_centered();
return;
}

List<StringName> libs;
mixer->get_animation_library_list(&libs);
for (const StringName &K : libs) {
Ref<AnimationLibrary> al2 = mixer->get_animation_library(K);
if (al2 == al) {
error_dialog->set_text(TTR("This library is already added to the mixer."));
error_dialog->popup_centered();

return;
}
}

String name = AnimationLibrary::validate_library_name(p_path.get_file().get_basename());

int attempt = 1;

while (bool(mixer->has_animation_library(name))) {
attempt++;
name = p_path.get_file().get_basename() + " " + itos(attempt);
}

EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();

undo_redo->create_action(vformat(TTR("Add Animation Library: %s"), name));
undo_redo->add_do_method(mixer, "add_animation_library", name, al);
undo_redo->add_undo_method(mixer, "remove_animation_library", name);
undo_redo->add_do_method(this, "_update_editor", mixer);
undo_redo->add_undo_method(this, "_update_editor", mixer);
undo_redo->commit_action();
} break;
case FILE_DIALOG_ACTION_OPEN_ANIMATION: {
Ref<Animation> anim = ResourceLoader::load(p_path);
if (anim.is_null()) {
error_dialog->set_text(TTR("Invalid Animation file."));
error_dialog->popup_centered();
return;
}

Ref<AnimationLibrary> al = mixer->get_animation_library(adding_animation_to_library);
List<StringName> anims;
al->get_animation_list(&anims);
for (const StringName &K : anims) {
Ref<Animation> a2 = al->get_animation(K);
if (a2 == anim) {
error_dialog->set_text(TTR("This animation is already added to the library."));
error_dialog->popup_centered();
return;
}
}

String name = p_path.get_file().get_basename();

int attempt = 1;

while (al->has_animation(name)) {
attempt++;
name = p_path.get_file().get_basename() + " " + itos(attempt);
}

EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();

undo_redo->create_action(vformat(TTR("Load Animation into Library: %s"), name));
undo_redo->add_do_method(al.ptr(), "add_animation", name, anim);
undo_redo->add_undo_method(al.ptr(), "remove_animation", name);
undo_redo->add_do_method(this, "_update_editor", mixer);
undo_redo->add_undo_method(this, "_update_editor", mixer);
undo_redo->commit_action();
} break;

case FILE_DIALOG_ACTION_SAVE_LIBRARY: {
Ref<AnimationLibrary> al = mixer->get_animation_library(file_dialog_library);
String prev_path = al->get_path();
Expand Down Expand Up @@ -415,6 +339,121 @@ void AnimationLibraryEditor::_load_file(String p_path) {
undo_redo->commit_action();
}
} break;
default: {
}
}
}

void AnimationLibraryEditor::_load_files(const PackedStringArray &p_paths) {
EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton();
bool has_created_action = false;
bool show_error_diag = false;
List<String> name_list;

switch (file_dialog_action) {
case FILE_DIALOG_ACTION_OPEN_LIBRARY: {
for (const String &path : p_paths) {
Ref<AnimationLibrary> al = ResourceLoader::load(path);
if (al.is_null()) {
show_error_diag = true;
error_dialog->set_text(TTR("Some AnimationLibrary files were invalid."));
continue;
}

List<StringName> libs;
mixer->get_animation_library_list(&libs);
bool is_already_added = false;
for (const StringName &K : libs) {
if (mixer->get_animation_library(K) == al) {
// Prioritize the "invalid" error message.
if (!show_error_diag) {
show_error_diag = true;
error_dialog->set_text(TTR("Some of the selected libraries were already added to the mixer."));
}

is_already_added = true;
break;
}
}

if (is_already_added) {
continue;
}

String name = AnimationLibrary::validate_library_name(path.get_file().get_basename());
int attempt = 1;
while (bool(mixer->has_animation_library(name)) || name_list.find(name)) {
attempt++;
name = path.get_file().get_basename() + " " + itos(attempt);
}
name_list.push_back(name);

if (!has_created_action) {
has_created_action = true;
undo_redo->create_action(p_paths.size() > 1 ? TTR("Add Animation Libraries") : vformat(TTR("Add Animation Library: %s"), name));
}
undo_redo->add_do_method(mixer, "add_animation_library", name, al);
undo_redo->add_undo_method(mixer, "remove_animation_library", name);
}
} break;
case FILE_DIALOG_ACTION_OPEN_ANIMATION: {
Ref<AnimationLibrary> al = mixer->get_animation_library(adding_animation_to_library);
for (const String &path : p_paths) {
Ref<Animation> anim = ResourceLoader::load(path);
if (anim.is_null()) {
show_error_diag = true;
error_dialog->set_text(TTR("Some Animation files were invalid."));
continue;
}

List<StringName> anims;
al->get_animation_list(&anims);
bool is_already_added = false;
for (const StringName &K : anims) {
if (al->get_animation(K) == anim) {
// Prioritize the "invalid" error message.
if (!show_error_diag) {
show_error_diag = true;
error_dialog->set_text(TTR("Some of the selected animations were already added to the library."));
}

is_already_added = true;
break;
}
}

if (is_already_added) {
continue;
}

String name = path.get_file().get_basename();
int attempt = 1;
while (al->has_animation(name) || name_list.find(name)) {
attempt++;
name = path.get_file().get_basename() + " " + itos(attempt);
}
name_list.push_back(name);

if (!has_created_action) {
has_created_action = true;
undo_redo->create_action(p_paths.size() > 1 ? TTR("Load Animations into Library") : vformat(TTR("Load Animation into Library: %s"), name));
}
undo_redo->add_do_method(al.ptr(), "add_animation", name, anim);
undo_redo->add_undo_method(al.ptr(), "remove_animation", name);
}
} break;
default: {
}
}

if (has_created_action) {
undo_redo->add_do_method(this, "_update_editor", mixer);
undo_redo->add_undo_method(this, "_update_editor", mixer);
undo_redo->commit_action();
}

if (show_error_diag) {
error_dialog->popup_centered();
}
}

Expand Down Expand Up @@ -506,7 +545,7 @@ void AnimationLibraryEditor::_button_pressed(TreeItem *p_item, int p_column, int
}

file_dialog->set_title(TTR("Load Animation"));
file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE);
file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILES);
file_dialog->set_current_file("");
file_dialog->popup_centered_ratio();

Expand Down Expand Up @@ -673,12 +712,12 @@ void AnimationLibraryEditor::update_tree() {
libitem->set_metadata(0, K);
libitem->set_icon(0, get_editor_theme_icon("AnimationLibrary"));

libitem->add_button(0, get_editor_theme_icon("Add"), LIB_BUTTON_ADD, animation_library_is_foreign, TTR("Add Animation to Library"));
libitem->add_button(0, get_editor_theme_icon("Load"), LIB_BUTTON_LOAD, animation_library_is_foreign, TTR("Load animation from file and add to library"));
libitem->add_button(0, get_editor_theme_icon("ActionPaste"), LIB_BUTTON_PASTE, animation_library_is_foreign, TTR("Paste Animation to Library from clipboard"));
libitem->add_button(0, get_editor_theme_icon("Add"), LIB_BUTTON_ADD, animation_library_is_foreign, TTR("Add animation to library."));
libitem->add_button(0, get_editor_theme_icon("Load"), LIB_BUTTON_LOAD, animation_library_is_foreign, TTR("Load animation from file and add to library."));
libitem->add_button(0, get_editor_theme_icon("ActionPaste"), LIB_BUTTON_PASTE, animation_library_is_foreign, TTR("Paste animation to library from clipboard."));

libitem->add_button(1, get_editor_theme_icon("Save"), LIB_BUTTON_FILE, false, TTR("Save animation library to resource on disk"));
libitem->add_button(1, get_editor_theme_icon("Remove"), LIB_BUTTON_DELETE, false, TTR("Remove animation library"));
libitem->add_button(1, get_editor_theme_icon("Save"), LIB_BUTTON_FILE, false, TTR("Save animation library to resource on disk."));
libitem->add_button(1, get_editor_theme_icon("Remove"), LIB_BUTTON_DELETE, false, TTR("Remove animation library."));
YeldhamDev marked this conversation as resolved.
Show resolved Hide resolved

libitem->set_custom_bg_color(0, ss_color);

Expand All @@ -690,7 +729,7 @@ void AnimationLibraryEditor::update_tree() {
anitem->set_editable(0, !animation_library_is_foreign);
anitem->set_metadata(0, L);
anitem->set_icon(0, get_editor_theme_icon("Animation"));
anitem->add_button(0, get_editor_theme_icon("ActionCopy"), ANIM_BUTTON_COPY, animation_library_is_foreign, TTR("Copy animation to clipboard"));
anitem->add_button(0, get_editor_theme_icon("ActionCopy"), ANIM_BUTTON_COPY, animation_library_is_foreign, TTR("Copy animation to clipboard."));

Ref<Animation> anim = al->get_animation(L);
String anim_path = anim->get_path();
Expand All @@ -717,8 +756,8 @@ void AnimationLibraryEditor::update_tree() {
anitem->set_text(1, anim_path.get_file());
}
}
anitem->add_button(1, get_editor_theme_icon("Save"), ANIM_BUTTON_FILE, animation_library_is_foreign, TTR("Save animation to resource on disk"));
anitem->add_button(1, get_editor_theme_icon("Remove"), ANIM_BUTTON_DELETE, animation_library_is_foreign, TTR("Remove animation from Library"));
anitem->add_button(1, get_editor_theme_icon("Save"), ANIM_BUTTON_FILE, animation_library_is_foreign, TTR("Save animation to resource on disk."));
anitem->add_button(1, get_editor_theme_icon("Remove"), ANIM_BUTTON_DELETE, animation_library_is_foreign, TTR("Remove animation from Library."));
}
}
}
Expand All @@ -743,6 +782,7 @@ AnimationLibraryEditor::AnimationLibraryEditor() {
file_dialog = memnew(EditorFileDialog);
add_child(file_dialog);
file_dialog->connect("file_selected", callable_mp(this, &AnimationLibraryEditor::_load_file));
file_dialog->connect("files_selected", callable_mp(this, &AnimationLibraryEditor::_load_files));

add_library_dialog = memnew(ConfirmationDialog);
VBoxContainer *dialog_vb = memnew(VBoxContainer);
Expand Down
1 change: 1 addition & 0 deletions editor/plugins/animation_library_editor.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ class AnimationLibraryEditor : public AcceptDialog {
void _add_library_confirm();
void _load_library();
void _load_file(String p_path);
void _load_files(const PackedStringArray &p_paths);

void _item_renamed();
void _button_pressed(TreeItem *p_item, int p_column, int p_id, MouseButton p_button);
Expand Down
Loading