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