package ui import ( "image/color" "fyne.io/fyne/v2" "fyne.io/fyne/v2/theme" ) // lookupColor 从当前主题取色。 func lookupColor(name fyne.ThemeColorName) color.Color { if app := fyne.CurrentApp(); app != nil { s := app.Settings() return s.Theme().Color(name, s.ThemeVariant()) } return theme.DefaultTheme().Color(name, theme.VariantDark) } // withAlpha 调整颜色透明度。 func withAlpha(c color.Color, a uint8) color.Color { n := color.NRGBAModel.Convert(c).(color.NRGBA) n.A = a return n } // mix 按比例把 b 混进 a,用来按前景/背景派生灰度层级。 // 这样气泡底色永远跟着主题走,文字与底色对比也始终够。 func mix(a, b color.Color, t float32) color.Color { an := color.NRGBAModel.Convert(a).(color.NRGBA) bn := color.NRGBAModel.Convert(b).(color.NRGBA) blend := func(x, y uint8) uint8 { return uint8(float32(x) + (float32(y)-float32(x))*t) } return color.NRGBA{ R: blend(an.R, bn.R), G: blend(an.G, bn.G), B: blend(an.B, bn.B), A: 0xFF, } } // 界面配色集中在这里,方便统一调整。 // 所有颜色都从当前主题派生,因此黑白主题下自动变成纯灰度。 // colorUserBubble 是用户气泡:比助手气泡略深一层,文字仍是前景色。 func colorUserBubble() color.Color { return mix(lookupColor(theme.ColorNameBackground), lookupColor(theme.ColorNameForeground), 0.18) } // colorBotBubble 是助手气泡:贴着画布底色,只比背景亮一点点。 func colorBotBubble() color.Color { return mix(lookupColor(theme.ColorNameBackground), lookupColor(theme.ColorNameForeground), 0.06) } // colorErrBubble 是提示/错误气泡:中等灰度,靠边框区分。 func colorErrBubble() color.Color { return mix(lookupColor(theme.ColorNameBackground), lookupColor(theme.ColorNameForeground), 0.10) } // colorBorder 是气泡描边。 func colorBorder() color.Color { return mix(lookupColor(theme.ColorNameBackground), lookupColor(theme.ColorNameForeground), 0.45) } // colorStrongBorder 是需要格外醒目的描边(错误提示用)。 func colorStrongBorder() color.Color { return lookupColor(theme.ColorNameForeground) }