- ConfirmDialog三钮化(契约3/Q5甲): open_three增设次钮+secondary_confirmed信号——双钮调用方零改动(open隐藏次钮);钮序=[取消][次选项][确认] - 大门两分支(裁决5): 有断点=三出口弹窗(继续上一段冒险/开始新冒险/取消,open_three)+无断点=是否开始新冒险(是/否);点大门永远先出确认不直接进冒险;cancelled恒=无变更退回营地 - 消费方编排扩展(卡③契约3机制零重构): _confirm_consumer新增gate/gate_new/campfire_leave三消费方+_on_confirm_secondary次确认分派——继续接现役续玩编排(_resume_from_menu同源)/开始接现役开局编排(_start_adventure同源)/冒险发起后营地场景屏隐藏(presenter.on_camp_closed关层收闭=营地与选档层同收+开始层恢复,T3已建);main_ui_build补secondary_confirmed接线 - 篝火动线: 二次确认(camp.md v2.2裁定走ConfirmDialog先例)→确认离场=on_camp_closed;命中只火堆已随T2布局表(560,640,160,80) - _refresh_resume_button不复用(随卡②删——大门两分支直读has_breakpoint无钮可刷);终局落点不变量T0互证=现役终局continue回主菜单不改 - main.gd零新增成员(分派扩match臂+新方法,15/15保持) - 验证: 全流程孤检绿(10项:篝火cancel/confirm/大门无断点cancel/confirm/次钮隐藏/三钮形态/次确认开局/主确认续玩no-op——临时件不入库,T5探针承载正式验收);S9/S10/S13归基线
79 lines
2.7 KiB
GDScript
79 lines
2.7 KiB
GDScript
## VERTICAL SLICE - NOT FOR PRODUCTION
|
||
## 通用确认弹窗:open(text, confirm_label, cancel_label) 双钮外发 confirmed/cancelled;
|
||
## open_three(text, confirm_label, secondary_label, cancel_label) 三钮增设 secondary_confirmed
|
||
##(营地大门两分支——卡④ T4;双钮调用方零改动:次钮随 open 隐藏)。
|
||
## 文案与按钮语义装配归调用方——本类零业务触碰。
|
||
class_name ConfirmDialog
|
||
extends Control
|
||
|
||
signal confirmed
|
||
signal secondary_confirmed ## 次确认(三钮形态中钮——营地大门「开始新冒险」出口;卡④ T4)
|
||
signal cancelled
|
||
|
||
var _text: Label
|
||
var _confirm_btn: Button
|
||
var _secondary_btn: Button
|
||
var _cancel_btn: Button
|
||
|
||
|
||
func _init() -> void:
|
||
var box: VBoxContainer = UiKit.modal_shell(self, Color(UiKit.DIM, 0.55), Vector2(460, 0), 12,
|
||
UiKit.panel_skinned(Vector4(14, 12, 14, 12))).box
|
||
_text = UiKit.label("",UiKit.FS_BODY, false, UiKit.INK_TITLE)
|
||
_text.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
||
_text.custom_minimum_size = Vector2(430, 0)
|
||
box.add_child(_text)
|
||
box.add_child(HSeparator.new())
|
||
var btn_row := HBoxContainer.new()
|
||
btn_row.add_theme_constant_override("separation", 12)
|
||
btn_row.alignment = BoxContainer.ALIGNMENT_CENTER
|
||
box.add_child(btn_row)
|
||
_cancel_btn = UiKit.button("取消")
|
||
_cancel_btn.pressed.connect(_emit_cancelled)
|
||
btn_row.add_child(_cancel_btn)
|
||
_secondary_btn = UiKit.button("次选项")
|
||
_secondary_btn.pressed.connect(_emit_secondary)
|
||
btn_row.add_child(_secondary_btn)
|
||
_confirm_btn = UiKit.button("确认")
|
||
_confirm_btn.pressed.connect(_emit_confirmed)
|
||
btn_row.add_child(_confirm_btn)
|
||
visible = false
|
||
|
||
|
||
func open(text: String, confirm_label: String, cancel_label: String = "取消") -> void:
|
||
_text.text = text
|
||
_confirm_btn.text = confirm_label
|
||
_cancel_btn.text = cancel_label
|
||
_secondary_btn.visible = false # 双钮形态(次钮隐藏——既有调用方零改动)
|
||
# z 序纪律:层序唯一事实源=main.LAYER_CONTRACT(树序与登记序同源派生);开合单口
|
||
# 归组合根 ModalFlow(挂起兜底/遮挡记账/开侧同步)——本类只管文案与显示,不自行抬层
|
||
|
||
visible = true
|
||
|
||
|
||
## 三钮形态(营地大门有断点分支——继续上一段冒险/开始新冒险/取消;Q5 裁甲)
|
||
func open_three(text: String, confirm_label: String, secondary_label: String, cancel_label: String) -> void:
|
||
open(text, confirm_label, cancel_label)
|
||
_secondary_btn.text = secondary_label
|
||
_secondary_btn.visible = true
|
||
|
||
|
||
func close() -> void:
|
||
visible = false
|
||
|
||
|
||
func is_open() -> bool:
|
||
return visible
|
||
|
||
|
||
func _emit_confirmed() -> void:
|
||
confirmed.emit()
|
||
|
||
|
||
func _emit_secondary() -> void:
|
||
secondary_confirmed.emit()
|
||
|
||
|
||
func _emit_cancelled() -> void:
|
||
cancelled.emit()
|