소스 검색

Improve TileSetAtlasSourceEditor UI

* Updates the overall layout, moving mode buttons to the top.
* Uses inspector category instead of a Label to show what's being edited. This also allows better scrolling behavior.
Haoyu Qiu 2 년 전
부모
커밋
d8f5dcbf56

+ 0 - 4
editor/plugins/tiles/tile_data_editors.cpp

@@ -1207,8 +1207,6 @@ TileDataDefaultEditor::TileDataDefaultEditor() {
 	label->set_theme_type_variation("HeaderSmall");
 	label->set_theme_type_variation("HeaderSmall");
 	add_child(label);
 	add_child(label);
 
 
-	toolbar->add_child(memnew(VSeparator));
-
 	picker_button = memnew(Button);
 	picker_button = memnew(Button);
 	picker_button->set_flat(true);
 	picker_button->set_flat(true);
 	picker_button->set_toggle_mode(true);
 	picker_button->set_toggle_mode(true);
@@ -2659,8 +2657,6 @@ TileDataTerrainsEditor::TileDataTerrainsEditor() {
 	add_child(label);
 	add_child(label);
 
 
 	// Toolbar
 	// Toolbar
-	toolbar->add_child(memnew(VSeparator));
-
 	picker_button = memnew(Button);
 	picker_button = memnew(Button);
 	picker_button->set_flat(true);
 	picker_button->set_flat(true);
 	picker_button->set_toggle_mode(true);
 	picker_button->set_toggle_mode(true);

+ 95 - 107
editor/plugins/tiles/tile_set_atlas_source_editor.cpp

@@ -64,11 +64,15 @@ void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::set_id(int p_id) {
 	emit_signal(SNAME("changed"), "id");
 	emit_signal(SNAME("changed"), "id");
 }
 }
 
 
-int TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::get_id() {
+int TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::get_id() const {
 	return source_id;
 	return source_id;
 }
 }
 
 
 bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_set(const StringName &p_name, const Variant &p_value) {
 bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_set(const StringName &p_name, const Variant &p_value) {
+	if (p_name == "id") {
+		set_id(p_value);
+		return true;
+	}
 	String name = p_name;
 	String name = p_name;
 	if (name == "name") {
 	if (name == "name") {
 		// Use the resource_name property to store the source's name.
 		// Use the resource_name property to store the source's name.
@@ -86,6 +90,10 @@ bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get(const StringN
 	if (!tile_set_atlas_source) {
 	if (!tile_set_atlas_source) {
 		return false;
 		return false;
 	}
 	}
+	if (p_name == "id") {
+		r_ret = get_id();
+		return true;
+	}
 	String name = p_name;
 	String name = p_name;
 	if (name == "name") {
 	if (name == "name") {
 		// Use the resource_name property to store the source's name.
 		// Use the resource_name property to store the source's name.
@@ -97,6 +105,8 @@ bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get(const StringN
 }
 }
 
 
 void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get_property_list(List<PropertyInfo> *p_list) const {
 void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get_property_list(List<PropertyInfo> *p_list) const {
+	p_list->push_back(PropertyInfo(Variant::NIL, TTR("Atlas"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
+	p_list->push_back(PropertyInfo(Variant::INT, "id", PROPERTY_HINT_RANGE, "0," + itos(INT_MAX) + ",1"));
 	p_list->push_back(PropertyInfo(Variant::STRING, "name", PROPERTY_HINT_NONE, ""));
 	p_list->push_back(PropertyInfo(Variant::STRING, "name", PROPERTY_HINT_NONE, ""));
 	p_list->push_back(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"));
 	p_list->push_back(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"));
 	p_list->push_back(PropertyInfo(Variant::VECTOR2I, "margins", PROPERTY_HINT_NONE, "suffix:px"));
 	p_list->push_back(PropertyInfo(Variant::VECTOR2I, "margins", PROPERTY_HINT_NONE, "suffix:px"));
@@ -106,12 +116,6 @@ void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get_property_list
 }
 }
 
 
 void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_bind_methods() {
 void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_bind_methods() {
-	// -- Shape and layout --
-	ClassDB::bind_method(D_METHOD("set_id", "id"), &TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::set_id);
-	ClassDB::bind_method(D_METHOD("get_id"), &TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::get_id);
-
-	ADD_PROPERTY(PropertyInfo(Variant::INT, "id", PROPERTY_HINT_RANGE, "0," + itos(INT_MAX) + ",1"), "set_id", "get_id");
-
 	ADD_SIGNAL(MethodInfo("changed", PropertyInfo(Variant::STRING, "what")));
 	ADD_SIGNAL(MethodInfo("changed", PropertyInfo(Variant::STRING, "what")));
 }
 }
 
 
@@ -383,11 +387,15 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro
 	// ID and size related properties.
 	// ID and size related properties.
 	if (tiles.size() == 1) {
 	if (tiles.size() == 1) {
 		if (tiles.front()->get().alternative == 0) {
 		if (tiles.front()->get().alternative == 0) {
-			p_list->push_back(PropertyInfo(Variant::VECTOR2I, "atlas_coords", PROPERTY_HINT_NONE, ""));
-			p_list->push_back(PropertyInfo(Variant::VECTOR2I, "size_in_atlas", PROPERTY_HINT_NONE, ""));
+			p_list->push_back(PropertyInfo(Variant::NIL, TTR("Base Tile"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
+			p_list->push_back(PropertyInfo(Variant::VECTOR2I, "atlas_coords"));
+			p_list->push_back(PropertyInfo(Variant::VECTOR2I, "size_in_atlas"));
 		} else {
 		} else {
-			p_list->push_back(PropertyInfo(Variant::INT, "alternative_id", PROPERTY_HINT_NONE, ""));
+			p_list->push_back(PropertyInfo(Variant::NIL, TTR("Alternative Tile"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
+			p_list->push_back(PropertyInfo(Variant::INT, "alternative_id"));
 		}
 		}
+	} else {
+		p_list->push_back(PropertyInfo(Variant::NIL, TTR("Tiles"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY));
 	}
 	}
 
 
 	// Animation.
 	// Animation.
@@ -443,6 +451,11 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro
 
 
 		HashMap<String, int> counts; // Counts the number of time a property appears (useful for groups that may appear more than once)
 		HashMap<String, int> counts; // Counts the number of time a property appears (useful for groups that may appear more than once)
 		for (List<PropertyInfo>::Element *E_property = list.front(); E_property; E_property = E_property->next()) {
 		for (List<PropertyInfo>::Element *E_property = list.front(); E_property; E_property = E_property->next()) {
+			// Don't show category for TileData.
+			if (E_property->get().usage & PROPERTY_USAGE_CATEGORY) {
+				continue;
+			}
+
 			const String &property_string = E_property->get().name;
 			const String &property_string = E_property->get().name;
 			if (!tile_data->is_allowing_transform() && (property_string == "flip_h" || property_string == "flip_v" || property_string == "transpose")) {
 			if (!tile_data->is_allowing_transform() && (property_string == "flip_h" || property_string == "flip_v" || property_string == "transpose")) {
 				continue;
 				continue;
@@ -566,7 +579,6 @@ void TileSetAtlasSourceEditor::_update_fix_selected_and_hovered_tiles() {
 void TileSetAtlasSourceEditor::_update_atlas_source_inspector() {
 void TileSetAtlasSourceEditor::_update_atlas_source_inspector() {
 	// Update visibility.
 	// Update visibility.
 	bool inspector_visible = tools_button_group->get_pressed_button() == tool_setup_atlas_source_button;
 	bool inspector_visible = tools_button_group->get_pressed_button() == tool_setup_atlas_source_button;
-	atlas_source_inspector_label->set_visible(inspector_visible);
 	atlas_source_inspector->set_visible(inspector_visible);
 	atlas_source_inspector->set_visible(inspector_visible);
 }
 }
 
 
@@ -576,11 +588,9 @@ void TileSetAtlasSourceEditor::_update_tile_inspector() {
 		if (!selection.is_empty()) {
 		if (!selection.is_empty()) {
 			tile_proxy_object->edit(tile_set_atlas_source, selection);
 			tile_proxy_object->edit(tile_set_atlas_source, selection);
 		}
 		}
-		tile_inspector_label->show();
 		tile_inspector->set_visible(!selection.is_empty());
 		tile_inspector->set_visible(!selection.is_empty());
 		tile_inspector_no_tile_selected_label->set_visible(selection.is_empty());
 		tile_inspector_no_tile_selected_label->set_visible(selection.is_empty());
 	} else {
 	} else {
-		tile_inspector_label->hide();
 		tile_inspector->hide();
 		tile_inspector->hide();
 		tile_inspector_no_tile_selected_label->hide();
 		tile_inspector_no_tile_selected_label->hide();
 	}
 	}
@@ -798,6 +808,8 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() {
 		tile_data_editor_dropdown_button->set_text(TTR("Select a property editor"));
 		tile_data_editor_dropdown_button->set_text(TTR("Select a property editor"));
 	}
 	}
 	tile_data_editors_label->set_visible(is_visible);
 	tile_data_editors_label->set_visible(is_visible);
+	tile_data_editors_tree->set_visible(is_visible);
+	tile_data_painting_editor_container->set_visible(is_visible);
 }
 }
 
 
 void TileSetAtlasSourceEditor::_update_current_tile_data_editor() {
 void TileSetAtlasSourceEditor::_update_current_tile_data_editor() {
@@ -954,21 +966,18 @@ void TileSetAtlasSourceEditor::_update_toolbar() {
 		if (current_tile_data_editor_toolbar) {
 		if (current_tile_data_editor_toolbar) {
 			current_tile_data_editor_toolbar->hide();
 			current_tile_data_editor_toolbar->hide();
 		}
 		}
-		tool_settings_vsep->show();
 		tools_settings_erase_button->show();
 		tools_settings_erase_button->show();
 		tool_advanced_menu_buttom->show();
 		tool_advanced_menu_buttom->show();
 	} else if (tools_button_group->get_pressed_button() == tool_select_button) {
 	} else if (tools_button_group->get_pressed_button() == tool_select_button) {
 		if (current_tile_data_editor_toolbar) {
 		if (current_tile_data_editor_toolbar) {
 			current_tile_data_editor_toolbar->hide();
 			current_tile_data_editor_toolbar->hide();
 		}
 		}
-		tool_settings_vsep->hide();
 		tools_settings_erase_button->hide();
 		tools_settings_erase_button->hide();
 		tool_advanced_menu_buttom->hide();
 		tool_advanced_menu_buttom->hide();
 	} else if (tools_button_group->get_pressed_button() == tool_paint_button) {
 	} else if (tools_button_group->get_pressed_button() == tool_paint_button) {
 		if (current_tile_data_editor_toolbar) {
 		if (current_tile_data_editor_toolbar) {
 			current_tile_data_editor_toolbar->show();
 			current_tile_data_editor_toolbar->show();
 		}
 		}
-		tool_settings_vsep->hide();
 		tools_settings_erase_button->hide();
 		tools_settings_erase_button->hide();
 		tool_advanced_menu_buttom->hide();
 		tool_advanced_menu_buttom->hide();
 	}
 	}
@@ -2355,38 +2364,65 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
 	set_process_unhandled_key_input(true);
 	set_process_unhandled_key_input(true);
 	set_process_internal(true);
 	set_process_internal(true);
 
 
-	// -- Right side --
-	HSplitContainer *split_container_right_side = memnew(HSplitContainer);
-	split_container_right_side->set_h_size_flags(SIZE_EXPAND_FILL);
-	add_child(split_container_right_side);
-
 	// Middle panel.
 	// Middle panel.
-	ScrollContainer *middle_panel = memnew(ScrollContainer);
-	middle_panel->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED);
-	middle_panel->set_custom_minimum_size(Size2(200, 0) * EDSCALE);
-	split_container_right_side->add_child(middle_panel);
-
 	VBoxContainer *middle_vbox_container = memnew(VBoxContainer);
 	VBoxContainer *middle_vbox_container = memnew(VBoxContainer);
-	middle_vbox_container->set_h_size_flags(SIZE_EXPAND_FILL);
-	middle_panel->add_child(middle_vbox_container);
+	middle_vbox_container->set_custom_minimum_size(Size2(200, 0) * EDSCALE);
+	add_child(middle_vbox_container);
 
 
-	// Tile inspector.
-	tile_inspector_label = memnew(Label);
-	tile_inspector_label->set_text(TTR("Tile Properties:"));
-	tile_inspector_label->set_theme_type_variation("HeaderSmall");
-	middle_vbox_container->add_child(tile_inspector_label);
+	// -- Toolbox --
+	tools_button_group.instantiate();
+	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_fix_selected_and_hovered_tiles).unbind(1));
+	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_id_label).unbind(1));
+	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_atlas_source_inspector).unbind(1));
+	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_inspector).unbind(1));
+	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_data_editors).unbind(1));
+	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_current_tile_data_editor).unbind(1));
+	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_atlas_view).unbind(1));
+	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_toolbar).unbind(1));
 
 
+	HBoxContainer *toolbox = memnew(HBoxContainer);
+	middle_vbox_container->add_child(toolbox);
+
+	tool_setup_atlas_source_button = memnew(Button);
+	tool_setup_atlas_source_button->set_text(TTR("Setup"));
+	tool_setup_atlas_source_button->set_flat(true);
+	tool_setup_atlas_source_button->set_toggle_mode(true);
+	tool_setup_atlas_source_button->set_pressed(true);
+	tool_setup_atlas_source_button->set_button_group(tools_button_group);
+	tool_setup_atlas_source_button->set_tooltip_text(TTR("Atlas setup. Add/Remove tiles tool (use the shift key to create big tiles, control for rectangle editing)."));
+	toolbox->add_child(tool_setup_atlas_source_button);
+
+	tool_select_button = memnew(Button);
+	tool_select_button->set_text(TTR("Select"));
+	tool_select_button->set_flat(true);
+	tool_select_button->set_toggle_mode(true);
+	tool_select_button->set_pressed(false);
+	tool_select_button->set_button_group(tools_button_group);
+	tool_select_button->set_tooltip_text(TTR("Select tiles."));
+	toolbox->add_child(tool_select_button);
+
+	tool_paint_button = memnew(Button);
+	tool_paint_button->set_text(TTR("Paint"));
+	tool_paint_button->set_flat(true);
+	tool_paint_button->set_toggle_mode(true);
+	tool_paint_button->set_button_group(tools_button_group);
+	tool_paint_button->set_tooltip_text(TTR("Paint properties."));
+	toolbox->add_child(tool_paint_button);
+
+	// Tile inspector.
 	tile_proxy_object = memnew(AtlasTileProxyObject(this));
 	tile_proxy_object = memnew(AtlasTileProxyObject(this));
 	tile_proxy_object->connect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_proxy_object_changed));
 	tile_proxy_object->connect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_proxy_object_changed));
 
 
 	tile_inspector = memnew(EditorInspector);
 	tile_inspector = memnew(EditorInspector);
-	tile_inspector->set_vertical_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED);
+	tile_inspector->set_v_size_flags(SIZE_EXPAND_FILL);
+	tile_inspector->set_show_categories(true);
 	tile_inspector->edit(tile_proxy_object);
 	tile_inspector->edit(tile_proxy_object);
 	tile_inspector->set_use_folding(true);
 	tile_inspector->set_use_folding(true);
 	tile_inspector->connect("property_selected", callable_mp(this, &TileSetAtlasSourceEditor::_inspector_property_selected));
 	tile_inspector->connect("property_selected", callable_mp(this, &TileSetAtlasSourceEditor::_inspector_property_selected));
 	middle_vbox_container->add_child(tile_inspector);
 	middle_vbox_container->add_child(tile_inspector);
 
 
 	tile_inspector_no_tile_selected_label = memnew(Label);
 	tile_inspector_no_tile_selected_label = memnew(Label);
+	tile_inspector_no_tile_selected_label->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
 	tile_inspector_no_tile_selected_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER);
 	tile_inspector_no_tile_selected_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER);
 	tile_inspector_no_tile_selected_label->set_text(TTR("No tiles selected."));
 	tile_inspector_no_tile_selected_label->set_text(TTR("No tiles selected."));
 	middle_vbox_container->add_child(tile_inspector_no_tile_selected_label);
 	middle_vbox_container->add_child(tile_inspector_no_tile_selected_label);
@@ -2418,77 +2454,22 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
 	middle_vbox_container->add_child(tile_data_painting_editor_container);
 	middle_vbox_container->add_child(tile_data_painting_editor_container);
 
 
 	// Atlas source inspector.
 	// Atlas source inspector.
-	atlas_source_inspector_label = memnew(Label);
-	atlas_source_inspector_label->set_text(TTR("Atlas Properties:"));
-	atlas_source_inspector_label->set_theme_type_variation("HeaderSmall");
-	middle_vbox_container->add_child(atlas_source_inspector_label);
-
 	atlas_source_proxy_object = memnew(TileSetAtlasSourceProxyObject());
 	atlas_source_proxy_object = memnew(TileSetAtlasSourceProxyObject());
 	atlas_source_proxy_object->connect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_atlas_source_proxy_object_changed));
 	atlas_source_proxy_object->connect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_atlas_source_proxy_object_changed));
 
 
 	atlas_source_inspector = memnew(EditorInspector);
 	atlas_source_inspector = memnew(EditorInspector);
-	atlas_source_inspector->set_vertical_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED);
+	atlas_source_inspector->set_v_size_flags(SIZE_EXPAND_FILL);
+	atlas_source_inspector->set_show_categories(true);
 	atlas_source_inspector->edit(atlas_source_proxy_object);
 	atlas_source_inspector->edit(atlas_source_proxy_object);
 	middle_vbox_container->add_child(atlas_source_inspector);
 	middle_vbox_container->add_child(atlas_source_inspector);
 
 
-	// Right panel.
-	VBoxContainer *right_panel = memnew(VBoxContainer);
-	right_panel->set_h_size_flags(SIZE_EXPAND_FILL);
-	right_panel->set_v_size_flags(SIZE_EXPAND_FILL);
-	split_container_right_side->add_child(right_panel);
-
-	// -- Dialogs --
-	confirm_auto_create_tiles = memnew(AcceptDialog);
-	confirm_auto_create_tiles->set_title(TTR("Auto Create Tiles in Non-Transparent Texture Regions?"));
-	confirm_auto_create_tiles->set_text(TTR("The atlas's texture was modified.\nWould you like to automatically create tiles in the atlas?"));
-	confirm_auto_create_tiles->set_ok_button_text(TTR("Yes"));
-	confirm_auto_create_tiles->add_cancel_button()->set_text(TTR("No"));
-	confirm_auto_create_tiles->connect("confirmed", callable_mp(this, &TileSetAtlasSourceEditor::_auto_create_tiles));
-	add_child(confirm_auto_create_tiles);
-
-	// -- Toolbox --
-	tools_button_group.instantiate();
-	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_fix_selected_and_hovered_tiles).unbind(1));
-	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_id_label).unbind(1));
-	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_atlas_source_inspector).unbind(1));
-	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_inspector).unbind(1));
-	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_data_editors).unbind(1));
-	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_current_tile_data_editor).unbind(1));
-	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_atlas_view).unbind(1));
-	tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_toolbar).unbind(1));
-
-	toolbox = memnew(HBoxContainer);
-	right_panel->add_child(toolbox);
-
-	tool_setup_atlas_source_button = memnew(Button);
-	tool_setup_atlas_source_button->set_flat(true);
-	tool_setup_atlas_source_button->set_toggle_mode(true);
-	tool_setup_atlas_source_button->set_pressed(true);
-	tool_setup_atlas_source_button->set_button_group(tools_button_group);
-	tool_setup_atlas_source_button->set_tooltip_text(TTR("Atlas setup. Add/Remove tiles tool (use the shift key to create big tiles, control for rectangle editing)."));
-	toolbox->add_child(tool_setup_atlas_source_button);
-
-	tool_select_button = memnew(Button);
-	tool_select_button->set_flat(true);
-	tool_select_button->set_toggle_mode(true);
-	tool_select_button->set_pressed(false);
-	tool_select_button->set_button_group(tools_button_group);
-	tool_select_button->set_tooltip_text(TTR("Select tiles."));
-	toolbox->add_child(tool_select_button);
-
-	tool_paint_button = memnew(Button);
-	tool_paint_button->set_flat(true);
-	tool_paint_button->set_toggle_mode(true);
-	tool_paint_button->set_button_group(tools_button_group);
-	tool_paint_button->set_tooltip_text(TTR("Paint properties."));
-	toolbox->add_child(tool_paint_button);
+	// -- Right side --
+	VBoxContainer *right_vbox_container = memnew(VBoxContainer);
+	add_child(right_vbox_container);
 
 
 	// Tool settings.
 	// Tool settings.
 	tool_settings = memnew(HBoxContainer);
 	tool_settings = memnew(HBoxContainer);
-	toolbox->add_child(tool_settings);
-
-	tool_settings_vsep = memnew(VSeparator);
-	tool_settings->add_child(tool_settings_vsep);
+	right_vbox_container->add_child(tool_settings);
 
 
 	tool_settings_tile_data_toolbar_container = memnew(HBoxContainer);
 	tool_settings_tile_data_toolbar_container = memnew(HBoxContainer);
 	tool_settings->add_child(tool_settings_tile_data_toolbar_container);
 	tool_settings->add_child(tool_settings_tile_data_toolbar_container);
@@ -2505,24 +2486,31 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
 	tool_advanced_menu_buttom->get_popup()->add_item(TTR("Create Tiles in Non-Transparent Texture Regions"), ADVANCED_AUTO_CREATE_TILES);
 	tool_advanced_menu_buttom->get_popup()->add_item(TTR("Create Tiles in Non-Transparent Texture Regions"), ADVANCED_AUTO_CREATE_TILES);
 	tool_advanced_menu_buttom->get_popup()->add_item(TTR("Remove Tiles in Fully Transparent Texture Regions"), ADVANCED_AUTO_REMOVE_TILES);
 	tool_advanced_menu_buttom->get_popup()->add_item(TTR("Remove Tiles in Fully Transparent Texture Regions"), ADVANCED_AUTO_REMOVE_TILES);
 	tool_advanced_menu_buttom->get_popup()->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
 	tool_advanced_menu_buttom->get_popup()->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option));
-	toolbox->add_child(tool_advanced_menu_buttom);
+	tool_settings->add_child(tool_advanced_menu_buttom);
 
 
 	_update_toolbar();
 	_update_toolbar();
 
 
 	// Right side of toolbar.
 	// Right side of toolbar.
 	Control *middle_space = memnew(Control);
 	Control *middle_space = memnew(Control);
 	middle_space->set_h_size_flags(SIZE_EXPAND_FILL);
 	middle_space->set_h_size_flags(SIZE_EXPAND_FILL);
-	toolbox->add_child(middle_space);
+	tool_settings->add_child(middle_space);
 
 
 	tool_tile_id_label = memnew(Label);
 	tool_tile_id_label = memnew(Label);
 	tool_tile_id_label->set_mouse_filter(Control::MOUSE_FILTER_STOP);
 	tool_tile_id_label->set_mouse_filter(Control::MOUSE_FILTER_STOP);
-	toolbox->add_child(tool_tile_id_label);
+	tool_settings->add_child(tool_tile_id_label);
 	_update_tile_id_label();
 	_update_tile_id_label();
 
 
+	// Right panel.
+	VBoxContainer *right_panel = memnew(VBoxContainer);
+	right_panel->set_h_size_flags(SIZE_EXPAND_FILL);
+	right_panel->set_v_size_flags(SIZE_EXPAND_FILL);
+	right_vbox_container->add_child(right_panel);
+
 	// Tile atlas view.
 	// Tile atlas view.
 	tile_atlas_view = memnew(TileAtlasView);
 	tile_atlas_view = memnew(TileAtlasView);
 	tile_atlas_view->set_h_size_flags(SIZE_EXPAND_FILL);
 	tile_atlas_view->set_h_size_flags(SIZE_EXPAND_FILL);
 	tile_atlas_view->set_v_size_flags(SIZE_EXPAND_FILL);
 	tile_atlas_view->set_v_size_flags(SIZE_EXPAND_FILL);
+	tile_atlas_view->set_custom_minimum_size(Size2(200, 0) * EDSCALE);
 	tile_atlas_view->connect("transform_changed", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::set_atlas_view_transform));
 	tile_atlas_view->connect("transform_changed", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::set_atlas_view_transform));
 	tile_atlas_view->connect("transform_changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_atlas_view_transform_changed).unbind(2));
 	tile_atlas_view->connect("transform_changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_atlas_view_transform_changed).unbind(2));
 	right_panel->add_child(tile_atlas_view);
 	right_panel->add_child(tile_atlas_view);
@@ -2565,17 +2553,17 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() {
 	tile_atlas_view->add_control_over_alternative_tiles(alternative_tiles_control_unscaled, false);
 	tile_atlas_view->add_control_over_alternative_tiles(alternative_tiles_control_unscaled, false);
 	alternative_tiles_control_unscaled->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
 	alternative_tiles_control_unscaled->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
 
 
-	tile_atlas_view_missing_source_label = memnew(Label);
-	tile_atlas_view_missing_source_label->set_text(TTR("Add or select an atlas texture to the left panel."));
-	tile_atlas_view_missing_source_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER);
-	tile_atlas_view_missing_source_label->set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER);
-	tile_atlas_view_missing_source_label->set_h_size_flags(SIZE_EXPAND_FILL);
-	tile_atlas_view_missing_source_label->set_v_size_flags(SIZE_EXPAND_FILL);
-	tile_atlas_view_missing_source_label->hide();
-	right_panel->add_child(tile_atlas_view_missing_source_label);
-
 	EditorNode::get_singleton()->get_editor_data().add_undo_redo_inspector_hook_callback(callable_mp(this, &TileSetAtlasSourceEditor::_undo_redo_inspector_callback));
 	EditorNode::get_singleton()->get_editor_data().add_undo_redo_inspector_hook_callback(callable_mp(this, &TileSetAtlasSourceEditor::_undo_redo_inspector_callback));
 
 
+	// -- Dialogs --
+	confirm_auto_create_tiles = memnew(AcceptDialog);
+	confirm_auto_create_tiles->set_title(TTR("Auto Create Tiles in Non-Transparent Texture Regions?"));
+	confirm_auto_create_tiles->set_text(TTR("The atlas's texture was modified.\nWould you like to automatically create tiles in the atlas?"));
+	confirm_auto_create_tiles->set_ok_button_text(TTR("Yes"));
+	confirm_auto_create_tiles->add_cancel_button()->set_text(TTR("No"));
+	confirm_auto_create_tiles->connect("confirmed", callable_mp(this, &TileSetAtlasSourceEditor::_auto_create_tiles));
+	add_child(confirm_auto_create_tiles);
+
 	// Inspector plugin.
 	// Inspector plugin.
 	Ref<EditorInspectorPluginTileData> tile_data_inspector_plugin;
 	Ref<EditorInspectorPluginTileData> tile_data_inspector_plugin;
 	tile_data_inspector_plugin.instantiate();
 	tile_data_inspector_plugin.instantiate();

+ 3 - 8
editor/plugins/tiles/tile_set_atlas_source_editor.h

@@ -42,8 +42,8 @@ class TileSet;
 class Tree;
 class Tree;
 class VSeparator;
 class VSeparator;
 
 
-class TileSetAtlasSourceEditor : public HBoxContainer {
-	GDCLASS(TileSetAtlasSourceEditor, HBoxContainer);
+class TileSetAtlasSourceEditor : public HSplitContainer {
+	GDCLASS(TileSetAtlasSourceEditor, HSplitContainer);
 
 
 public:
 public:
 	// A class to store which tiles are selected.
 	// A class to store which tiles are selected.
@@ -77,7 +77,7 @@ public:
 
 
 	public:
 	public:
 		void set_id(int p_id);
 		void set_id(int p_id);
-		int get_id();
+		int get_id() const;
 
 
 		void edit(Ref<TileSet> p_tile_set, TileSetAtlasSource *p_tile_set_atlas_source, int p_source_id);
 		void edit(Ref<TileSet> p_tile_set, TileSetAtlasSource *p_tile_set_atlas_source, int p_source_id);
 		TileSetAtlasSource *get_edited() { return tile_set_atlas_source; };
 		TileSetAtlasSource *get_edited() { return tile_set_atlas_source; };
@@ -137,19 +137,15 @@ private:
 
 
 	// -- Inspector --
 	// -- Inspector --
 	AtlasTileProxyObject *tile_proxy_object = nullptr;
 	AtlasTileProxyObject *tile_proxy_object = nullptr;
-	Label *tile_inspector_label = nullptr;
 	EditorInspector *tile_inspector = nullptr;
 	EditorInspector *tile_inspector = nullptr;
 	Label *tile_inspector_no_tile_selected_label = nullptr;
 	Label *tile_inspector_no_tile_selected_label = nullptr;
 	String selected_property;
 	String selected_property;
 	void _inspector_property_selected(String p_property);
 	void _inspector_property_selected(String p_property);
 
 
 	TileSetAtlasSourceProxyObject *atlas_source_proxy_object = nullptr;
 	TileSetAtlasSourceProxyObject *atlas_source_proxy_object = nullptr;
-	Label *atlas_source_inspector_label = nullptr;
 	EditorInspector *atlas_source_inspector = nullptr;
 	EditorInspector *atlas_source_inspector = nullptr;
 
 
 	// -- Atlas view --
 	// -- Atlas view --
-	HBoxContainer *toolbox = nullptr;
-	Label *tile_atlas_view_missing_source_label = nullptr;
 	TileAtlasView *tile_atlas_view = nullptr;
 	TileAtlasView *tile_atlas_view = nullptr;
 
 
 	// Dragging
 	// Dragging
@@ -210,7 +206,6 @@ private:
 
 
 	// Tool settings.
 	// Tool settings.
 	HBoxContainer *tool_settings = nullptr;
 	HBoxContainer *tool_settings = nullptr;
-	VSeparator *tool_settings_vsep = nullptr;
 	HBoxContainer *tool_settings_tile_data_toolbar_container = nullptr;
 	HBoxContainer *tool_settings_tile_data_toolbar_container = nullptr;
 	Button *tools_settings_erase_button = nullptr;
 	Button *tools_settings_erase_button = nullptr;
 	MenuButton *tool_advanced_menu_buttom = nullptr;
 	MenuButton *tool_advanced_menu_buttom = nullptr;