160 lines
4.1 KiB
Go
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
|
|
}
|