Files
millimeters-of-aluminum/addons/module_builder_plugin/builder_dock.gd
2025-12-05 15:50:48 +01:00

89 lines
2.4 KiB
GDScript

@tool
extends Control
const PIECE_DIRECTORY = "res://scenes/ship/builder/pieces/"
@onready var pieces_container: HFlowContainer = %PiecesContainer
@onready var clear_button: Button = %ClearButton
var preview_piece: StructuralPiece = null
var active_piece_scene: PackedScene = null
var rotation_angle: float = 0.0
var grid_size: float = 50.0
signal active_piece_set(piece: StructuralPiece)
func _ready() -> void:
if not Engine.is_editor_hint():
return
_setup_piece_buttons()
clear_button.pressed.connect(_on_clear_button_pressed)
func _exit_tree() -> void:
if preview_piece:
preview_piece.queue_free()
func _setup_piece_buttons() -> void:
for child in pieces_container.get_children():
child.queue_free()
var dir = DirAccess.open(PIECE_DIRECTORY)
if not dir:
push_error("Could not open directory: ", PIECE_DIRECTORY)
return
dir.list_dir_begin()
var file_name = dir.get_next()
while file_name != "":
if file_name.ends_with(".tscn"):
var file_path = PIECE_DIRECTORY.path_join(file_name)
_create_piece_button(file_path)
file_name = dir.get_next()
dir.list_dir_end()
func _create_piece_button(path: String) -> void:
var piece_scene = load(path) as PackedScene
if piece_scene and piece_scene.get_state().get_node_count() > 0:
var root = piece_scene.instantiate() as StructuralPiece
if root:
var button = Button.new()
button.text = root.name
button.pressed.connect(Callable(self, "_on_piece_button_pressed").bind(piece_scene))
button.size = Vector2(100, 100)
button.icon_alignment = HORIZONTAL_ALIGNMENT_CENTER
button.alignment = HORIZONTAL_ALIGNMENT_CENTER
var color_rect = root.find_child("ColorRect") as ColorRect
if color_rect:
var icon_texture = ImageTexture.create_from_image(Image.create(color_rect.size.x, color_rect.size.y, false, Image.FORMAT_RGBA8))
icon_texture.get_image().fill(color_rect.color)
button.icon = icon_texture
pieces_container.add_child(button)
root.queue_free()
func _on_piece_button_pressed(scene: PackedScene):
if is_instance_valid(preview_piece):
preview_piece.queue_free()
active_piece_set.emit(scene)
func _on_clear_button_pressed():
if is_instance_valid(preview_piece):
preview_piece.queue_free()
preview_piece = null
var selected_nodes = EditorInterface.get_selection().get_selected_nodes()
if not selected_nodes.is_empty() and selected_nodes[0] is Module:
selected_nodes[0].clear_module()