89 lines
2.4 KiB
GDScript
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()
|