from src.windows import LoginWindow, AdminWindow, ClientWindow, ManagerWindow from src.objects import User, Rights from src.db import DB_CONFIG from PyQt6.QtWidgets import QApplication from PyQt6.QtCore import QObject, pyqtSlot, pyqtSignal from PyQt6.QtSql import QSqlDatabase class Composer(QObject): """Управляет навигацией между окнами приложения""" render_request = pyqtSignal(User) def __init__(self): super().__init__() self._current = None self._app = QApplication([]) self._init_db() self.render_request.connect(self._render) def _init_db(self): """Инициализация подключения к базе данных""" self._db = QSqlDatabase("QPSQL") self._db.setDatabaseName(DB_CONFIG['dbname']) self._db.setPort(DB_CONFIG['port']) self._db.setHostName(DB_CONFIG['host']) self._db.setUserName(DB_CONFIG['user']) self._db.setPassword(DB_CONFIG['password']) if not self._db.open(): raise Exception(f"Не получилось подключиться к базе данных: {self._db.lastError().text()}") @pyqtSlot(User) def _render(self, user: User): """Маршрутизация пользователя на основе его роли""" match user.rights: case Rights.ADMIN: self._admin_fabric() case Rights.MANAGER: self._manager_fabric() case Rights.CLIENT: self._client_fabric(user) case Rights.GUEST: self._guest_fabric() def _login_fabric(self): """Создание и отображение окна входа""" self.wlogin = LoginWindow(self, self._db) self._switch_window(self.wlogin) def _admin_fabric(self): """Создание и отображение панели администратора""" self.wadmin = AdminWindow(self, self._db) self._switch_window(self.wadmin) def _manager_fabric(self): """Создание и отображение панели менеджера""" self.wmanager = ManagerWindow(self, self._db) self._switch_window(self.wmanager) def _client_fabric(self, user: User): """Создание и отображение панели клиента""" self.wclient = ClientWindow(self, self._db, user) self._switch_window(self.wclient) def _guest_fabric(self): """Создание и отображение панели гостя""" # TODO: Реализовать GuestWindow если нужен режим гостя pass def _switch_window(self, new_window): """Переключение между окнами""" if self._current: self._current.close() new_window.show() self._current = new_window def run(self): """Запуск приложения""" import sys self._login_fabric() sys.exit(self._app.exec())