Coverage for src / ezqt_app / services / ui / definitions_service.py: 61.45%

65 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-06 13:12 +0000

1""" 

2UI definitions service implementation. 

3""" 

4 

5from __future__ import annotations 

6 

7# /////////////////////////////////////////////////////////////// 

8# IMPORTS 

9# /////////////////////////////////////////////////////////////// 

10# Standard library imports 

11from typing import Any 

12 

13# Third-party imports 

14from PySide6.QtCore import QEvent, QSize, Qt, QTimer 

15from PySide6.QtGui import QColor 

16from PySide6.QtWidgets import QGraphicsDropShadowEffect, QSizeGrip 

17 

18# Local imports 

19from ...domain.ports.main_window import MainWindowProtocol 

20from ...utils.custom_grips import CustomGrip 

21from ..settings import get_settings_service 

22from .window_service import WindowService 

23 

24 

25# /////////////////////////////////////////////////////////////// 

26# CLASSES 

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

28class UiDefinitionsService: 

29 """Service responsible for main window UI setup and grip resizing.""" 

30 

31 @staticmethod 

32 def apply_definitions(window: Any) -> None: 

33 """Configure all UI elements and connect base window events.""" 

34 settings_service = get_settings_service() 

35 app_settings = settings_service.app 

36 

37 def double_click_maximize_restore(event: Any) -> None: 

38 if event.type() == QEvent.Type.MouseButtonDblClick: 

39 QTimer.singleShot(250, lambda: WindowService.maximize_restore(window)) 

40 

41 window.ui.header_container.mouseDoubleClickEvent = double_click_maximize_restore 

42 

43 if app_settings.NAME: 43 ↛ 45line 43 didn't jump to line 45 because the condition on line 43 was always true

44 window.ui.header_container.set_app_name(app_settings.NAME) 

45 if app_settings.DESCRIPTION: 45 ↛ 47line 45 didn't jump to line 47 because the condition on line 45 was always true

46 window.ui.header_container.set_app_description(app_settings.DESCRIPTION) 

47 if app_settings.APP_WIDTH and app_settings.APP_HEIGHT: 47 ↛ 49line 47 didn't jump to line 49 because the condition on line 47 was always true

48 window.resize(app_settings.APP_WIDTH, app_settings.APP_HEIGHT) 

49 if app_settings.APP_MIN_SIZE: 49 ↛ 52line 49 didn't jump to line 52 because the condition on line 49 was always true

50 window.setMinimumSize(QSize(*app_settings.APP_MIN_SIZE)) 

51 

52 if app_settings.ENABLE_CUSTOM_TITLE_BAR: 52 ↛ 72line 52 didn't jump to line 72 because the condition on line 52 was always true

53 window.setWindowFlags(Qt.WindowType.FramelessWindowHint) 

54 window.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) 

55 

56 def move_window(event: Any) -> None: 

57 if WindowService.get_status(): 

58 WindowService.maximize_restore(window) 

59 if event.buttons() == Qt.MouseButton.LeftButton: 

60 global_pos = event.globalPosition().toPoint() 

61 window.move(window.pos() + global_pos - window.dragPos) 

62 window.dragPos = global_pos 

63 event.accept() 

64 

65 window.ui.header_container.mouseMoveEvent = move_window 

66 

67 window.left_grip = CustomGrip(window, Qt.Edge.LeftEdge, True) 

68 window.right_grip = CustomGrip(window, Qt.Edge.RightEdge, True) 

69 window.top_grip = CustomGrip(window, Qt.Edge.TopEdge, True) 

70 window.bottom_grip = CustomGrip(window, Qt.Edge.BottomEdge, True) 

71 else: 

72 window.ui.app_margins_layout.setContentsMargins(0, 0, 0, 0) 

73 window.ui.header_container.minimize_btn.hide() 

74 window.ui.header_container.maximize_restore_btn.hide() 

75 window.ui.header_container.close_btn.hide() 

76 window.ui.bottom_bar.size_grip_spacer.hide() 

77 

78 window.shadow = QGraphicsDropShadowEffect(window) 

79 window.shadow.setBlurRadius(17) 

80 window.shadow.setXOffset(0) 

81 window.shadow.setYOffset(0) 

82 window.shadow.setColor(QColor(0, 0, 0, 150)) 

83 window.ui.bg_app_frame.setGraphicsEffect(window.shadow) 

84 

85 window.sizegrip = QSizeGrip(window.ui.bottom_bar.size_grip_spacer) 

86 window.sizegrip.setStyleSheet( 

87 "width: 20px; height: 20px; margin 0px; padding: 0px;" 

88 ) 

89 

90 window.ui.header_container.minimize_btn.clicked.connect( 

91 lambda: window.showMinimized() 

92 ) 

93 window.ui.header_container.maximize_restore_btn.clicked.connect( 

94 lambda: WindowService.maximize_restore(window) 

95 ) 

96 window.ui.header_container.close_btn.clicked.connect(lambda: window.close()) 

97 

98 @staticmethod 

99 def resize_grips(window: MainWindowProtocol) -> None: 

100 """Resize custom grips when the main window size changes.""" 

101 if get_settings_service().app.ENABLE_CUSTOM_TITLE_BAR: 

102 window.left_grip.setGeometry(0, 10, 10, window.height()) 

103 window.right_grip.setGeometry(window.width() - 10, 10, 10, window.height()) 

104 window.top_grip.setGeometry(0, 0, window.width(), 10) 

105 window.bottom_grip.setGeometry(0, window.height() - 10, window.width(), 10)