| 8 | |
| 9 | |
| 10 | class AnimationHandler: |
| 11 | def __init__(self, widget, startv, endv, type): |
| 12 | self.widget = widget |
| 13 | self.type = type |
| 14 | self.startv = startv |
| 15 | self.endv = endv |
| 16 | self.value = 0 |
| 17 | self.speed = 3.45 |
| 18 | self.sensitivity = 0.001 |
| 19 | self.reverse = False |
| 20 | self.loop = False |
| 21 | self.started = None |
| 22 | self._tickfunc = None |
| 23 | |
| 24 | def tick(self, func): |
| 25 | self._tickfunc = func |
| 26 | return func |
| 27 | |
| 28 | def start(self, reverse=False, loop=False): |
| 29 | self.reverse = reverse |
| 30 | self.loop = loop |
| 31 | self.started = True |
| 32 | self.orgstart_time = time.time() |
| 33 | self.value = 0 |
| 34 | self.widget.update() |
| 35 | |
| 36 | def done(self): |
| 37 | return self.started is None |
| 38 | |
| 39 | def update(self): |
| 40 | if not self.done(): |
| 41 | ep = time.time() - self.orgstart_time |
| 42 | self.value = self.type(ep * self.speed) |
| 43 | |
| 44 | if self.reverse: |
| 45 | if self.current() <= self.startv + self.sensitivity: self.started = None |
| 46 | else: |
| 47 | if self.current() >= self.endv - self.sensitivity: self.started = None |
| 48 | if self.done(): |
| 49 | if self.loop: |
| 50 | self.start(reverse=not self.reverse, loop=True) |
| 51 | return |
| 52 | if self._tickfunc: |
| 53 | self._tickfunc() |
| 54 | |
| 55 | def current(self): |
| 56 | if self.reverse: |
| 57 | return self.endv - (self.value * (self.endv-self.startv)) |
| 58 | else: |
| 59 | return self.value * (self.endv-self.startv) |
| 60 | |
| 61 | |
| 62 | |