2026-05-07 17:15:56 +03:00
|
|
|
|
"""
|
|
|
|
|
|
ConfigService - управление настройками приложения
|
|
|
|
|
|
"""
|
|
|
|
|
|
import json
|
|
|
|
|
|
import os
|
|
|
|
|
|
from typing import List, Optional
|
|
|
|
|
|
from dataclasses import dataclass, asdict
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass
|
|
|
|
|
|
class AppConfig:
|
|
|
|
|
|
"""Конфигурация приложения"""
|
|
|
|
|
|
cameras: List[str]
|
|
|
|
|
|
lenses: List[str]
|
|
|
|
|
|
celestial_bodies: List[str]
|
|
|
|
|
|
last_watch_folder: str
|
|
|
|
|
|
last_camera: str
|
|
|
|
|
|
last_lens: str
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConfigService:
|
|
|
|
|
|
"""Сервис для работы с конфигурацией"""
|
|
|
|
|
|
|
|
|
|
|
|
SETTINGS_FILE = "astro_settings.json"
|
|
|
|
|
|
CELESTIAL_BODIES_FILE = "celestial_bodies.json"
|
|
|
|
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
|
self.config = AppConfig(
|
|
|
|
|
|
cameras=[],
|
|
|
|
|
|
lenses=[],
|
|
|
|
|
|
celestial_bodies=[],
|
|
|
|
|
|
last_watch_folder="",
|
|
|
|
|
|
last_camera="",
|
|
|
|
|
|
last_lens=""
|
|
|
|
|
|
)
|
|
|
|
|
|
self.load_all()
|
|
|
|
|
|
|
|
|
|
|
|
def load_all(self):
|
|
|
|
|
|
"""Загружает все настройки"""
|
|
|
|
|
|
self._load_settings()
|
|
|
|
|
|
self._load_celestial_bodies()
|
|
|
|
|
|
|
|
|
|
|
|
if not self.config.celestial_bodies:
|
|
|
|
|
|
self.config.celestial_bodies = [
|
|
|
|
|
|
"M31 (Andromeda Galaxy)",
|
|
|
|
|
|
"M42 (Orion Nebula)",
|
|
|
|
|
|
"M45 (Pleiades)",
|
|
|
|
|
|
"M57 (Ring Nebula)",
|
|
|
|
|
|
"Sun",
|
|
|
|
|
|
"Moon",
|
|
|
|
|
|
"Jupiter",
|
|
|
|
|
|
"Saturn"
|
|
|
|
|
|
]
|
|
|
|
|
|
self._save_celestial_bodies()
|
|
|
|
|
|
|
|
|
|
|
|
def _load_settings(self):
|
|
|
|
|
|
if os.path.exists(self.SETTINGS_FILE):
|
|
|
|
|
|
try:
|
|
|
|
|
|
with open(self.SETTINGS_FILE, 'r', encoding='utf-8') as f:
|
|
|
|
|
|
data = json.load(f)
|
|
|
|
|
|
self.config.cameras = data.get('cameras', [])
|
|
|
|
|
|
self.config.lenses = data.get('lenses', [])
|
|
|
|
|
|
self.config.last_watch_folder = data.get('last_watch_folder', '')
|
|
|
|
|
|
self.config.last_camera = data.get('last_camera', '')
|
|
|
|
|
|
self.config.last_lens = data.get('last_lens', '')
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"Ошибка загрузки настроек: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
def save_settings(self):
|
|
|
|
|
|
try:
|
|
|
|
|
|
with open(self.SETTINGS_FILE, 'w', encoding='utf-8') as f:
|
|
|
|
|
|
json.dump({
|
|
|
|
|
|
'cameras': self.config.cameras,
|
|
|
|
|
|
'lenses': self.config.lenses,
|
|
|
|
|
|
'last_watch_folder': self.config.last_watch_folder,
|
|
|
|
|
|
'last_camera': self.config.last_camera,
|
|
|
|
|
|
'last_lens': self.config.last_lens
|
|
|
|
|
|
}, f, ensure_ascii=False, indent=2)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"Ошибка сохранения настроек: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
def _load_celestial_bodies(self):
|
|
|
|
|
|
if os.path.exists(self.CELESTIAL_BODIES_FILE):
|
|
|
|
|
|
try:
|
|
|
|
|
|
with open(self.CELESTIAL_BODIES_FILE, 'r', encoding='utf-8') as f:
|
|
|
|
|
|
self.config.celestial_bodies = json.load(f)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"Ошибка загрузки небесных тел: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
def _save_celestial_bodies(self):
|
|
|
|
|
|
try:
|
|
|
|
|
|
with open(self.CELESTIAL_BODIES_FILE, 'w', encoding='utf-8') as f:
|
|
|
|
|
|
json.dump(self.config.celestial_bodies, f, ensure_ascii=False, indent=2)
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"Ошибка сохранения небесных тел: {e}")
|
|
|
|
|
|
|
|
|
|
|
|
def get_cameras(self) -> List[str]:
|
|
|
|
|
|
return self.config.cameras.copy()
|
|
|
|
|
|
|
|
|
|
|
|
def add_camera(self, camera: str):
|
|
|
|
|
|
if camera and camera not in self.config.cameras:
|
|
|
|
|
|
self.config.cameras.append(camera)
|
|
|
|
|
|
self.save_settings()
|
|
|
|
|
|
|
|
|
|
|
|
def remove_camera(self, camera: str):
|
|
|
|
|
|
if camera in self.config.cameras:
|
|
|
|
|
|
self.config.cameras.remove(camera)
|
|
|
|
|
|
self.save_settings()
|
|
|
|
|
|
|
|
|
|
|
|
def get_lenses(self) -> List[str]:
|
|
|
|
|
|
return self.config.lenses.copy()
|
|
|
|
|
|
|
|
|
|
|
|
def add_lens(self, lens: str):
|
|
|
|
|
|
if lens and lens not in self.config.lenses:
|
|
|
|
|
|
self.config.lenses.append(lens)
|
|
|
|
|
|
self.save_settings()
|
|
|
|
|
|
|
|
|
|
|
|
def remove_lens(self, lens: str):
|
|
|
|
|
|
if lens in self.config.lenses:
|
|
|
|
|
|
self.config.lenses.remove(lens)
|
|
|
|
|
|
self.save_settings()
|
|
|
|
|
|
|
|
|
|
|
|
def get_celestial_bodies(self) -> List[str]:
|
|
|
|
|
|
return self.config.celestial_bodies.copy()
|
|
|
|
|
|
|
|
|
|
|
|
def add_celestial_body(self, name: str):
|
|
|
|
|
|
if name and name not in self.config.celestial_bodies:
|
|
|
|
|
|
self.config.celestial_bodies.append(name)
|
|
|
|
|
|
self._save_celestial_bodies()
|
|
|
|
|
|
|
|
|
|
|
|
def remove_celestial_body(self, name: str):
|
|
|
|
|
|
if name in self.config.celestial_bodies:
|
|
|
|
|
|
self.config.celestial_bodies.remove(name)
|
|
|
|
|
|
self._save_celestial_bodies()
|
|
|
|
|
|
|
|
|
|
|
|
def update_celestial_body(self, old_name: str, new_name: str):
|
|
|
|
|
|
if old_name in self.config.celestial_bodies:
|
|
|
|
|
|
idx = self.config.celestial_bodies.index(old_name)
|
|
|
|
|
|
self.config.celestial_bodies[idx] = new_name
|
|
|
|
|
|
self._save_celestial_bodies()
|
|
|
|
|
|
|
|
|
|
|
|
def get_last_watch_folder(self) -> str:
|
|
|
|
|
|
return self.config.last_watch_folder
|
|
|
|
|
|
|
|
|
|
|
|
def set_last_watch_folder(self, folder: str):
|
|
|
|
|
|
self.config.last_watch_folder = folder
|
|
|
|
|
|
self.save_settings()
|
|
|
|
|
|
|
|
|
|
|
|
def get_last_camera(self) -> str:
|
|
|
|
|
|
return self.config.last_camera
|
|
|
|
|
|
|
|
|
|
|
|
def set_last_camera(self, camera: str):
|
|
|
|
|
|
self.config.last_camera = camera
|
|
|
|
|
|
self.save_settings()
|
|
|
|
|
|
|
|
|
|
|
|
def get_last_lens(self) -> str:
|
|
|
|
|
|
return self.config.last_lens
|
|
|
|
|
|
|
|
|
|
|
|
def set_last_lens(self, lens: str):
|
|
|
|
|
|
self.config.last_lens = lens
|
|
|
|
|
|
self.save_settings()
|