# coding: utf-8 from PySide6.QtCore import QEasingCurve, QEvent, QObject, QPropertyAnimation, Property, Signal from PySide6.QtGui import QMouseEvent, QEnterEvent from PySide6.QtWidgets import QWidget class AnimationBase(QObject): """ Animation base class """ def __init__(self, parent: QWidget): super().__init__(parent=parent) parent.installEventFilter(self) def _onHover(self, e: QEnterEvent): pass def _onLeave(self, e: QEvent): pass def _onPress(self, e: QMouseEvent): pass def _onRelease(self, e: QMouseEvent): pass def eventFilter(self, obj, e: QEvent): if obj is self.parent(): if e.type() == QEvent.MouseButtonPress: self._onPress(e) elif e.type() == QEvent.MouseButtonRelease: self._onRelease(e) elif e.type() == QEvent.Enter: self._onHover(e) elif e.type() == QEvent.Leave: self._onLeave(e) return super().eventFilter(obj, e) class TranslateYAnimation(AnimationBase): valueChanged = Signal(float) def __init__(self, parent: QWidget, offset=2): super().__init__(parent) self._y = 0 self.maxOffset = offset self.ani = QPropertyAnimation(self, b'y', self) def getY(self): return self._y def setY(self, y): self._y = y self.parent().update() self.valueChanged.emit(y) def _onPress(self, e): """ arrow down """ self.ani.setEndValue(self.maxOffset) self.ani.setEasingCurve(QEasingCurve.OutQuad) self.ani.setDuration(150) self.ani.start() def _onRelease(self, e): """ arrow up """ self.ani.setEndValue(0) self.ani.setDuration(500) self.ani.setEasingCurve(QEasingCurve.OutElastic) self.ani.start() y = Property(float, getY, setY)