diff --git a/Translations/Translations.pot b/Translations/Translations.pot index e0a6358ff..948144197 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -3395,6 +3395,11 @@ msgstr "" msgid "Tileset:" msgstr "" +#. A tileset is a collection of tiles. +#: src/UI/Dialogs/ProjectProperties.tscn +msgid "Tilesets" +msgstr "" + #: src/UI/Timeline/NewTileMapLayerDialog.tscn msgid "New tileset" msgstr "" diff --git a/src/Classes/TileSetCustom.gd b/src/Classes/TileSetCustom.gd index 362ef67ea..8870629f6 100644 --- a/src/Classes/TileSetCustom.gd +++ b/src/Classes/TileSetCustom.gd @@ -136,6 +136,17 @@ func get_text_info(tile_index: int) -> String: return tr("Tileset") + item_string +## Finds and returns all of the [LayerTileMap]s that use this tileset. +func find_using_layers(project: Project) -> Array[LayerTileMap]: + var tilemaps: Array[LayerTileMap] + for layer in project.layers: + if layer is not LayerTileMap: + continue + if layer.tileset == self: + tilemaps.append(layer) + return tilemaps + + ## Serializes the data of this class into the form of a [Dictionary], ## which is used so the data can be stored in pxo files. func serialize() -> Dictionary: diff --git a/src/UI/Dialogs/ProjectProperties.gd b/src/UI/Dialogs/ProjectProperties.gd index 9380e6229..3edfc43c7 100644 --- a/src/UI/Dialogs/ProjectProperties.gd +++ b/src/UI/Dialogs/ProjectProperties.gd @@ -1,11 +1,15 @@ extends AcceptDialog -@onready var size_value_label := $GridContainer/SizeValueLabel as Label -@onready var color_mode_value_label := $GridContainer/ColorModeValueLabel as Label -@onready var frames_value_label := $GridContainer/FramesValueLabel as Label -@onready var layers_value_label := $GridContainer/LayersValueLabel as Label -@onready var name_line_edit := $GridContainer/NameLineEdit as LineEdit -@onready var user_data_text_edit := $GridContainer/UserDataTextEdit as TextEdit +const CLOSE_TEXTURE := preload("res://assets/graphics/misc/close.svg") + +@onready var size_value_label := $VBoxContainer/GridContainer/SizeValueLabel as Label +@onready var color_mode_value_label := $VBoxContainer/GridContainer/ColorModeValueLabel as Label +@onready var frames_value_label := $VBoxContainer/GridContainer/FramesValueLabel as Label +@onready var layers_value_label := $VBoxContainer/GridContainer/LayersValueLabel as Label +@onready var name_line_edit := $VBoxContainer/GridContainer/NameLineEdit as LineEdit +@onready var user_data_text_edit := $VBoxContainer/GridContainer/UserDataTextEdit as TextEdit +@onready var tilesets_container := $VBoxContainer/TilesetsContainer as VBoxContainer +@onready var tilesets_list := $VBoxContainer/TilesetsContainer/TilesetsList as Tree func _on_visibility_changed() -> void: @@ -21,6 +25,25 @@ func _on_visibility_changed() -> void: layers_value_label.text = str(Global.current_project.layers.size()) name_line_edit.text = Global.current_project.name user_data_text_edit.text = Global.current_project.user_data + tilesets_container.visible = Global.current_project.tilesets.size() > 0 + tilesets_list.clear() + var root_item := tilesets_list.create_item() + for i in Global.current_project.tilesets.size(): + var tileset := Global.current_project.tilesets[i] + var tree_item := tilesets_list.create_item(root_item) + var item_text := tileset.get_text_info(i) + var using_layers := tileset.find_using_layers(Global.current_project) + for j in using_layers.size(): + if j == 0: + item_text += " (" + item_text += using_layers[j].name + if j == using_layers.size() - 1: + item_text += ")" + else: + item_text += ", " + tree_item.set_text(0, item_text) + tree_item.set_metadata(0, i) + tree_item.add_button(0, CLOSE_TEXTURE, -1, using_layers.size() > 0) func _on_name_line_edit_text_changed(new_text: String) -> void: @@ -29,3 +52,20 @@ func _on_name_line_edit_text_changed(new_text: String) -> void: func _on_user_data_text_edit_text_changed() -> void: Global.current_project.user_data = user_data_text_edit.text + + +func _on_tilesets_list_button_clicked(item: TreeItem, column: int, id: int, _mbi: int) -> void: + var tileset_index: int = item.get_metadata(column) + var project := Global.current_project + var tileset := project.tilesets[tileset_index] + if id == 0: # Delete + if tileset.find_using_layers(project).size() > 0: + return + project.undos += 1 + project.undo_redo.create_action("Delete tileset") + project.undo_redo.add_do_method(func(): project.tilesets.erase(tileset)) + project.undo_redo.add_do_method(Global.undo_or_redo.bind(false)) + project.undo_redo.add_undo_method(func(): project.tilesets.insert(tileset_index, tileset)) + project.undo_redo.add_undo_method(Global.undo_or_redo.bind(true)) + project.undo_redo.commit_action() + item.free() diff --git a/src/UI/Dialogs/ProjectProperties.tscn b/src/UI/Dialogs/ProjectProperties.tscn index 72c90b7c6..48e87a479 100644 --- a/src/UI/Dialogs/ProjectProperties.tscn +++ b/src/UI/Dialogs/ProjectProperties.tscn @@ -4,75 +4,103 @@ [node name="ProjectProperties" type="AcceptDialog"] title = "Project Properties" -size = Vector2i(197, 235) +position = Vector2i(0, 36) +size = Vector2i(300, 288) script = ExtResource("1_0n4uc") -[node name="GridContainer" type="GridContainer" parent="."] +[node name="VBoxContainer" type="VBoxContainer" parent="."] offset_left = 8.0 offset_top = 8.0 -offset_right = 189.0 -offset_bottom = 186.0 +offset_right = 292.0 +offset_bottom = 239.0 + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 columns = 2 -[node name="SizeLabel" type="Label" parent="GridContainer"] +[node name="SizeLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 text = "Size:" -[node name="SizeValueLabel" type="Label" parent="GridContainer"] +[node name="SizeValueLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 text = "64x64" -[node name="ColorModeLabel" type="Label" parent="GridContainer"] +[node name="ColorModeLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 text = "Color mode:" -[node name="ColorModeValueLabel" type="Label" parent="GridContainer"] +[node name="ColorModeValueLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 text = "RGBA8" -[node name="FramesLabel" type="Label" parent="GridContainer"] +[node name="FramesLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 text = "Frames:" -[node name="FramesValueLabel" type="Label" parent="GridContainer"] +[node name="FramesValueLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 text = "1" -[node name="LayersLabel" type="Label" parent="GridContainer"] +[node name="LayersLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 text = "Layers:" -[node name="LayersValueLabel" type="Label" parent="GridContainer"] +[node name="LayersValueLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 text = "1" -[node name="NameLabel" type="Label" parent="GridContainer"] +[node name="NameLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 text = "Name:" -[node name="NameLineEdit" type="LineEdit" parent="GridContainer"] +[node name="NameLineEdit" type="LineEdit" parent="VBoxContainer/GridContainer"] layout_mode = 2 -[node name="UserDataLabel" type="Label" parent="GridContainer"] +[node name="UserDataLabel" type="Label" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 size_flags_vertical = 0 text = "User data:" -[node name="UserDataTextEdit" type="TextEdit" parent="GridContainer"] +[node name="UserDataTextEdit" type="TextEdit" parent="VBoxContainer/GridContainer"] layout_mode = 2 size_flags_horizontal = 3 scroll_fit_content_height = true +[node name="TilesetsContainer" type="VBoxContainer" parent="VBoxContainer"] +visible = false +layout_mode = 2 +size_flags_vertical = 3 + +[node name="TilesetsHeader" type="HBoxContainer" parent="VBoxContainer/TilesetsContainer"] +layout_mode = 2 +theme_override_constants/separation = 0 + +[node name="Label" type="Label" parent="VBoxContainer/TilesetsContainer/TilesetsHeader"] +layout_mode = 2 +theme_type_variation = &"HeaderSmall" +text = "Tilesets" + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TilesetsContainer/TilesetsHeader"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="TilesetsList" type="Tree" parent="VBoxContainer/TilesetsContainer"] +layout_mode = 2 +size_flags_vertical = 3 +hide_root = true + [connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] -[connection signal="text_changed" from="GridContainer/NameLineEdit" to="." method="_on_name_line_edit_text_changed"] -[connection signal="text_changed" from="GridContainer/UserDataTextEdit" to="." method="_on_user_data_text_edit_text_changed"] +[connection signal="text_changed" from="VBoxContainer/GridContainer/NameLineEdit" to="." method="_on_name_line_edit_text_changed"] +[connection signal="text_changed" from="VBoxContainer/GridContainer/UserDataTextEdit" to="." method="_on_user_data_text_edit_text_changed"] +[connection signal="button_clicked" from="VBoxContainer/TilesetsContainer/TilesetsList" to="." method="_on_tilesets_list_button_clicked"]