/ internal / desktop / theme_manager.go
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  }