75 lines
3.0 KiB
Python
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() |