feat(迭代26 T1): 按钮五态矩阵——悬停乙案/禁用甲案/焦点甲案+危险钮本族按压态

- ui_kit.gd _apply_button_skin 五态统一管线:hover=常态图+modulate 1.06 提亮(乙案·代拍板1·零新素材);
  disabled=本族底+α0.45 幽灵化(甲案·代拍板2,取代旧「disabled=按压图」错配);
  focus=INK 2px 内缩 1px 环(甲案·代拍板3,负 expand margin 实现,叠加绘制不遮钮底,主题层零新增)
- primary_button 补 disabled(烛光黄族 α0.45)+focus 环+font_disabled_color(本族墨 α0.45)
- danger_button 补本族 pressed(深红 darkened(0.18) 深档)+disabled 幽灵化+focus 环+font_focus/disabled 色
- 冒烟新增 _smoke_button_five_states() 35 断言(V1 五态非空/hover≠normal/disabled≠pressed/危险钮非石纹/
  焦点环参数锚定+V2 双红线维持);冒烟 987→1022/0;probe --click 全绿残留 0
This commit is contained in:
DKChan committed 2026-10-14 05:08:42 +08:00
1 parent 04ec2175b1
commit b6f0c66183
2 files changed
+111 -4

No files matched your search

+36 -4
View File
@@ -537,22 +537,43 @@ static func keystone_badge(text: String, icon_path := TEX_ICON_KEYSTONE, icon_px
return KeystoneBadge.new(text, icon_path, icon_px)
# 按钮皮(常态/按压两态+墨字——缺位 = 引擎默认主题,素材批前逐位一致)
# 按钮皮·五态矩阵(迭代 26 T1——UI 交互与观感批;甲/乙案值=grilling 两轮八裁落文,逐实例 override 不动主题层)
# 悬停=乙案:常态图+modulate 提亮(0.06 档与 primary_button 现行 lightened(0.06) 同纪律,零新素材);
# 禁用=甲案:本族底+α0.45 幽灵化(与 font_disabled_color 同纪律),取代旧「disabled=按压图」错配;
# 焦点=甲案:INK 2px 内缩 1px 环(与 font_focus_color=INK 同源;引擎 focus 样式盒叠加绘制,不遮钮底)
const BUTTON_HOVER_LIFT := Color(1.06, 1.06, 1.06, 1.0) # 悬停提亮档(modulate 乘数>1=中间调提亮,高光像素封顶不漂)
const BUTTON_GHOST_ALPHA := 0.45 # 禁用幽灵化 α(与文字禁用同档)
const BUTTON_FOCUS_RING_W := 2.0 # 焦点环宽 px
const BUTTON_FOCUS_RING_INSET := 1.0 # 焦点环内缩 px(负 expand margin 实现)
static func _focus_ring_sb() -> StyleBoxFlat:
var sb := StyleBoxFlat.new()
sb.bg_color = Color(0, 0, 0, 0)
sb.draw_center = false
sb.set_border_width_all(BUTTON_FOCUS_RING_W)
sb.border_color = INK
sb.set_expand_margin_all(-BUTTON_FOCUS_RING_INSET)
return sb
# 按钮皮(五态统一管线——常态/悬停/按压/禁用/焦点+墨字;缺位素材 = 引擎默认主题)
static func _apply_button_skin(b: Button) -> void:
var tex_n := load_tex(TEX_BUTTON_STONE)
if tex_n == null:
return
var tex_p := load_tex(TEX_BUTTON_STONE_PRESSED)
b.add_theme_stylebox_override("normal", _tex_sb(tex_n, 8.0))
b.add_theme_stylebox_override("hover", _tex_sb(tex_n, 8.0))
b.add_theme_stylebox_override("hover", _tex_sb(tex_n, 8.0, BUTTON_HOVER_LIFT))
if tex_p != null:
b.add_theme_stylebox_override("pressed", _tex_sb(tex_p, 8.0))
b.add_theme_stylebox_override("disabled", _tex_sb(tex_p, 8.0))
b.add_theme_stylebox_override("disabled",
_tex_sb(tex_n, 8.0, Color(1, 1, 1, BUTTON_GHOST_ALPHA)))
b.add_theme_stylebox_override("focus", _focus_ring_sb())
b.add_theme_color_override("font_color", INK)
b.add_theme_color_override("font_hover_color", INK)
b.add_theme_color_override("font_pressed_color", INK)
b.add_theme_color_override("font_focus_color", INK)
b.add_theme_color_override("font_disabled_color", Color(INK, 0.45))
b.add_theme_color_override("font_disabled_color", Color(INK, BUTTON_GHOST_ALPHA))
# ── UI 落码批 M10 公共件(2026-10-04——bcard 竖卡工厂/拨杆开关/样式滑杆/动词按钮/tooltip 主题;
@@ -578,10 +599,14 @@ static func primary_button(text: String, tip := "") -> Button:
b.add_theme_stylebox_override("normal", sb)
b.add_theme_stylebox_override("hover", panel_flat(CANDLE.lightened(0.06), Color8(110, 69, 52),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("pressed", panel_flat(Color8(214, 172, 88), Color8(110, 69, 52),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("disabled",
panel_flat(Color(CANDLE, BUTTON_GHOST_ALPHA), Color(Color8(110, 69, 52), BUTTON_GHOST_ALPHA), RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("focus", _focus_ring_sb())
b.add_theme_color_override("font_color", Color8(58, 42, 8))
b.add_theme_color_override("font_hover_color", Color8(58, 42, 8))
b.add_theme_color_override("font_pressed_color", Color8(58, 42, 8))
b.add_theme_color_override("font_focus_color", Color8(58, 42, 8))
b.add_theme_color_override("font_disabled_color", Color(Color8(58, 42, 8), BUTTON_GHOST_ALPHA))
if tip != "":
b.tooltip_text = tip
return b
@@ -593,9 +618,16 @@ static func danger_button(text: String, tip := "", min_w := 216.0) -> Button:
var sb := panel_flat(Color8(180, 78, 54), Color8(110, 42, 28),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2))
b.add_theme_stylebox_override("normal", sb)
b.add_theme_stylebox_override("hover", panel_flat(Color8(196, 90, 62), Color8(110, 42, 28),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("pressed",
panel_flat(Color8(180, 78, 54).darkened(0.18), Color8(110, 42, 28),RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("disabled",
panel_flat(Color(Color8(180, 78, 54), BUTTON_GHOST_ALPHA), Color(Color8(110, 42, 28), BUTTON_GHOST_ALPHA), RADIUS_OBJECT, 2, Vector4(10, 2, 10, 2)))
b.add_theme_stylebox_override("focus", _focus_ring_sb())
b.add_theme_color_override("font_color", Color8(255, 244, 224))
b.add_theme_color_override("font_hover_color", Color8(255, 244, 224))
b.add_theme_color_override("font_pressed_color", Color8(255, 244, 224))
b.add_theme_color_override("font_focus_color", Color8(255, 244, 224))
b.add_theme_color_override("font_disabled_color", Color(Color8(255, 244, 224), BUTTON_GHOST_ALPHA))
if tip != "":
b.tooltip_text = tip
return b