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

1# /////////////////////////////////////////////////////////////// 

2# SERVICES.SETTINGS.SERVICE - Settings service 

3# Project: ezqt_app 

4# /////////////////////////////////////////////////////////////// 

5 

6"""Settings service implementation.""" 

7 

8from __future__ import annotations 

9 

10# /////////////////////////////////////////////////////////////// 

11# IMPORTS 

12# /////////////////////////////////////////////////////////////// 

13# Third-party imports 

14from PySide6.QtCore import QSize 

15 

16from ...domain.models.settings import ( 

17 AppSettingsModel, 

18 GuiSettingsModel, 

19 SettingsStateModel, 

20) 

21from ...domain.ports.settings_service import SettingsServiceProtocol 

22 

23# Local imports 

24from .._registry import ServiceRegistry 

25 

26 

27# /////////////////////////////////////////////////////////////// 

28# CLASSES 

29# /////////////////////////////////////////////////////////////// 

30class SettingsService(SettingsServiceProtocol): 

31 """Service managing mutable application settings state.""" 

32 

33 def __init__(self) -> None: 

34 """Initialize settings state container.""" 

35 self._state = SettingsStateModel() 

36 

37 @property 

38 def app(self) -> AppSettingsModel: 

39 """Return mutable application settings.""" 

40 return self._state.app 

41 

42 @property 

43 def gui(self) -> GuiSettingsModel: 

44 """Return mutable GUI settings.""" 

45 return self._state.gui 

46 

47 def set_app_name(self, name: str) -> None: 

48 """Set application name.""" 

49 self.app.NAME = name 

50 

51 def set_app_description(self, description: str) -> None: 

52 """Set application description.""" 

53 self.app.DESCRIPTION = description 

54 

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 

58 

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) 

62 

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()) 

66 

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 

71 

72 def set_debug_enabled(self, enabled: bool) -> None: 

73 """Enable or disable debug console output.""" 

74 self.app.DEBUG = enabled 

75 

76 def set_theme(self, theme: str) -> None: 

77 """Set active theme. 

78 

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 

90 

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 

95 

96 def set_settings_panel_width(self, width: int) -> None: 

97 """Set settings panel width.""" 

98 self.gui.SETTINGS_PANEL_WIDTH = width 

99 

100 def set_time_animation(self, duration: int) -> None: 

101 """Set animation duration in milliseconds.""" 

102 self.gui.TIME_ANIMATION = duration 

103 

104 

105# /////////////////////////////////////////////////////////////// 

106# FUNCTIONS 

107# /////////////////////////////////////////////////////////////// 

108def get_settings_service() -> SettingsService: 

109 """Return the singleton settings service.""" 

110 return ServiceRegistry.get(SettingsService, SettingsService)