Files
art/modules/styles/base_window.py
T

75 lines
3.0 KiB
Python

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()