few fixes

This commit is contained in:
Louis Mazin 2025-09-09 18:17:05 +02:00
parent 890c6ff6ba
commit 02752c7e4a
3 changed files with 36 additions and 62 deletions

View File

@ -5,7 +5,7 @@ from os import path
import app.utils.paths as paths import app.utils.paths as paths
import json import json
import logging import logging
from typing import Dict, Any, Union from typing import Dict, Any
# Configure logging # Configure logging
logger: logging.Logger = logging.getLogger(__name__) logger: logging.Logger = logging.getLogger(__name__)
@ -19,24 +19,6 @@ class SettingsManager:
self.observer_manager: ObserverManager = observer_manager self.observer_manager: ObserverManager = observer_manager
self.theme_manager: ThemeManager = theme_manager self.theme_manager: ThemeManager = theme_manager
# Hardcoded fallback settings in case files are missing
self.fallback_settings: Dict[str, Any] = {
"theme": "dark",
"lang": "fr",
"window_size": {"width": 1000, "height": 600},
"maximized": False
}
self.fallback_config: Dict[str, Any] = {
"app_name": "Application",
"app_os": "Windows",
"app_version": "1.0.0",
"architecture": "x64",
"icon_path": "data/assets/icon.ico",
"main_script": "main.py",
"git_repo": ""
}
# Load default settings # Load default settings
self.default_settings: Dict[str, Any] = self._load_default_settings() self.default_settings: Dict[str, Any] = self._load_default_settings()
# Load config # Load config
@ -59,21 +41,16 @@ class SettingsManager:
if path.exists(defaults_path): if path.exists(defaults_path):
with open(defaults_path, 'r', encoding='utf-8') as f: with open(defaults_path, 'r', encoding='utf-8') as f:
settings = json.load(f) settings = json.load(f)
# Validate required keys
for key in self.fallback_settings.keys():
if key not in settings:
logger.warning(f"Missing key '{key}' in defaults_settings.json, using fallback")
settings[key] = self.fallback_settings[key]
return settings return settings
else: else:
logger.warning(f"defaults_settings.json not found, using fallback settings") logger.warning(f"defaults_settings.json not found")
return self.fallback_settings.copy() return {}
except (json.JSONDecodeError, FileNotFoundError, KeyError, UnicodeDecodeError) as e: except (json.JSONDecodeError, FileNotFoundError, KeyError, UnicodeDecodeError) as e:
logger.error(f"Error loading default settings: {e}") logger.error(f"Error loading default settings: {e}")
return self.fallback_settings.copy() return {}
except Exception as e: except Exception as e:
logger.error(f"Unexpected error loading default settings: {e}") logger.error(f"Unexpected error loading default settings: {e}")
return self.fallback_settings.copy() return {}
def _load_config(self) -> Dict[str, Any]: def _load_config(self) -> Dict[str, Any]:
"""Load config.json with error handling""" """Load config.json with error handling"""
@ -82,21 +59,16 @@ class SettingsManager:
if path.exists(config_path): if path.exists(config_path):
with open(config_path, 'r', encoding='utf-8') as f: with open(config_path, 'r', encoding='utf-8') as f:
config = json.load(f) config = json.load(f)
# Validate required keys
for key in self.fallback_config.keys():
if key not in config:
logger.warning(f"Missing key '{key}' in config.json, using fallback")
config[key] = self.fallback_config[key]
return config return config
else: else:
logger.warning("config.json not found, using fallback config") logger.warning("config.json not found")
return self.fallback_config.copy() return {}
except (json.JSONDecodeError, FileNotFoundError, KeyError, UnicodeDecodeError) as e: except (json.JSONDecodeError, FileNotFoundError, KeyError, UnicodeDecodeError) as e:
logger.error(f"Error loading config: {e}") logger.error(f"Error loading config: {e}")
return self.fallback_config.copy() return {}
except Exception as e: except Exception as e:
logger.error(f"Unexpected error loading config: {e}") logger.error(f"Unexpected error loading config: {e}")
return self.fallback_config.copy() return {}
def _initialize_qsettings(self) -> QSettings: def _initialize_qsettings(self) -> QSettings:
"""Initialize QSettings with error handling""" """Initialize QSettings with error handling"""
@ -114,10 +86,10 @@ class SettingsManager:
def get_config(self, key: str) -> Any: def get_config(self, key: str) -> Any:
"""Get configuration value by key""" """Get configuration value by key"""
try: try:
return self.config.get(key, self.fallback_config.get(key)) return self.config.get(key)
except Exception as e: except Exception as e:
logger.error(f"Error getting config key '{key}': {e}") logger.error(f"Error getting config key '{key}': {e}")
return self.fallback_config.get(key) return None
# Theme # Theme
def get_theme(self) -> str: def get_theme(self) -> str:
@ -126,7 +98,7 @@ class SettingsManager:
return self.settings.value("theme", self.default_settings.get("theme")) return self.settings.value("theme", self.default_settings.get("theme"))
except Exception as e: except Exception as e:
logger.error(f"Error getting theme: {e}") logger.error(f"Error getting theme: {e}")
return self.fallback_settings["theme"] return ""
def set_theme(self, mode: str) -> None: def set_theme(self, mode: str) -> None:
"""Set the application theme""" """Set the application theme"""
@ -145,7 +117,7 @@ class SettingsManager:
return self.settings.value("lang", self.default_settings.get("lang")) return self.settings.value("lang", self.default_settings.get("lang"))
except Exception as e: except Exception as e:
logger.error(f"Error getting language: {e}") logger.error(f"Error getting language: {e}")
return self.fallback_settings["lang"] return ""
def set_language(self, lang_code: str) -> None: def set_language(self, lang_code: str) -> None:
"""Set the application language""" """Set the application language"""
@ -163,14 +135,14 @@ class SettingsManager:
size = self.settings.value("window_size", self.default_settings.get("window_size")) size = self.settings.value("window_size", self.default_settings.get("window_size"))
# Validate window size values # Validate window size values
if isinstance(size, dict) and "width" in size and "height" in size: if isinstance(size, dict) and "width" in size and "height" in size:
width = int(size["width"]) if size["width"] > 0 else self.fallback_settings["window_size"]["width"] width = int(size["width"]) if size["width"] > 0 else 1000
height = int(size["height"]) if size["height"] > 0 else self.fallback_settings["window_size"]["height"] height = int(size["height"]) if size["height"] > 0 else 600
return {"width": width, "height": height} return {"width": width, "height": height}
else: else:
return self.fallback_settings["window_size"].copy() return {"width": 1000, "height": 600}
except Exception as e: except Exception as e:
logger.error(f"Error getting window size: {e}") logger.error(f"Error getting window size: {e}")
return self.fallback_settings["window_size"].copy() return {"width": 1000, "height": 600}
def set_window_size(self, width: int, height: int) -> None: def set_window_size(self, width: int, height: int) -> None:
"""Set the window size""" """Set the window size"""
@ -196,10 +168,10 @@ class SettingsManager:
elif isinstance(value, bool): elif isinstance(value, bool):
return value return value
else: else:
return self.fallback_settings["maximized"] return False
except Exception as e: except Exception as e:
logger.error(f"Error getting maximized state: {e}") logger.error(f"Error getting maximized state: {e}")
return self.fallback_settings["maximized"] return False
def set_maximized(self, maximized: bool) -> None: def set_maximized(self, maximized: bool) -> None:
"""Set the window maximized state""" """Set the window maximized state"""

View File

@ -106,9 +106,7 @@ class UpdateManager:
if download_cancelled: if download_cancelled:
f.truncate(0) f.truncate(0)
f.close() f.close()
os.remove(local_path, dir_fd=None) break
self.alert_manager.show_info(self.language_manager.get_text("update_aborted"), parent=parent)
return False
if chunk: if chunk:
f.write(chunk) f.write(chunk)
@ -118,6 +116,10 @@ class UpdateManager:
dialog.close() dialog.close()
if download_cancelled:
os.remove(local_path, dir_fd=None)
self.alert_manager.show_info(self.language_manager.get_text("update_aborted"), parent=parent)
return False
msg = self.language_manager.get_text("update_downloaded").replace("{local_path}", local_path) msg = self.language_manager.get_text("update_downloaded").replace("{local_path}", local_path)
self.alert_manager.show_success(msg, parent=parent) self.alert_manager.show_success(msg, parent=parent)

View File

@ -69,10 +69,10 @@ class TabsWidget(QWidget):
self.end_buttons = [] self.end_buttons = []
# Icon Colors # Icon Colors
self.selected_icon_color = self.theme_manager.current_theme.get_color("selected_icon") self.selected_icon_color = self.theme_manager.current_theme.get_color("icon_selected_color")
self.unselected_icon_color = self.theme_manager.current_theme.get_color("unselected_icon") self.unselected_icon_color = self.theme_manager.current_theme.get_color("icon_unselected_color")
self.selected_border_icon_color = self.theme_manager.current_theme.get_color("selected_border_icon") self.selected_border_icon_color = self.theme_manager.current_theme.get_color("icon_selected_border_color")
self.hover_icon_color = self.theme_manager.current_theme.get_color("hover_icon") self.hover_icon_color = self.theme_manager.current_theme.get_color("icon_hover_color")
# Spacer items for alignment # Spacer items for alignment
self.left_spacer = None self.left_spacer = None
@ -446,14 +446,14 @@ class TabsWidget(QWidget):
if self.onTabChange and old_index != index: if self.onTabChange and old_index != index:
try: try:
self.onTabChange(index) self.onTabChange(index)
except Exception as e: except Exception:
print(f"Error in onTabChange callback: {e}") pass
def set_theme(self): def set_theme(self):
self.selected_icon_color = self.theme_manager.current_theme.get_color("selected_icon") self.selected_icon_color = self.theme_manager.current_theme.get_color("icon_selected_color")
self.unselected_icon_color = self.theme_manager.current_theme.get_color("unselected_icon") self.unselected_icon_color = self.theme_manager.current_theme.get_color("icon_unselected_color")
self.selected_border_icon_color = self.theme_manager.current_theme.get_color("selected_border_icon") self.selected_border_icon_color = self.theme_manager.current_theme.get_color("icon_selected_border_color")
self.hover_icon_color = self.theme_manager.current_theme.get_color("hover_icon") self.hover_icon_color = self.theme_manager.current_theme.get_color("icon_hover_color")
# Apply theme to all buttons # Apply theme to all buttons
for i, button in enumerate(self.buttons): for i, button in enumerate(self.buttons):
# Check if button is currently selected # Check if button is currently selected