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