theme_manager.go
1 package desktop 2 3 import ( 4 "image/color" 5 6 "fyne.io/fyne/v2" 7 "fyne.io/fyne/v2/canvas" 8 "fyne.io/fyne/v2/container" 9 "fyne.io/fyne/v2/widget" 10 ) 11 12 // ThemeManager 主题管理器 13 type ThemeManager struct { 14 app fyne.App 15 window fyne.Window 16 theme *customTheme 17 isDarkMode bool 18 callbacks []func(bool) 19 } 20 21 // NewThemeManager 创建主题管理器 22 func NewThemeManager(app fyne.App, window fyne.Window) *ThemeManager { 23 theme := NewCustomTheme(ThemeModeLight).(*customTheme) 24 app.Settings().SetTheme(theme) 25 26 return &ThemeManager{ 27 app: app, 28 window: window, 29 theme: theme, 30 isDarkMode: false, 31 callbacks: make([]func(bool), 0), 32 } 33 } 34 35 // IsDarkMode 检查是否为夜晚模式 36 func (tm *ThemeManager) IsDarkMode() bool { 37 return tm.isDarkMode 38 } 39 40 // ToggleTheme 切换主题 41 func (tm *ThemeManager) ToggleTheme() { 42 tm.isDarkMode = !tm.isDarkMode 43 44 if tm.isDarkMode { 45 tm.theme.SetThemeMode(ThemeModeDark) 46 } else { 47 tm.theme.SetThemeMode(ThemeModeLight) 48 } 49 50 // 更新应用主题 51 tm.app.Settings().SetTheme(tm.theme) 52 53 for _, callback := range tm.callbacks { 54 callback(tm.isDarkMode) 55 } 56 57 tm.window.Canvas().Refresh(tm.window.Content()) 58 } 59 60 // AddThemeChangeCallback 添加主题变化回调 61 func (tm *ThemeManager) AddThemeChangeCallback(callback func(bool)) { 62 tm.callbacks = append(tm.callbacks, callback) 63 } 64 65 // CreateGlassmorphismCard 创建毛玻璃卡片(主题感知) 66 func (tm *ThemeManager) CreateGlassmorphismCard(title, subtitle string, content fyne.CanvasObject) *fyne.Container { 67 return GlassmorphismCard(title, subtitle, content, tm.isDarkMode) 68 } 69 70 // CreateModernCard 创建现代卡片(主题感知) 71 func (tm *ThemeManager) CreateModernCard(title string, content fyne.CanvasObject) *fyne.Container { 72 return ModernCard(title, content, tm.isDarkMode) 73 } 74 75 // CreateTransparentCard 创建透明卡片(主题感知) 76 func (tm *ThemeManager) CreateTransparentCard(content fyne.CanvasObject) *fyne.Container { 77 return TransparentCard(content, tm.isDarkMode) 78 } 79 80 // CreateThemeToggleButton 创建主题切换按钮 81 func (tm *ThemeManager) CreateThemeToggleButton() *fyne.Container { 82 var themeToggleBtn *widget.Button 83 84 updateButton := func() { 85 if tm.isDarkMode { 86 themeToggleBtn.SetText("明亮模式") 87 } else { 88 themeToggleBtn.SetText("夜晚模式") 89 } 90 themeToggleBtn.Refresh() 91 } 92 93 themeToggleBtn = ThemeToggleButton(tm.isDarkMode, func() { 94 tm.ToggleTheme() 95 updateButton() 96 }) 97 98 // 添加主题变化回调来更新按钮文本 99 tm.AddThemeChangeCallback(func(isDark bool) { 100 updateButton() 101 }) 102 103 return container.NewPadded(themeToggleBtn) 104 } 105 106 // CreateGlassmorphismBackground 创建毛玻璃背景 107 func (tm *ThemeManager) CreateGlassmorphismBackground() *canvas.Rectangle { 108 var bgColor color.Color 109 var borderColor color.Color 110 111 if tm.isDarkMode { 112 bgColor = color.NRGBA{R: 30, G: 41, B: 59, A: 180} 113 borderColor = color.NRGBA{R: 51, G: 65, B: 85, A: 100} 114 } else { 115 bgColor = color.NRGBA{R: 255, G: 255, B: 255, A: 180} 116 borderColor = color.NRGBA{R: 209, G: 213, B: 219, A: 100} 117 } 118 119 background := canvas.NewRectangle(bgColor) 120 background.CornerRadius = 16 121 background.StrokeColor = borderColor 122 background.StrokeWidth = 1 123 124 return background 125 } 126 127 // CreateTransparentBackground 创建透明背景 128 func (tm *ThemeManager) CreateTransparentBackground() *canvas.Rectangle { 129 var bgColor color.Color 130 var borderColor color.Color 131 132 if tm.isDarkMode { 133 bgColor = color.NRGBA{R: 30, G: 41, B: 59, A: 120} 134 borderColor = color.NRGBA{R: 51, G: 65, B: 85, A: 80} 135 } else { 136 bgColor = color.NRGBA{R: 255, G: 255, B: 255, A: 120} 137 borderColor = color.NRGBA{R: 209, G: 213, B: 219, A: 80} 138 } 139 140 background := canvas.NewRectangle(bgColor) 141 background.CornerRadius = 12 142 background.StrokeColor = borderColor 143 background.StrokeWidth = 1 144 145 return background 146 } 147 148 // CreateGradientBackground 创建渐变背景 149 func (tm *ThemeManager) CreateGradientBackground() *canvas.LinearGradient { 150 var startColor, endColor color.Color 151 152 if tm.isDarkMode { 153 startColor = color.NRGBA{R: 15, G: 23, B: 42, A: 255} 154 endColor = color.NRGBA{R: 30, G: 41, B: 59, A: 255} 155 } else { 156 startColor = color.NRGBA{R: 248, G: 250, B: 252, A: 255} 157 endColor = color.NRGBA{R: 241, G: 245, B: 249, A: 255} 158 } 159 160 return canvas.NewLinearGradient(startColor, endColor, 0.0) 161 } 162 163 // UpdateAllComponents 更新所有组件 164 func (tm *ThemeManager) UpdateAllComponents() { 165 tm.window.Canvas().Refresh(tm.window.Content()) 166 }