-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsettings_manager.py
134 lines (117 loc) · 6.67 KB
/
settings_manager.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# settings_manager.py
import json
import os
import config # Importa per ottenere i valori PREDEFINITI
import logging
# --- Usa la funzione da config per definire il percorso ---
SETTINGS_FILENAME = "settings.json"
APP_DATA_FOLDER = config.get_app_data_folder() # Ottieni la cartella base
if APP_DATA_FOLDER: # Controlla se get_app_data_folder ha restituito un percorso valido
SETTINGS_FILE_PATH = os.path.join(APP_DATA_FOLDER, SETTINGS_FILENAME)
else:
# Fallback se non abbiamo una cartella dati (molto raro)
logging.error("Impossibile determinare APP_DATA_FOLDER, uso percorso relativo per settings.json.")
SETTINGS_FILE_PATH = os.path.abspath(SETTINGS_FILENAME)
logging.info(f"Percorso file impostazioni in uso: {SETTINGS_FILE_PATH}")
# --- FINE NUOVA DEFINIZIONE ---
def load_settings():
"""Carica le impostazioni da SETTINGS_FILE_PATH."""
first_launch = not os.path.exists(SETTINGS_FILE_PATH) # <-- Usa la nuova variabile
defaults = {
"backup_base_dir": config.BACKUP_BASE_DIR,
"max_backups": config.MAX_BACKUPS,
"max_source_size_mb": 200, # Limite default 500 MB per la sorgente
"theme": "dark", # Valori possibili: 'dark', 'light'
"language": "en", # Default language code (ISO 639-1)
"compression_mode": "standard",
"check_free_space_enabled": True,
"ini_whitelist": [ # File da controllare per i percorsi
"steam_emu.ini",
"user_steam_emu.ini",
"config.ini",
"settings.ini",
"user.ini",
"codex.ini",
"cream_api.ini",
"goglog.ini",
"CPY.ini",
"ds.ini",
# Aggiungi altri nomi comuni se ne conosci
],
"ini_blacklist": [ # File da ignorare sempre
"reshade.ini",
"reshade_presets.ini",
"dxvk.conf",
"d3d9.ini",
"d3d11.ini",
"opengl32.ini",
"graphicsconfig.ini",
"unins.ini",
"unins000.ini",
"browscap.ini",
# Aggiungi altri nomi comuni da ignorare
]
}
if first_launch:
logging.info("Loading settings from file...")
logging.info(f"File impostazioni '{SETTINGS_FILE_PATH}' non trovato...") # <-- Usa la nuova variabile
# Potremmo salvare i default qui, ma aspettiamo la conferma dall'utente nel dialogo
return defaults.copy(), True # Restituisce COPIA dei default e True per primo avvio
try:
with open(SETTINGS_FILE_PATH, 'r', encoding='utf-8') as f: # <-- Usa la nuova variabile
user_settings = json.load(f)
logging.info("Settings loaded successfully")
logging.info(f"Impostazioni caricate correttamente da '{SETTINGS_FILE_PATH}'.") # <-- Usa la nuova variabile
# Unisci i default con le impostazioni utente per gestire chiavi mancanti
# Le impostazioni utente sovrascrivono i default
settings = defaults.copy()
settings.update(user_settings)
# --- VALIDAZIONE TEMA ---
if settings.get("theme") not in ["light", "dark"]:
logging.warning(f"Valore tema non valido ('{settings.get('theme')}'), verrà usato il default '{defaults['theme']}'.")
settings["theme"] = defaults["theme"]
# --- VALIDAZIONE LINGUA ---
if settings.get("language") not in ["it", "en"]:
logging.warning(f"Valore lingua non valido ('{settings.get('language')}'), verrà usato il default '{defaults['language']}'.")
settings["language"] = defaults["language"]
# --- VALIDAZIONE COMPRESSION MODE ---
valid_modes = ["standard", "maximum", "stored"]
if settings.get("compression_mode") not in valid_modes:
logging.warning(f"Valore compression_mode non valido ('{settings.get('compression_mode')}'), verrà usato il default '{defaults['compression_mode']}'.")
settings["compression_mode"] = defaults["compression_mode"]
# Validazione semplice (opzionale ma consigliata)
if not isinstance(settings["max_backups"], int) or settings["max_backups"] < 1:
logging.warning(f"Valore max_backups non valido ('{settings['max_backups']}'), verrà usato il default {defaults['max_backups']}.")
settings["max_backups"] = defaults["max_backups"]
if not isinstance(settings.get("max_source_size_mb"), int) or settings["max_source_size_mb"] < 1:
logging.warning(f"Valore max_source_size_mb non valido ('{settings.get('max_source_size_mb')}'), verrà usato il default {defaults['max_source_size_mb']}.")
settings["max_source_size_mb"] = defaults["max_source_size_mb"]
# Validazione semplice tipi lista (assicurati siano liste di stringhe)
if not isinstance(settings.get("ini_whitelist"), list):
logging.warning("'ini_whitelist' nel file delle impostazioni non è una lista valida, verrà usata la lista predefinita.")
settings["ini_whitelist"] = defaults["ini_whitelist"]
if not isinstance(settings.get("ini_blacklist"), list):
logging.warning("'ini_blacklist' nel file delle impostazioni non è una lista valida, verrà usata la lista predefinita.")
settings["ini_blacklist"] = defaults["ini_blacklist"]
# Validazione booleano
if not isinstance(settings.get("check_free_space_enabled"), bool):
logging.warning(f"Valore check_free_space_enabled non valido ('{settings.get('check_free_space_enabled')}'), verrà usato il default {defaults['check_free_space_enabled']}.")
settings["check_free_space_enabled"] = defaults["check_free_space_enabled"]
return settings, False
except (json.JSONDecodeError, KeyError, TypeError):
logging.error(f"Lettura o validazione di '{SETTINGS_FILE_PATH}' fallita...", exc_info=True)
return defaults.copy(), True # Tratta come primo avvio se file corrotto
except Exception:
logging.error(f"Errore imprevisto durante la lettura delle impostazioni da '{SETTINGS_FILE_PATH}'. ...", exc_info=True)
return defaults.copy(), True
def save_settings(settings_dict):
"""Salva il dizionario delle impostazioni in SETTINGS_FILE. Restituisce bool (successo)."""
try:
with open(SETTINGS_FILE_PATH, 'w', encoding='utf-8') as f: # <-- Usa la nuova variabile
json.dump(settings_dict, f, indent=4)
logging.info("Saving settings to file...")
logging.info(f"Impostazioni salvate correttamente in '{SETTINGS_FILE_PATH}'.") # <-- Usa la nuova variabile
return True
except Exception:
logging.error(f"Errore durante il salvataggio delle impostazioni in '{SETTINGS_FILE_PATH}'.", exc_info=True)
return False