from PyQt6.QtWidgets import QWidget, QStackedWidget, QVBoxLayout from PyQt6.QtCore import QPropertyAnimation, QParallelAnimationGroup, QEasingCurve, Qt, QPoint from .theme import Theme, Colors from .theme_manager import ThemeManager class BasePage(QWidget): def __init__(self, parent=None): super().__init__(parent) self.theme_manager = ThemeManager.get_instance() self.setup_ui() def setup_ui(self): """Базовая настройка страницы""" colors = self.theme_manager.current_theme.get_colors() self.setStyleSheet(f""" QWidget {{ background-color: {colors['background']}; }} """) # Основной layout self.layout = QVBoxLayout(self) self.layout.setContentsMargins(24, 24, 24, 24) self.layout.setSpacing(16) def enter_animation(self): """Анимация появления страницы""" # Создаем группу анимаций self.anim_group = QParallelAnimationGroup() # Анимация прозрачности fade_anim = QPropertyAnimation(self, b"windowOpacity") fade_anim.setStartValue(0.0) fade_anim.setEndValue(1.0) fade_anim.setDuration(200) fade_anim.setEasingCurve(QEasingCurve.Type.OutCubic) # Анимация сдвига pos_anim = QPropertyAnimation(self, b"pos") start_pos = self.pos() pos_anim.setStartValue(start_pos + QPoint(20, 0)) pos_anim.setEndValue(start_pos) pos_anim.setDuration(200) pos_anim.setEasingCurve(QEasingCurve.Type.OutCubic) # Добавляем анимации в группу self.anim_group.addAnimation(fade_anim) self.anim_group.addAnimation(pos_anim) # Запускаем анимацию self.anim_group.start() def leave_animation(self): """Анимация исчезновения страницы""" # Создаем группу анимаций self.anim_group = QParallelAnimationGroup() # Анимация прозрачности fade_anim = QPropertyAnimation(self, b"windowOpacity") fade_anim.setStartValue(1.0) fade_anim.setEndValue(0.0) fade_anim.setDuration(200) fade_anim.setEasingCurve(QEasingCurve.Type.InCubic) # Анимация сдвига pos_anim = QPropertyAnimation(self, b"pos") start_pos = self.pos() pos_anim.setStartValue(start_pos) pos_anim.setEndValue(start_pos - QPoint(20, 0)) pos_anim.setDuration(200) pos_anim.setEasingCurve(QEasingCurve.Type.InCubic) # Добавляем анимации в группу self.anim_group.addAnimation(fade_anim) self.anim_group.addAnimation(pos_anim) # Запускаем анимацию self.anim_group.start() class PageContainer(QStackedWidget): def __init__(self, parent=None): super().__init__(parent) self.pages = {} def add_page(self, name: str, page: BasePage): """Добавление новой страницы""" self.pages[name] = page self.addWidget(page) def show_page(self, name: str): """Показ страницы по имени""" if name in self.pages: # Запускаем анимацию исчезновения текущей страницы current_page = self.currentWidget() if isinstance(current_page, BasePage): current_page.leave_animation() # Показываем новую страницу new_page = self.pages[name] self.setCurrentWidget(new_page) # Запускаем анимацию появления новой страницы new_page.enter_animation()