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 }