Files
2026-10-28 08:47:09 +08:00

69 lines
2.1 KiB
Go

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)
}