godot-plateformer/addons/reedscene/act/StateQuickConfigPanel.gd

103 lines
2.5 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@tool
extends PanelContainer
@onready var vbc_spawn_slot_root: VBoxContainer = %VBC_SpawnSlotRoot
@onready var b_insert: Button = %B_Insert
@onready var b_remove: Button = %B_Remove
@onready var b_add: Button = %B_Add
@onready var rtl_context: RichTextLabel = %RTL_Context
const DEFAULT_CONTEXT: Dictionary = {
"default": "Press insert to generate a act.",
"removerr": "Act need at least on single act.",
"adderr": "Single act count cannot over the count of props.",
"inserterr": "Insert act with empty slot."
}
var _inited: bool = false
var _max_length: int = -1
var _cached_prop_id: Array[int]
## 默认的Slot
const SLOT: PackedScene = preload("res://addons/reedscene/act/StateDrapSlot.tscn")
func _ready() -> void:
if not Engine.is_editor_hint():
return
# 连接按钮
b_add.pressed.connect(_on_add_pressed)
b_remove.pressed.connect(_on_remove_pressed)
b_insert.pressed.connect(_on_insert_pressed)
# 初始保证至少有一个 Slot
if vbc_spawn_slot_root.get_child_count() == 0:
_add_slot()
_update_b_remove_state()
func init(info:Dictionary) -> void:
_inited = true
if info.has("size"):
self._max_length = info.get("size") as int
func _on_add_pressed() -> void:
_add_slot()
func _on_remove_pressed() -> void:
_remove_slot()
func _on_insert_pressed() -> void:
_insert_act()
## 插入一個根據當前的條目生成的Act
func _insert_act()-> void:
var slots = vbc_spawn_slot_root.get_children()
for s in slots:
var vs = s as StateDrapSlot
if not vs:
continue ##後續要有報錯Message
## 添加一個Slot不能超過當前Scene的最大prop數量
func _add_slot() -> void:
if vbc_spawn_slot_root.get_child_count() >= _max_length:
return
var slot := SLOT.instantiate()
slot.prop_info_cached.connect(_on_slot_prop_cached)
vbc_spawn_slot_root.add_child(slot)
slot.owner = get_tree().edited_scene_root # 编辑器可保存
slot.init(vbc_spawn_slot_root.get_children().size())
_update_b_remove_state()
func _on_slot_prop_cached(info:Dictionary,slot:StateDrapSlot) -> void:
if not info.has("prop_id"):
return
var id : int = info.prop_id
if _cached_prop_id.has(id):
slot._set_state(0)
else:
_cached_prop_id.append(id)
## 移除一個Slot最少不能為0
func _remove_slot() -> void:
var count := vbc_spawn_slot_root.get_child_count()
if count <= 1:
return
var last := vbc_spawn_slot_root.get_child(count - 1)
last.queue_free()
_update_b_remove_state()
func _update_b_remove_state() -> void:
b_remove.disabled = vbc_spawn_slot_root.get_child_count() <= 1