MobileMkch/settings/settings.go
2025-08-05 20:08:15 +03:00

160 lines
4.1 KiB
Go

package settings
import (
"encoding/json"
"io"
"log"
"os"
"path/filepath"
"runtime"
"fyne.io/fyne/v2"
)
type Settings struct {
Theme string `json:"theme"`
LastBoard string `json:"last_board"`
AutoRefresh bool `json:"auto_refresh"`
ShowFiles bool `json:"show_files"`
CompactMode bool `json:"compact_mode"`
PageSize int `json:"page_size"`
}
var settingsPath string
var fyneApp fyne.App
func SetApp(app fyne.App) {
fyneApp = app
}
func Init() error {
var appDir string
if runtime.GOOS == "android" || runtime.GOOS == "ios" {
appDir = filepath.Join(os.TempDir(), "mobilemkch")
log.Printf("Используем временную директорию для %s: %s", runtime.GOOS, appDir)
} else {
homeDir, err := os.UserHomeDir()
if err != nil {
return err
}
appDir = filepath.Join(homeDir, ".mobilemkch")
log.Printf("Используем домашнюю директорию: %s", appDir)
}
if err := os.MkdirAll(appDir, 0755); err != nil {
return err
}
settingsPath = filepath.Join(appDir, "settings.json")
log.Printf("Путь к настройкам: %s", settingsPath)
return nil
}
func Load() (*Settings, error) {
settings := &Settings{
Theme: "dark",
LastBoard: "",
AutoRefresh: true,
ShowFiles: true,
CompactMode: false,
PageSize: 10,
}
if (runtime.GOOS == "android" || runtime.GOOS == "ios") && fyneApp != nil {
log.Printf("Загружаем настройки через Fyne Storage")
storage := fyneApp.Storage()
reader, err := storage.Open("settings.json")
if err != nil {
log.Printf("Файл настроек не найден в Fyne Storage, создаем новый")
return settings, Save(settings)
}
defer reader.Close()
data, err := io.ReadAll(reader)
if err != nil {
log.Printf("Ошибка чтения из Fyne Storage: %v", err)
return nil, err
}
if err := json.Unmarshal(data, settings); err != nil {
log.Printf("Ошибка парсинга настроек из Fyne Storage: %v", err)
return nil, err
}
log.Printf("Настройки загружены из Fyne Storage")
return settings, nil
}
if settingsPath == "" {
if err := Init(); err != nil {
return nil, err
}
}
log.Printf("Загружаем настройки из: %s", settingsPath)
data, err := os.ReadFile(settingsPath)
if err != nil {
if os.IsNotExist(err) {
log.Printf("Файл настроек не найден, создаем новый")
return settings, Save(settings)
}
log.Printf("Ошибка чтения настроек: %v", err)
return nil, err
}
if err := json.Unmarshal(data, settings); err != nil {
log.Printf("Ошибка парсинга настроек: %v", err)
return nil, err
}
log.Printf("Настройки загружены успешно")
return settings, nil
}
func Save(settings *Settings) error {
if (runtime.GOOS == "android" || runtime.GOOS == "ios") && fyneApp != nil {
log.Printf("Сохраняем настройки через Fyne Storage")
storage := fyneApp.Storage()
data, err := json.MarshalIndent(settings, "", " ")
if err != nil {
log.Printf("Ошибка сериализации настроек: %v", err)
return err
}
writer, err := storage.Create("settings.json")
if err != nil {
log.Printf("Ошибка создания файла в Fyne Storage: %v", err)
return err
}
defer writer.Close()
_, err = writer.Write(data)
if err != nil {
log.Printf("Ошибка сохранения через Fyne Storage: %v", err)
return err
}
log.Printf("Настройки сохранены через Fyne Storage")
return nil
}
log.Printf("Сохраняем настройки в: %s", settingsPath)
data, err := json.MarshalIndent(settings, "", " ")
if err != nil {
log.Printf("Ошибка сериализации настроек: %v", err)
return err
}
err = os.WriteFile(settingsPath, data, 0644)
if err != nil {
log.Printf("Ошибка записи настроек: %v", err)
return err
}
log.Printf("Настройки сохранены успешно")
return nil
}