You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

73 lines
1.9 KiB

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