Initial GoWallpaper implementation
This commit is contained in:
+113
@@ -0,0 +1,113 @@
|
||||
//go:build windows
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/lxn/walk"
|
||||
. "github.com/lxn/walk/declarative"
|
||||
)
|
||||
|
||||
var styleOptions = []struct {
|
||||
Label string
|
||||
Value string
|
||||
}{
|
||||
{"保持 Windows 当前设置", "keep"},
|
||||
{"填充", "fill"},
|
||||
{"适应", "fit"},
|
||||
{"拉伸", "stretch"},
|
||||
{"平铺", "tile"},
|
||||
{"居中", "center"},
|
||||
{"跨区", "span"},
|
||||
}
|
||||
|
||||
func (a *App) showSettings() {
|
||||
var dlg *walk.Dialog
|
||||
var apiEdit, intervalEdit, cacheEdit *walk.LineEdit
|
||||
var autoCheck, startupCheck *walk.CheckBox
|
||||
var styleCombo *walk.ComboBox
|
||||
|
||||
labels := make([]string, len(styleOptions))
|
||||
styleIndex := 0
|
||||
for i, option := range styleOptions {
|
||||
labels[i] = option.Label
|
||||
if option.Value == a.config.WallpaperStyle {
|
||||
styleIndex = i
|
||||
}
|
||||
}
|
||||
|
||||
_, err := Dialog{
|
||||
AssignTo: &dlg,
|
||||
Title: "GoWallpaper 设置",
|
||||
MinSize: Size{520, 300},
|
||||
Layout: VBox{MarginsZero: false},
|
||||
Children: []Widget{
|
||||
Label{Text: "随机图片 API 地址(HTTP GET 直接返回图片)"},
|
||||
LineEdit{AssignTo: &apiEdit, Text: a.config.APIURL},
|
||||
Composite{
|
||||
Layout: Grid{Columns: 2},
|
||||
Children: []Widget{
|
||||
CheckBox{AssignTo: &autoCheck, Text: "启用自动切换", Checked: a.config.AutoChangeEnabled},
|
||||
CheckBox{AssignTo: &startupCheck, Text: "开机自动启动", Checked: a.config.StartWithWindows},
|
||||
Label{Text: "自动切换间隔(分钟)"},
|
||||
LineEdit{AssignTo: &intervalEdit, Text: strconv.Itoa(a.config.IntervalMinutes)},
|
||||
Label{Text: "最多保留缓存图片数"},
|
||||
LineEdit{AssignTo: &cacheEdit, Text: strconv.Itoa(a.config.MaxCacheCount)},
|
||||
Label{Text: "壁纸显示方式"},
|
||||
ComboBox{AssignTo: &styleCombo, Model: labels, CurrentIndex: styleIndex},
|
||||
},
|
||||
},
|
||||
VSpacer{},
|
||||
Composite{
|
||||
Layout: HBox{},
|
||||
Children: []Widget{
|
||||
HSpacer{},
|
||||
PushButton{Text: "保存", OnClicked: func() {
|
||||
interval, parseErr := parsePositiveInt(intervalEdit.Text(), "自动切换间隔")
|
||||
if parseErr != nil {
|
||||
walk.MsgBox(dlg, "设置无效", parseErr.Error(), walk.MsgBoxIconWarning)
|
||||
return
|
||||
}
|
||||
maxCache, parseErr := parsePositiveInt(cacheEdit.Text(), "缓存数量")
|
||||
if parseErr != nil {
|
||||
walk.MsgBox(dlg, "设置无效", parseErr.Error(), walk.MsgBoxIconWarning)
|
||||
return
|
||||
}
|
||||
index := styleCombo.CurrentIndex()
|
||||
if index < 0 || index >= len(styleOptions) {
|
||||
index = 0
|
||||
}
|
||||
cfg := Config{
|
||||
APIURL: strings.TrimSpace(apiEdit.Text()),
|
||||
AutoChangeEnabled: autoCheck.Checked(),
|
||||
IntervalMinutes: interval,
|
||||
MaxCacheCount: maxCache,
|
||||
WallpaperStyle: styleOptions[index].Value,
|
||||
StartWithWindows: startupCheck.Checked(),
|
||||
}
|
||||
if err := a.applyConfig(cfg); err != nil {
|
||||
walk.MsgBox(dlg, "保存失败", err.Error(), walk.MsgBoxIconError)
|
||||
return
|
||||
}
|
||||
dlg.Accept()
|
||||
}},
|
||||
PushButton{Text: "取消", OnClicked: func() { dlg.Cancel() }},
|
||||
},
|
||||
},
|
||||
},
|
||||
}.Run(a.mw)
|
||||
if err != nil {
|
||||
a.notifyError("无法打开设置窗口:" + err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func parsePositiveInt(value, field string) (int, error) {
|
||||
n, err := strconv.Atoi(strings.TrimSpace(value))
|
||||
if err != nil || n <= 0 {
|
||||
return 0, fmt.Errorf("%s必须是大于 0 的整数", field)
|
||||
}
|
||||
return n, nil
|
||||
}
|
||||
Reference in New Issue
Block a user