新增: 星座运势+AI资讯+知识卡片+桌面设置窗口+秒显示开关
- 星座运势: 天聚数行API集成,5维进度条+幸运标签+今日概述 - AI资讯: 天聚数行API,图文布局5条展示,文件缓存2小时刷新 - 知识卡片: AI生成,关键字+提示词配置,30分钟刷新 - 桌面设置: 独立WebView2窗口,760x1350,含壁纸/布局/城市/颜色等配置 - 显示控制: 壁纸/时间/天气/星座/知识/AI资讯独立开关,秒显示开关 - 文件缓存: 星座运势+AI资讯缓存到本地,启动即显示上次数据 - initDone防抖: 防止设置窗口初始化触发卡片重载
This commit is contained in:
288
systray.go
288
systray.go
@@ -15,296 +15,19 @@ import (
|
||||
"github.com/jchv/go-webview2"
|
||||
)
|
||||
|
||||
var zodiacItems []*systray.MenuItem
|
||||
var cityItems []*systray.MenuItem
|
||||
var themeItems []*systray.MenuItem
|
||||
|
||||
var themeNames = []struct {
|
||||
Name ThemeName
|
||||
Label string
|
||||
}{
|
||||
{ThemeAurora, "极光"},
|
||||
{ThemeStar, "星空"},
|
||||
{ThemeGradient, "渐变"},
|
||||
{ThemeParticle, "粒子"},
|
||||
{ThemeFractal, "极光流体"},
|
||||
{ThemeText, "文字"},
|
||||
}
|
||||
|
||||
func onSystrayReady() {
|
||||
systray.SetIcon(generateIcon())
|
||||
systray.SetTooltip("动态壁纸引擎")
|
||||
|
||||
cfg := loadConfig()
|
||||
|
||||
mPause := systray.AddMenuItem("暂停", "暂停/继续")
|
||||
systray.AddSeparator()
|
||||
|
||||
// 布局
|
||||
mLayout := systray.AddMenuItem("布局设置", "")
|
||||
mLayoutSingle := mLayout.AddSubMenuItem("合并卡片", "")
|
||||
mLayoutMulti := mLayout.AddSubMenuItem("独立卡片", "")
|
||||
if cfg.Layout == LayoutMulti {
|
||||
mLayoutMulti.Check()
|
||||
} else {
|
||||
mLayoutSingle.Check()
|
||||
}
|
||||
|
||||
systray.AddSeparator()
|
||||
|
||||
// 壁纸主题
|
||||
mTheme := systray.AddMenuItem("壁纸主题", "")
|
||||
for _, t := range themeNames {
|
||||
item := mTheme.AddSubMenuItem(t.Label, t.Label)
|
||||
if cfg.WallpaperType == WPTheme && cfg.Theme == t.Name {
|
||||
item.Check()
|
||||
}
|
||||
themeItems = append(themeItems, item)
|
||||
}
|
||||
mLocalImage := systray.AddMenuItem("本地图片", "选择本地图片作为壁纸")
|
||||
mBingMenu := systray.AddMenuItem("Bing 每日壁纸", "")
|
||||
mBingEnable := mBingMenu.AddSubMenuItem("启用 Bing 壁纸", "")
|
||||
mBingPrev := mBingMenu.AddSubMenuItem("◀ 上一个", "")
|
||||
mBingNext := mBingMenu.AddSubMenuItem("下一个 ▶", "")
|
||||
mBingFav := mBingMenu.AddSubMenuItem("★ 收藏当前壁纸", "")
|
||||
mSolidColor := systray.AddMenuItem("纯色壁纸", "选择纯色壁纸")
|
||||
mGradientColor := systray.AddMenuItem("渐变壁纸", "选择渐变壁纸")
|
||||
|
||||
systray.AddSeparator()
|
||||
|
||||
// 星座
|
||||
mZodiac := systray.AddMenuItem("星座设置", "")
|
||||
zodiacs := []string{
|
||||
"白羊座", "金牛座", "双子座",
|
||||
"巨蟹座", "狮子座", "处女座",
|
||||
"天秤座", "天蝎座", "射手座",
|
||||
"摩羯座", "水瓶座", "双鱼座",
|
||||
}
|
||||
for _, z := range zodiacs {
|
||||
item := mZodiac.AddSubMenuItem(z, z)
|
||||
if z == cfg.Zodiac {
|
||||
item.Check()
|
||||
}
|
||||
zodiacItems = append(zodiacItems, item)
|
||||
}
|
||||
|
||||
systray.AddSeparator()
|
||||
|
||||
// 城市
|
||||
mCity := systray.AddMenuItem("城市设置", "")
|
||||
for _, c := range cities {
|
||||
item := mCity.AddSubMenuItem(c.Name, c.Adm1+" "+c.Name)
|
||||
if cfg.City == c.ID {
|
||||
item.Check()
|
||||
}
|
||||
cityItems = append(cityItems, item)
|
||||
}
|
||||
|
||||
systray.AddSeparator()
|
||||
mSettings := systray.AddMenuItem("桌面设置", "打开设置窗口")
|
||||
mRestart := systray.AddMenuItem("重启", "重启程序")
|
||||
mQuit := systray.AddMenuItem("退出", "退出程序")
|
||||
|
||||
// 布局切换
|
||||
// 设置窗口
|
||||
go func() {
|
||||
for {
|
||||
<-mLayoutSingle.ClickedCh
|
||||
cfg := loadConfig()
|
||||
cfg.Layout = LayoutSingle
|
||||
saveConfig(cfg)
|
||||
mLayoutSingle.Check()
|
||||
mLayoutMulti.Uncheck()
|
||||
reloadWallpaper()
|
||||
}
|
||||
}()
|
||||
go func() {
|
||||
for {
|
||||
<-mLayoutMulti.ClickedCh
|
||||
cfg := loadConfig()
|
||||
cfg.Layout = LayoutMulti
|
||||
saveConfig(cfg)
|
||||
mLayoutSingle.Uncheck()
|
||||
mLayoutMulti.Check()
|
||||
reloadWallpaper()
|
||||
}
|
||||
}()
|
||||
|
||||
// 主题切换监听
|
||||
for i, item := range themeItems {
|
||||
go func(idx int, mi *systray.MenuItem) {
|
||||
for {
|
||||
<-mi.ClickedCh
|
||||
cfg := loadConfig()
|
||||
cfg.WallpaperType = WPTheme
|
||||
cfg.Theme = themeNames[idx].Name
|
||||
saveConfig(cfg)
|
||||
for _, it := range themeItems {
|
||||
it.Uncheck()
|
||||
}
|
||||
mi.Check()
|
||||
log.Printf("主题切换: %s", themeNames[idx].Label)
|
||||
reloadWallpaper()
|
||||
}
|
||||
}(i, item)
|
||||
}
|
||||
|
||||
// 本地图片
|
||||
go func() {
|
||||
for {
|
||||
<-mLocalImage.ClickedCh
|
||||
path := openFileDialog(wvHwnd)
|
||||
if path == "" {
|
||||
continue
|
||||
}
|
||||
cfg := loadConfig()
|
||||
cfg.WallpaperType = WPImage
|
||||
cfg.ImagePath = path
|
||||
saveConfig(cfg)
|
||||
for _, it := range themeItems {
|
||||
it.Uncheck()
|
||||
}
|
||||
log.Printf("本地图片: %s", path)
|
||||
reloadWallpaper()
|
||||
}
|
||||
}()
|
||||
|
||||
// Bing 启用
|
||||
go func() {
|
||||
for {
|
||||
<-mBingEnable.ClickedCh
|
||||
cfg := loadConfig()
|
||||
cfg.WallpaperType = WPBing
|
||||
saveConfig(cfg)
|
||||
for _, it := range themeItems {
|
||||
it.Uncheck()
|
||||
}
|
||||
log.Println("切换 Bing 壁纸")
|
||||
go fetchBingHistory()
|
||||
}
|
||||
}()
|
||||
|
||||
// Bing 上一个
|
||||
go func() {
|
||||
for {
|
||||
<-mBingPrev.ClickedCh
|
||||
bingPrev()
|
||||
}
|
||||
}()
|
||||
|
||||
// Bing 下一个
|
||||
go func() {
|
||||
for {
|
||||
<-mBingNext.ClickedCh
|
||||
bingNext()
|
||||
}
|
||||
}()
|
||||
|
||||
// Bing 收藏
|
||||
go func() {
|
||||
for {
|
||||
<-mBingFav.ClickedCh
|
||||
title := bingToggleFavorite()
|
||||
if title != "" {
|
||||
mBingFav.SetTitle(title)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// 纯色壁纸
|
||||
go func() {
|
||||
for {
|
||||
<-mSolidColor.ClickedCh
|
||||
color := colorPickerDialog(wvHwnd, "")
|
||||
if color == "" {
|
||||
continue
|
||||
}
|
||||
cfg := loadConfig()
|
||||
cfg.WallpaperType = WPColor
|
||||
cfg.Color1 = color
|
||||
cfg.ColorGradient = false
|
||||
saveConfig(cfg)
|
||||
for _, it := range themeItems {
|
||||
it.Uncheck()
|
||||
}
|
||||
log.Printf("纯色壁纸: %s", color)
|
||||
reloadWallpaper()
|
||||
}
|
||||
}()
|
||||
|
||||
// 渐变壁纸
|
||||
go func() {
|
||||
for {
|
||||
<-mGradientColor.ClickedCh
|
||||
c1 := colorPickerDialog(wvHwnd, "")
|
||||
if c1 == "" {
|
||||
continue
|
||||
}
|
||||
c2 := colorPickerDialog(wvHwnd, "")
|
||||
if c2 == "" {
|
||||
c2 = "#16213e"
|
||||
}
|
||||
cfg := loadConfig()
|
||||
cfg.WallpaperType = WPColor
|
||||
cfg.Color1 = c1
|
||||
cfg.Color2 = c2
|
||||
cfg.ColorGradient = true
|
||||
saveConfig(cfg)
|
||||
for _, it := range themeItems {
|
||||
it.Uncheck()
|
||||
}
|
||||
log.Printf("渐变壁纸: %s -> %s", c1, c2)
|
||||
reloadWallpaper()
|
||||
}
|
||||
}()
|
||||
|
||||
// 星座选择监听
|
||||
for i, item := range zodiacItems {
|
||||
go func(idx int, mi *systray.MenuItem) {
|
||||
name := zodiacs[idx]
|
||||
for {
|
||||
<-mi.ClickedCh
|
||||
cfg := loadConfig()
|
||||
cfg.Zodiac = name
|
||||
saveConfig(cfg)
|
||||
for _, it := range zodiacItems {
|
||||
it.Uncheck()
|
||||
}
|
||||
mi.Check()
|
||||
evalJS(fmt.Sprintf(`window.userZodiac = %q; if(window.updateTime) updateTime();`, name))
|
||||
}
|
||||
}(i, item)
|
||||
}
|
||||
|
||||
// 城市选择监听
|
||||
for i, item := range cityItems {
|
||||
go func(idx int, mi *systray.MenuItem) {
|
||||
for {
|
||||
<-mi.ClickedCh
|
||||
city := cities[idx]
|
||||
cfg := loadConfig()
|
||||
cfg.City = city.ID
|
||||
saveConfig(cfg)
|
||||
for _, it := range cityItems {
|
||||
it.Uncheck()
|
||||
}
|
||||
mi.Check()
|
||||
go fetchAndPushWeather(city)
|
||||
}
|
||||
}(i, item)
|
||||
}
|
||||
|
||||
// 暂停
|
||||
go func() {
|
||||
for {
|
||||
<-mPause.ClickedCh
|
||||
newVal := 1 - atomic.LoadInt32(&paused)
|
||||
atomic.StoreInt32(&paused, newVal)
|
||||
isPaused := newVal == 1
|
||||
if isPaused {
|
||||
mPause.SetTitle("继续")
|
||||
} else {
|
||||
mPause.SetTitle("暂停")
|
||||
}
|
||||
evalJS("if(window.setPaused) setPaused(" + strconv.FormatBool(isPaused) + ")")
|
||||
<-mSettings.ClickedCh
|
||||
openSettingsWindow()
|
||||
}
|
||||
}()
|
||||
|
||||
@@ -326,7 +49,10 @@ func onSystrayReady() {
|
||||
|
||||
go startWebView()
|
||||
go weatherLoop()
|
||||
go horoscopeLoop()
|
||||
go aiNewsLoop()
|
||||
go bingWallpaperLoop()
|
||||
go knowledgeLoop()
|
||||
}
|
||||
|
||||
func startWebView() {
|
||||
|
||||
Reference in New Issue
Block a user