@tool class_name GalleryItem extends Container @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_btn = %SceneButton as Button @onready var scene_holder = %SceneHolder as Control @onready var display_layer = %DisplayLayer as CanvasLayer @onready var display_control_mask = %ControlMask as Control func _ready() -> void: display_layer.layer = GlobalConfig.CANVAS_LAYER_GALLERY_CARD title_label.text = title _reload_scene() scene_btn.mouse_entered.connect(_on_toggle_hover.bind(true)) scene_btn.mouse_exited.connect(_on_toggle_hover.bind(false)) scene_btn.pressed.connect(_on_pressed) var current_scene: Node2D func _reload_scene(add_to_card:=true): if current_scene: current_scene.queue_free() if not packed_scene: return current_scene = packed_scene.instantiate() if add_to_card: scene_holder.add_child(current_scene) current_scene.scale = Vector2.ONE * 0.125 # 1/8 # 防止看到上边缘黑边 current_scene.position = Vector2(0, -4.75) func _on_toggle_hover(focus: bool): if current_scene and not displaying: if focus: grab_focus() current_scene.run_clip(true) else: if has_focus(): release_focus() _reload_scene() var displaying = false: set(val): displaying = val display_control_mask.visible = val if not val: if display_control_mask.has_focus(): display_control_mask.release_focus() func _on_pressed(): if displaying: return _reload_scene() displaying = true if current_scene: current_scene.reparent(display_layer, false) current_scene.scale = Vector2(1, 1) current_scene.position = Vector2.ZERO current_scene.run_clip(false) 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: # 只有在 displaying 状态下生效 if displaying: if ( event.is_action_pressed("escape") or event.is_action_pressed("cancel") or event.is_action_pressed("gallery") ): _on_display_finished() get_viewport().set_input_as_handled()