69 lines
2.1 KiB
Go
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)
|
|
}
|