diff options
Diffstat (limited to 'editor/plugins/tiles/tile_set_editor.cpp')
-rw-r--r-- | editor/plugins/tiles/tile_set_editor.cpp | 158 |
1 files changed, 127 insertions, 31 deletions
diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp index 23076266ee..eb79394cc9 100644 --- a/editor/plugins/tiles/tile_set_editor.cpp +++ b/editor/plugins/tiles/tile_set_editor.cpp @@ -38,6 +38,7 @@ #include "editor/editor_scale.h" #include "editor/editor_settings.h" #include "editor/editor_undo_redo_manager.h" +#include "editor/gui/editor_file_dialog.h" #include "scene/gui/box_container.h" #include "scene/gui/control.h" @@ -148,7 +149,7 @@ void TileSetEditor::_update_sources_list(int force_selected_id) { sources_list->clear(); // Update the atlas sources. - List<int> source_ids = TilesEditorPlugin::get_singleton()->get_sorted_sources(tile_set); + List<int> source_ids = TilesEditorUtils::get_singleton()->get_sorted_sources(tile_set); for (const int &source_id : source_ids) { TileSetSource *source = *tile_set->get_source(source_id); @@ -220,7 +221,31 @@ void TileSetEditor::_update_sources_list(int force_selected_id) { _source_selected(sources_list->get_current()); // Synchronize the lists. - TilesEditorPlugin::get_singleton()->set_sources_lists_current(sources_list->get_current()); + TilesEditorUtils::get_singleton()->set_sources_lists_current(sources_list->get_current()); +} + +void TileSetEditor::_texture_file_selected(const String &p_path) { + Ref<Texture2D> texture = ResourceLoader::load(p_path); + if (texture.is_null()) { + EditorNode::get_singleton()->show_warning(TTR("Invalid texture selected.")); + return; + } + + int source_id = tile_set->get_next_source_id(); + + Ref<TileSetAtlasSource> atlas_source = memnew(TileSetAtlasSource); + atlas_source->set_texture(texture); + + // Add a new source. + EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); + undo_redo->create_action(TTR("Add atlas source")); + undo_redo->add_do_method(*tile_set, "add_source", atlas_source, source_id); + undo_redo->add_do_method(*atlas_source, "set_texture_region_size", tile_set->get_tile_size()); + undo_redo->add_undo_method(*tile_set, "remove_source", source_id); + undo_redo->commit_action(); + + _update_sources_list(source_id); + tile_set_atlas_source_editor->init_source(); } void TileSetEditor::_source_selected(int p_source_index) { @@ -278,19 +303,19 @@ void TileSetEditor::_source_add_id_pressed(int p_id_pressed) { switch (p_id_pressed) { case 0: { - int source_id = tile_set->get_next_source_id(); - - Ref<TileSetAtlasSource> atlas_source = memnew(TileSetAtlasSource); - - // Add a new source. - EditorUndoRedoManager *undo_redo = EditorUndoRedoManager::get_singleton(); - undo_redo->create_action(TTR("Add atlas source")); - undo_redo->add_do_method(*tile_set, "add_source", atlas_source, source_id); - undo_redo->add_do_method(*atlas_source, "set_texture_region_size", tile_set->get_tile_size()); - undo_redo->add_undo_method(*tile_set, "remove_source", source_id); - undo_redo->commit_action(); - - _update_sources_list(source_id); + if (!texture_file_dialog) { + texture_file_dialog = memnew(EditorFileDialog); + add_child(texture_file_dialog); + texture_file_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); + texture_file_dialog->connect("file_selected", callable_mp(this, &TileSetEditor::_texture_file_selected)); + + List<String> extensions; + ResourceLoader::get_recognized_extensions_for_type("Texture2D", &extensions); + for (const String &E : extensions) { + texture_file_dialog->add_filter("*." + E, E.to_upper()); + } + } + texture_file_dialog->popup_file_dialog(); } break; case 1: { int source_id = tile_set->get_next_source_id(); @@ -327,8 +352,8 @@ void TileSetEditor::_sources_advanced_menu_id_pressed(int p_id_pressed) { } void TileSetEditor::_set_source_sort(int p_sort) { - TilesEditorPlugin::get_singleton()->set_sorting_option(p_sort); - for (int i = 0; i != TilesEditorPlugin::SOURCE_SORT_MAX; i++) { + TilesEditorUtils::get_singleton()->set_sorting_option(p_sort); + for (int i = 0; i != TilesEditorUtils::SOURCE_SORT_MAX; i++) { source_sort_button->get_popup()->set_item_checked(i, (i == (int)p_sort)); } @@ -345,13 +370,13 @@ void TileSetEditor::_set_source_sort(int p_sort) { void TileSetEditor::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { sources_delete_button->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); sources_add_button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); source_sort_button->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); sources_advanced_menu_button->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); missing_texture_texture = get_theme_icon(SNAME("TileSet"), SNAME("EditorIcons")); + expanded_area->add_theme_style_override("panel", get_theme_stylebox("panel", "Tree")); _update_sources_list(); } break; @@ -376,6 +401,12 @@ void TileSetEditor::_notification(int p_what) { tile_set_changed_needs_update = false; } } break; + + case NOTIFICATION_VISIBILITY_CHANGED: { + if (!is_visible_in_tree()) { + remove_expanded_editor(); + } + } break; } } @@ -419,7 +450,7 @@ void TileSetEditor::_update_patterns_list() { int id = patterns_item_list->add_item(""); patterns_item_list->set_item_metadata(id, tile_set->get_pattern(i)); patterns_item_list->set_item_tooltip(id, vformat(TTR("Index: %d"), i)); - TilesEditorPlugin::get_singleton()->queue_pattern_preview(tile_set, tile_set->get_pattern(i), callable_mp(this, &TileSetEditor::_pattern_preview_done)); + TilesEditorUtils::get_singleton()->queue_pattern_preview(tile_set, tile_set->get_pattern(i), callable_mp(this, &TileSetEditor::_pattern_preview_done)); } // Update the label visibility. @@ -698,7 +729,7 @@ void TileSetEditor::edit(Ref<TileSet> p_tile_set) { // Remove listener. if (tile_set.is_valid()) { - tile_set->disconnect("changed", callable_mp(this, &TileSetEditor::_tile_set_changed)); + tile_set->disconnect_changed(callable_mp(this, &TileSetEditor::_tile_set_changed)); } // Change the edited object. @@ -713,7 +744,7 @@ void TileSetEditor::edit(Ref<TileSet> p_tile_set) { sources_advanced_menu_button->set_disabled(read_only); source_sort_button->set_disabled(read_only); - tile_set->connect("changed", callable_mp(this, &TileSetEditor::_tile_set_changed)); + tile_set->connect_changed(callable_mp(this, &TileSetEditor::_tile_set_changed)); if (first_edit) { first_edit = false; _set_source_sort(EditorSettings::get_singleton()->get_project_metadata("editor_metadata", "tile_source_sort", 0)); @@ -724,11 +755,70 @@ void TileSetEditor::edit(Ref<TileSet> p_tile_set) { } } +void TileSetEditor::add_expanded_editor(Control *p_editor) { + expanded_editor = p_editor; + expanded_editor_parent = p_editor->get_parent()->get_instance_id(); + + // Find the scrollable control this node belongs to. + Node *check_parent = expanded_editor->get_parent(); + Control *parent_container = nullptr; + while (check_parent) { + parent_container = Object::cast_to<EditorInspector>(check_parent); + if (parent_container) { + break; + } + parent_container = Object::cast_to<ScrollContainer>(check_parent); + if (parent_container) { + break; + } + check_parent = check_parent->get_parent(); + } + ERR_FAIL_NULL(parent_container); + + expanded_editor->set_meta("reparented", true); + expanded_editor->reparent(expanded_area); + expanded_area->show(); + expanded_area->set_size(Vector2(parent_container->get_global_rect().get_end().x - expanded_area->get_global_position().x, expanded_area->get_size().y)); + + for (SplitContainer *split : disable_on_expand) { + split->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN); + } +} + +void TileSetEditor::remove_expanded_editor() { + if (!expanded_editor) { + return; + } + + Node *original_parent = Object::cast_to<Node>(ObjectDB::get_instance(expanded_editor_parent)); + if (original_parent) { + expanded_editor->remove_meta("reparented"); + expanded_editor->reparent(original_parent); + } else { + expanded_editor->queue_free(); + } + expanded_editor = nullptr; + expanded_editor_parent = ObjectID(); + expanded_area->hide(); + + for (SplitContainer *split : disable_on_expand) { + split->set_dragger_visibility(SplitContainer::DRAGGER_VISIBLE); + } +} + +void TileSetEditor::register_split(SplitContainer *p_split) { + disable_on_expand.push_back(p_split); +} + TileSetEditor::TileSetEditor() { singleton = this; set_process_internal(true); + VBoxContainer *main_vb = memnew(VBoxContainer); + add_child(main_vb); + main_vb->set_anchors_and_offsets_preset(PRESET_FULL_RECT); + // TabBar. tabs_bar = memnew(TabBar); tabs_bar->set_tab_alignment(TabBar::ALIGNMENT_CENTER); @@ -740,7 +830,7 @@ TileSetEditor::TileSetEditor() { tile_set_toolbar = memnew(HBoxContainer); tile_set_toolbar->set_h_size_flags(SIZE_EXPAND_FILL); tile_set_toolbar->add_child(tabs_bar); - add_child(tile_set_toolbar); + main_vb->add_child(tile_set_toolbar); //// Tiles //// // Split container. @@ -748,7 +838,7 @@ TileSetEditor::TileSetEditor() { split_container->set_name(TTR("Tiles")); split_container->set_h_size_flags(SIZE_EXPAND_FILL); split_container->set_v_size_flags(SIZE_EXPAND_FILL); - add_child(split_container); + main_vb->add_child(split_container); // Sources list. VBoxContainer *split_container_left_side = memnew(VBoxContainer); @@ -764,19 +854,19 @@ TileSetEditor::TileSetEditor() { PopupMenu *p = source_sort_button->get_popup(); p->connect("id_pressed", callable_mp(this, &TileSetEditor::_set_source_sort)); - p->add_radio_check_item(TTR("Sort by ID (Ascending)"), TilesEditorPlugin::SOURCE_SORT_ID); - p->add_radio_check_item(TTR("Sort by ID (Descending)"), TilesEditorPlugin::SOURCE_SORT_ID_REVERSE); - p->add_radio_check_item(TTR("Sort by Name (Ascending)"), TilesEditorPlugin::SOURCE_SORT_NAME); - p->add_radio_check_item(TTR("Sort by Name (Descending)"), TilesEditorPlugin::SOURCE_SORT_NAME_REVERSE); - p->set_item_checked(TilesEditorPlugin::SOURCE_SORT_ID, true); + p->add_radio_check_item(TTR("Sort by ID (Ascending)"), TilesEditorUtils::SOURCE_SORT_ID); + p->add_radio_check_item(TTR("Sort by ID (Descending)"), TilesEditorUtils::SOURCE_SORT_ID_REVERSE); + p->add_radio_check_item(TTR("Sort by Name (Ascending)"), TilesEditorUtils::SOURCE_SORT_NAME); + p->add_radio_check_item(TTR("Sort by Name (Descending)"), TilesEditorUtils::SOURCE_SORT_NAME_REVERSE); + p->set_item_checked(TilesEditorUtils::SOURCE_SORT_ID, true); sources_list = memnew(ItemList); sources_list->set_fixed_icon_size(Size2(60, 60) * EDSCALE); sources_list->set_h_size_flags(SIZE_EXPAND_FILL); sources_list->set_v_size_flags(SIZE_EXPAND_FILL); sources_list->connect("item_selected", callable_mp(this, &TileSetEditor::_source_selected)); - sources_list->connect("item_selected", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::set_sources_lists_current)); - sources_list->connect("visibility_changed", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::synchronize_sources_list).bind(sources_list, source_sort_button)); + sources_list->connect("item_selected", callable_mp(TilesEditorUtils::get_singleton(), &TilesEditorUtils::set_sources_lists_current)); + sources_list->connect("visibility_changed", callable_mp(TilesEditorUtils::get_singleton(), &TilesEditorUtils::synchronize_sources_list).bind(sources_list, source_sort_button)); sources_list->add_user_signal(MethodInfo("sort_request")); sources_list->connect("sort_request", callable_mp(this, &TileSetEditor::_update_sources_list).bind(-1)); sources_list->set_texture_filter(CanvasItem::TEXTURE_FILTER_NEAREST); @@ -855,7 +945,7 @@ TileSetEditor::TileSetEditor() { patterns_item_list->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size)); patterns_item_list->set_v_size_flags(Control::SIZE_EXPAND_FILL); patterns_item_list->connect("gui_input", callable_mp(this, &TileSetEditor::_patterns_item_list_gui_input)); - add_child(patterns_item_list); + main_vb->add_child(patterns_item_list); patterns_item_list->hide(); patterns_help_label = memnew(Label); @@ -864,6 +954,12 @@ TileSetEditor::TileSetEditor() { patterns_help_label->set_anchors_and_offsets_preset(Control::PRESET_CENTER); patterns_item_list->add_child(patterns_help_label); + // Expanded editor + expanded_area = memnew(PanelContainer); + add_child(expanded_area); + expanded_area->set_anchors_and_offsets_preset(PRESET_LEFT_WIDE); + expanded_area->hide(); + // Registers UndoRedo inspector callback. EditorNode::get_singleton()->get_editor_data().add_move_array_element_function(SNAME("TileSet"), callable_mp(this, &TileSetEditor::_move_tile_set_array_element)); EditorNode::get_singleton()->get_editor_data().add_undo_redo_inspector_hook_callback(callable_mp(this, &TileSetEditor::_undo_redo_inspector_callback)); |