127 lines
2.7 KiB
Go
127 lines
2.7 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 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"`
|
|
}
|
|
|
|
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
|
|
}
|