Files
u-desktop/config.go
绝尘 8e7ec8424d 新增: 相册展示模块(左侧幻灯片+进度条+目录选择)
- 左侧固定卡片展示照片幻灯片,淡入淡出切换
- 进度条动画显示当前照片剩余时间
- 设置窗口支持选择图片目录和切换间隔(5/10/15/20/30/60秒)
- Win32 SHBrowseForFolderW 目录选择对话框
- Go 端管理幻灯片状态,按间隔推送照片 data URI
2026-05-26 04:45:58 +08:00

146 lines
3.5 KiB
Go

package main
import (
"bytes"
"encoding/binary"
"encoding/json"
"image"
"image/color"
"image/png"
"os"
"path/filepath"
)
type WallpaperType string
const (
WPTheme WallpaperType = "theme"
WPImage WallpaperType = "image"
WPBing WallpaperType = "bing"
WPColor WallpaperType = "color"
)
type Layout string
const (
LayoutSingle Layout = "single"
LayoutMulti Layout = "multi"
)
type ThemeName string
const (
ThemeAurora ThemeName = "aurora"
ThemeStar ThemeName = "starfield"
ThemeGradient ThemeName = "gradient"
ThemeParticle ThemeName = "particles"
ThemeFractal ThemeName = "fractal"
ThemeText ThemeName = "text"
)
type SavedColor struct {
Color1 string `json:"color1"`
Color2 string `json:"color2"`
Gradient bool `json:"gradient"`
}
type Config struct {
Zodiac string `json:"zodiac"`
City string `json:"city"`
WallpaperType WallpaperType `json:"wallpaperType"`
Theme ThemeName `json:"theme"`
ImagePath string `json:"imagePath"`
Color1 string `json:"color1"`
Color2 string `json:"color2"`
ColorGradient bool `json:"colorGradient"`
WallpaperText string `json:"wallpaperText"`
Layout Layout `json:"layout"`
HideWallpaper bool `json:"hideWallpaper"`
HideTime bool `json:"hideTime"`
HideWeather bool `json:"hideWeather"`
HideZodiac bool `json:"hideZodiac"`
HideAINews bool `json:"hideAINews"`
ShowSeconds bool `json:"showSeconds"`
PhotoDir string `json:"photoDir"`
PhotoInterval int `json:"photoInterval"`
KnowledgeKeyword string `json:"knowledgeKeyword"`
KnowledgePrompt string `json:"knowledgePrompt"`
HideKnowledge bool `json:"hideKnowledge"`
SavedColors []SavedColor `json:"savedColors"`
BingAutoRefresh bool `json:"bingAutoRefresh"`
}
const defaultZodiac = "射手座"
var configPath string
func configDir() string {
return filepath.Dir(configPath)
}
func loadConfig() *Config {
data, err := os.ReadFile(configPath)
if err != nil {
return defaultConfig()
}
var cfg Config
if json.Unmarshal(data, &cfg) != nil {
return defaultConfig()
}
if cfg.Zodiac == "" {
cfg.Zodiac = defaultZodiac
}
if cfg.WallpaperType == "" {
cfg.WallpaperType = WPTheme
}
if cfg.Theme == "" {
cfg.Theme = ThemeAurora
}
if cfg.Color1 == "" {
cfg.Color1 = "#1a1a2e"
}
if cfg.Layout == "" {
cfg.Layout = LayoutSingle
}
return &cfg
}
func defaultConfig() *Config {
return &Config{
Zodiac: defaultZodiac,
WallpaperType: WPTheme,
Theme: ThemeAurora,
Color1: "#1a1a2e",
Color2: "#16213e",
}
}
func saveConfig(cfg *Config) error {
data, _ := json.MarshalIndent(cfg, "", " ")
return os.WriteFile(configPath, data, 0644)
}
func generateIcon() []byte {
img := image.NewRGBA(image.Rect(0, 0, 16, 16))
c := color.RGBA{R: 88, G: 101, B: 242, A: 255}
for y := 0; y < 16; y++ {
for x := 0; x < 16; x++ {
img.Set(x, y, c)
}
}
var buf bytes.Buffer
png.Encode(&buf, img)
pngData := buf.Bytes()
ico := make([]byte, 22+len(pngData))
binary.LittleEndian.PutUint16(ico[0:], 0)
binary.LittleEndian.PutUint16(ico[2:], 1)
binary.LittleEndian.PutUint16(ico[4:], 1)
ico[6], ico[7], ico[8], ico[9] = 16, 16, 0, 0
binary.LittleEndian.PutUint16(ico[10:], 1)
binary.LittleEndian.PutUint16(ico[12:], 32)
binary.LittleEndian.PutUint32(ico[14:], uint32(len(pngData)))
binary.LittleEndian.PutUint32(ico[18:], 22)
copy(ico[22:], pngData)
return ico
}