summaryrefslogtreecommitdiffstats
path: root/editor/plugins/tiles/tile_set_editor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'editor/plugins/tiles/tile_set_editor.cpp')
-rw-r--r--editor/plugins/tiles/tile_set_editor.cpp158
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));