xiandie/scene/gallery/gallery_item.gd

78 lines
1.7 KiB
GDScript

@tool
extends Button
@export var packed_scene: PackedScene:
set(val):
packed_scene = val
if is_node_ready():
_reload_scene()
@export var title: String:
set(val):
title = val
if is_node_ready():
title_label.text = val
@export_tool_button("重载场景") var reload = _reload_scene
@onready var title_label = %Title as Label
@onready var scene_panel = %ScenePanel as Control
@onready var display_layer = %DisplayLayer as CanvasLayer
func _ready() -> void:
display_layer.layer = GlobalConfig.CANVAS_LAYER_GALLERY_CARD
title_label.text = title
_reload_scene()
mouse_entered.connect(_on_toggle_hover.bind(true))
mouse_exited.connect(_on_toggle_hover.bind(false))
pressed.connect(_on_pressed)
var current_scene: Node2D
func _reload_scene():
if current_scene:
current_scene.queue_free()
if not packed_scene:
return
current_scene = packed_scene.instantiate()
scene_panel.add_child(current_scene)
current_scene.scale = Vector2(0.2, 0.2)
func _on_toggle_hover(focus: bool):
if current_scene and not displaying:
current_scene.toggle_card(focus)
var displaying = false:
set(val):
displaying = val
%ControlMask.visible = val
func _on_pressed():
if displaying:
return
displaying = true
if current_scene:
current_scene.reparent(display_layer)
current_scene.scale = Vector2(1, 1)
current_scene.position = Vector2.ZERO
current_scene.display()
current_scene.display_finished.connect(_on_display_finished, CONNECT_ONE_SHOT)
func _on_display_finished():
displaying = false
_reload_scene()
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_released("cancel") or event.is_action_released("escape"):
if displaying:
_on_display_finished()
get_viewport().set_input_as_handled()