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
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-06 13:12 +0000
1"""
2UI definitions service implementation.
3"""
5from __future__ import annotations
7# ///////////////////////////////////////////////////////////////
8# IMPORTS
9# ///////////////////////////////////////////////////////////////
10# Standard library imports
11from typing import Any
13# Third-party imports
14from PySide6.QtCore import QEvent, QSize, Qt, QTimer
15from PySide6.QtGui import QColor
16from PySide6.QtWidgets import QGraphicsDropShadowEffect, QSizeGrip
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
25# ///////////////////////////////////////////////////////////////
26# CLASSES
27# ///////////////////////////////////////////////////////////////
28class UiDefinitionsService:
29 """Service responsible for main window UI setup and grip resizing."""
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
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))
41 window.ui.header_container.mouseDoubleClickEvent = double_click_maximize_restore
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))
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)
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()
65 window.ui.header_container.mouseMoveEvent = move_window
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()
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)
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 )
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())
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)