feat(designer): 新增整数元组列表行编辑器组件
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
## 整数元组列表编辑器(@tool)— 每行 N 个 SpinBox + 🗑 删行,底部 ➕ 加行。
|
||||
## 用于 Core edges(from/to)、balance aether_thresholds(波次/碎片)等可变长小整数元组列表。
|
||||
## 数据模型:Array[Array](行数组);调用方负责与自身 JSON 结构互转。
|
||||
@tool
|
||||
extends VBoxContainer
|
||||
|
||||
var _cols: Array = [] # [{label,min,max,step,int,default}]
|
||||
var _rows_box: VBoxContainer
|
||||
var _add_label: String = "➕ 加行"
|
||||
|
||||
func setup(col_specs: Array, add_label: String = "➕ 加行") -> void:
|
||||
_cols = col_specs
|
||||
_add_label = add_label
|
||||
_rows_box = VBoxContainer.new()
|
||||
add_child(_rows_box)
|
||||
var add_btn := Button.new()
|
||||
add_btn.text = _add_label
|
||||
add_btn.pressed.connect(_on_add)
|
||||
add_child(add_btn)
|
||||
|
||||
func set_values(rows: Array) -> void:
|
||||
if _rows_box == null:
|
||||
return
|
||||
for c in _rows_box.get_children():
|
||||
_rows_box.remove_child(c)
|
||||
c.free()
|
||||
for r in rows:
|
||||
_add_row(r)
|
||||
|
||||
func get_values() -> Array:
|
||||
var out: Array = []
|
||||
if _rows_box == null:
|
||||
return out
|
||||
for h in _rows_box.get_children():
|
||||
var row: Array = []
|
||||
var ci := 0
|
||||
for ch in h.get_children():
|
||||
if ch is SpinBox:
|
||||
var v: float = (ch as SpinBox).value
|
||||
var is_int: bool = bool(_cols[ci].get("int", true)) if ci < _cols.size() else true
|
||||
row.append(int(v) if is_int else v)
|
||||
ci += 1
|
||||
out.append(row)
|
||||
return out
|
||||
|
||||
func _on_add() -> void:
|
||||
_add_row([])
|
||||
|
||||
func _add_row(vals: Array) -> void:
|
||||
var h := HBoxContainer.new()
|
||||
for i in _cols.size():
|
||||
var c: Dictionary = _cols[i]
|
||||
var lbl := String(c.get("label", ""))
|
||||
if lbl != "":
|
||||
var l := Label.new(); l.text = lbl
|
||||
h.add_child(l)
|
||||
var sp := SpinBox.new()
|
||||
sp.min_value = c.get("min", 0)
|
||||
sp.max_value = c.get("max", 100000)
|
||||
sp.step = c.get("step", 1)
|
||||
sp.value = float(vals[i]) if i < vals.size() else float(c.get("default", c.get("min", 0)))
|
||||
sp.size_flags_horizontal = Control.SIZE_EXPAND_FILL
|
||||
h.add_child(sp)
|
||||
var del := Button.new()
|
||||
del.text = "🗑"
|
||||
del.pressed.connect(func(): _rows_box.remove_child(h); h.queue_free())
|
||||
h.add_child(del)
|
||||
_rows_box.add_child(h)
|
||||
Reference in New Issue
Block a user