feat(designer): 新增整数元组列表行编辑器组件

This commit is contained in:
2026-07-22 12:09:47 +08:00
parent 064b225e0b
commit 0d6d511c86
+68
View File
@@ -0,0 +1,68 @@
## 整数元组列表编辑器(@tool)— 每行 N 个 SpinBox + 🗑 删行,底部 ➕ 加行。
## 用于 Core edgesfrom/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)