92 lines
4.1 KiB
Python
92 lines
4.1 KiB
Python
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()) |