add: settings page

This commit is contained in:
2026-02-05 00:00:29 +08:00
parent f7a881358f
commit e862f8deec
18 changed files with 345 additions and 121 deletions

View File

@@ -6,6 +6,7 @@ import (
"path/filepath"
"sync"
"github.com/google/uuid"
"github.com/spf13/viper"
)
@@ -19,9 +20,15 @@ type WindowState struct {
}
type Config struct {
mu sync.RWMutex
v *viper.Viper
mu sync.RWMutex
WindowState WindowState `mapstructure:"window_state"`
ID string `mapstructure:"id"`
SavePath string `mapstructure:"save_path"`
HostName string `mapstructure:"host_name"`
AutoAccept bool `mapstructure:"auto_accept"`
SaveHistory bool `mapstructure:"save_history"`
}
// 默认窗口配置
@@ -32,7 +39,7 @@ var defaultWindowState = WindowState{
Y: -1,
}
func getConfigDir() string {
func GetConfigDir() string {
configPath, err := os.UserConfigDir()
if err != nil {
configPath = "/tmp"
@@ -40,7 +47,7 @@ func getConfigDir() string {
return filepath.Join(configPath, "mesh-drop")
}
func getUserHomeDir() string {
func GetUserHomeDir() string {
home, err := os.UserHomeDir()
if err != nil {
return "/tmp"
@@ -50,7 +57,8 @@ func getUserHomeDir() string {
// New 读取配置
func Load() *Config {
configDir := getConfigDir()
v := viper.New()
configDir := GetConfigDir()
err := os.MkdirAll(configDir, 0755)
if err != nil {
slog.Error("Failed to create config directory", "error", err)
@@ -58,15 +66,21 @@ func Load() *Config {
configFile := filepath.Join(configDir, "config.json")
// 设置默认值
defaultSavePath := filepath.Join(getUserHomeDir(), "Downloads")
viper.SetDefault("window_state", defaultWindowState)
viper.SetDefault("save_path", defaultSavePath)
defaultSavePath := filepath.Join(GetUserHomeDir(), "Downloads")
v.SetDefault("window_state", defaultWindowState)
v.SetDefault("save_path", defaultSavePath)
defaultHostName, err := os.Hostname()
if err != nil {
defaultHostName = "localhost"
}
v.SetDefault("host_name", defaultHostName)
v.SetDefault("id", uuid.New().String())
viper.SetConfigFile(configFile)
viper.SetConfigType("json")
v.SetConfigFile(configFile)
v.SetConfigType("json")
// 尝试读取配置
if err := viper.ReadInConfig(); err != nil {
if err := v.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
slog.Info("Config file not found, using defaults")
} else {
@@ -75,10 +89,12 @@ func Load() *Config {
}
var config Config
if err := viper.Unmarshal(&config); err != nil {
if err := v.Unmarshal(&config); err != nil {
slog.Error("Failed to unmarshal config", "error", err)
}
config.v = v
return &config
}
@@ -87,12 +103,12 @@ func (c *Config) Save() error {
c.mu.RLock()
defer c.mu.RUnlock()
configDir := getConfigDir()
configDir := GetConfigDir()
if err := os.MkdirAll(configDir, 0755); err != nil {
return err
}
if err := viper.WriteConfig(); err != nil {
if err := c.v.WriteConfig(); err != nil {
slog.Error("Failed to write config", "error", err)
return err
}
@@ -106,7 +122,8 @@ func (c *Config) SetSavePath(savePath string) {
defer c.mu.Unlock()
c.SavePath = savePath
viper.Set("save_path", savePath)
c.v.Set("save_path", savePath)
_ = os.MkdirAll(savePath, 0755)
}
func (c *Config) GetSavePath() string {
@@ -114,3 +131,48 @@ func (c *Config) GetSavePath() string {
defer c.mu.RUnlock()
return c.SavePath
}
func (c *Config) SetHostName(hostName string) {
c.mu.Lock()
defer c.mu.Unlock()
c.HostName = hostName
c.v.Set("host_name", hostName)
}
func (c *Config) GetHostName() string {
c.mu.RLock()
defer c.mu.RUnlock()
return c.HostName
}
func (c *Config) GetID() string {
c.mu.RLock()
defer c.mu.RUnlock()
return c.ID
}
func (c *Config) SetAutoAccept(autoAccept bool) {
c.mu.Lock()
defer c.mu.Unlock()
c.AutoAccept = autoAccept
c.v.Set("auto_accept", autoAccept)
}
func (c *Config) GetAutoAccept() bool {
c.mu.RLock()
defer c.mu.RUnlock()
return c.AutoAccept
}
func (c *Config) SetSaveHistory(saveHistory bool) {
c.mu.Lock()
defer c.mu.Unlock()
c.SaveHistory = saveHistory
c.v.Set("save_history", saveHistory)
}
func (c *Config) GetSaveHistory() bool {
c.mu.RLock()
defer c.mu.RUnlock()
return c.SaveHistory
}