from PyQt6.QtWidgets import QMainWindow, QWidget, QVBoxLayout from PyQt6.QtCore import QEasingCurve, QPropertyAnimation, QRect from .theme_manager import ThemeManager class BaseWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.theme_manager = ThemeManager.get_instance() self.setup_window() def setup_window(self): """Базовая настройка окна""" # Создаем центральный виджет self.central_widget = QWidget() self.setCentralWidget(self.central_widget) # Основной layout self.main_layout = QVBoxLayout(self.central_widget) self.main_layout.setContentsMargins(0, 0, 0, 0) self.main_layout.setSpacing(0) # Применяем тему self.theme_manager.apply_theme() def animate_window(self, start_geometry: QRect, end_geometry: QRect, duration: int = 300): """Анимация окна""" self.animation = QPropertyAnimation(self, b"geometry") self.animation.setDuration(duration) self.animation.setStartValue(start_geometry) self.animation.setEndValue(end_geometry) self.animation.setEasingCurve(QEasingCurve.Type.OutCubic) self.animation.start() def show_with_animation(self): """Показать окно с анимацией""" # Сохраняем конечную геометрию end_geometry = self.geometry() # Устанавливаем начальную геометрию (уменьшенную и прозрачную) start_geometry = QRect( end_geometry.x() + end_geometry.width() // 2, end_geometry.y() + end_geometry.height() // 2, 0, 0 ) # Запускаем анимацию self.animate_window(start_geometry, end_geometry) super().show() def hide_with_animation(self): """Скрыть окно с анимацией""" # Сохраняем начальную геометрию start_geometry = self.geometry() # Устанавливаем конечную геометрию (уменьшенную и прозрачную) end_geometry = QRect( start_geometry.x() + start_geometry.width() // 2, start_geometry.y() + start_geometry.height() // 2, 0, 0 ) # Запускаем анимацию self.animation = QPropertyAnimation(self, b"geometry") self.animation.setDuration(300) self.animation.setStartValue(start_geometry) self.animation.setEndValue(end_geometry) self.animation.setEasingCurve(QEasingCurve.Type.InCubic) self.animation.finished.connect(super().hide) self.animation.start() def toggle_theme(self): """Переключение темы""" self.theme_manager.toggle_theme()