from PyQt6.QtWidgets import QApplication, QMainWindow from PyQt6.QtGui import QIcon, QResizeEvent, QCloseEvent from PyQt6.QtCore import QSize, QEvent from app.core.main_manager import MainManager, NotificationType from app.ui.widgets.tabs_widget import TabsWidget, MenuDirection, ButtonPosition, BorderSide from app.ui.windows.settings_window import SettingsWindow from app.ui.windows.suggestion_window import SuggestionWindow import app.utils.paths as paths from typing import Optional class MainWindow(QMainWindow): def __init__(self) -> None: super().__init__() self.main_manager: MainManager = MainManager.get_instance() self.language_manager = self.main_manager.get_language_manager() self.theme_manager = self.main_manager.get_theme_manager() self.settings_manager = self.main_manager.get_settings_manager() self.observer_manager = self.main_manager.get_observer_manager() self.observer_manager.subscribe(NotificationType.THEME, self.update_theme) self.is_maximizing: bool = False self.current_size: QSize self.previous_size: QSize # UI elements self.side_menu: TabsWidget self.settings_window: SettingsWindow self.suggestion_window: SuggestionWindow app: Optional[QApplication] = QApplication.instance() size: QSize = app.primaryScreen().size() self.settings_manager.minScreenSize = min(size.height(),size.width()) self.setMinimumSize(600, 400) self.setup_ui() self.apply_saved_window_state() def apply_saved_window_state(self) -> None: """Apply saved window size and maximized state""" window_size: dict = self.settings_manager.get_window_size() self.current_size = QSize(window_size["width"], window_size["height"]) self.previous_size = QSize(window_size["width"], window_size["height"]) self.resize(self.current_size) if self.settings_manager.get_maximized(): self.is_maximizing = True self.showMaximized() def changeEvent(self, event: QEvent) -> None: """Handle window state changes""" super().changeEvent(event) if event.type() == event.Type.WindowStateChange: if self.isMaximized(): # On vient de maximiser self.is_maximizing = False else: # On vient de dé-maximiser, restaurer la taille précédente if hasattr(self, 'previous_size'): self.current_size = self.previous_size self.settings_manager.set_maximized(self.isMaximized()) def resizeEvent(self, a0: QResizeEvent) -> None: # Ne pas sauvegarder la taille si on est en train de maximiser if not self.isMaximized() and not self.is_maximizing: self.previous_size = self.current_size self.current_size = self.size() def closeEvent(self, event: QCloseEvent) -> None: """Handle application close event""" super().closeEvent(event) # si la difference de taille est plus grande que 10 pixels, enregistrer previoussize if abs(self.current_size.width() - self.previous_size.width()) > 10 or abs(self.current_size.height() - self.previous_size.height()) > 10: self.current_size = self.previous_size self.settings_manager.set_window_size( self.current_size.width(), self.current_size.height() ) def setup_ui(self) -> None: self.side_menu = TabsWidget(self,MenuDirection.HORIZONTAL,70,None,10,1,BorderSide.TOP) self.settings_window = SettingsWindow(self) self.side_menu.add_widget(self.settings_window,"",paths.get_asset_svg_path("settings"), position=ButtonPosition.CENTER) self.suggestion_window = SuggestionWindow(self) self.side_menu.add_widget(self.suggestion_window,"",paths.get_asset_svg_path("suggestion"), position=ButtonPosition.CENTER) self.setCentralWidget(self.side_menu) def update_theme(self) -> None: self.setStyleSheet(self.theme_manager.get_sheet())