Coverage for src / ezqt_app / services / settings / settings_service.py: 74.47%
45 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-06 13:12 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-06 13:12 +0000
1# ///////////////////////////////////////////////////////////////
2# SERVICES.SETTINGS.SERVICE - Settings service
3# Project: ezqt_app
4# ///////////////////////////////////////////////////////////////
6"""Settings service implementation."""
8from __future__ import annotations
10# ///////////////////////////////////////////////////////////////
11# IMPORTS
12# ///////////////////////////////////////////////////////////////
13# Third-party imports
14from PySide6.QtCore import QSize
16from ...domain.models.settings import (
17 AppSettingsModel,
18 GuiSettingsModel,
19 SettingsStateModel,
20)
21from ...domain.ports.settings_service import SettingsServiceProtocol
23# Local imports
24from .._registry import ServiceRegistry
27# ///////////////////////////////////////////////////////////////
28# CLASSES
29# ///////////////////////////////////////////////////////////////
30class SettingsService(SettingsServiceProtocol):
31 """Service managing mutable application settings state."""
33 def __init__(self) -> None:
34 """Initialize settings state container."""
35 self._state = SettingsStateModel()
37 @property
38 def app(self) -> AppSettingsModel:
39 """Return mutable application settings."""
40 return self._state.app
42 @property
43 def gui(self) -> GuiSettingsModel:
44 """Return mutable GUI settings."""
45 return self._state.gui
47 def set_app_name(self, name: str) -> None:
48 """Set application name."""
49 self.app.NAME = name
51 def set_app_description(self, description: str) -> None:
52 """Set application description."""
53 self.app.DESCRIPTION = description
55 def set_custom_title_bar_enabled(self, enabled: bool) -> None:
56 """Enable or disable custom title bar."""
57 self.app.ENABLE_CUSTOM_TITLE_BAR = enabled
59 def set_app_min_size(self, width: int, height: int) -> None:
60 """Set minimum window size."""
61 self.app.APP_MIN_SIZE = (width, height)
63 def set_app_min_size_qsize(self, size: QSize) -> None:
64 """Set minimum window size from QSize (convenience, not part of the port)."""
65 self.app.APP_MIN_SIZE = (size.width(), size.height())
67 def set_app_dimensions(self, width: int, height: int) -> None:
68 """Set default window dimensions."""
69 self.app.APP_WIDTH = width
70 self.app.APP_HEIGHT = height
72 def set_debug_enabled(self, enabled: bool) -> None:
73 """Enable or disable debug console output."""
74 self.app.DEBUG = enabled
76 def set_theme(self, theme: str) -> None:
77 """Set active theme.
79 Accepts either a ``'preset:variant'`` string (e.g. ``'blue_gray:dark'``)
80 or a bare variant (e.g. ``'dark'``, ``'light'``) for backward compat.
81 A bare variant keeps the current ``THEME_PRESET`` unchanged.
82 """
83 value = theme.lower().strip()
84 if ":" in value:
85 preset, _, variant = value.partition(":")
86 self.gui.THEME_PRESET = preset.strip()
87 self.gui.THEME = variant.strip()
88 else:
89 self.gui.THEME = value
91 def set_menu_widths(self, shrinked: int, extended: int) -> None:
92 """Set menu panel widths."""
93 self.gui.MENU_PANEL_SHRINKED_WIDTH = shrinked
94 self.gui.MENU_PANEL_EXTENDED_WIDTH = extended
96 def set_settings_panel_width(self, width: int) -> None:
97 """Set settings panel width."""
98 self.gui.SETTINGS_PANEL_WIDTH = width
100 def set_time_animation(self, duration: int) -> None:
101 """Set animation duration in milliseconds."""
102 self.gui.TIME_ANIMATION = duration
105# ///////////////////////////////////////////////////////////////
106# FUNCTIONS
107# ///////////////////////////////////////////////////////////////
108def get_settings_service() -> SettingsService:
109 """Return the singleton settings service."""
110 return ServiceRegistry.get(SettingsService, SettingsService)