add more features, fix auto advance.
This commit is contained in:
parent
6f5a2ca10d
commit
a3e3b75a3f
1 changed files with 78 additions and 6 deletions
|
|
@ -65,7 +65,8 @@ class Animation:
|
||||||
"""
|
"""
|
||||||
Base class for animations.
|
Base class for animations.
|
||||||
"""
|
"""
|
||||||
def __init__(self, pixel_object, speed, color, peers=None):
|
# pylint: disable=too-many-arguments
|
||||||
|
def __init__(self, pixel_object, speed, color, peers=None, paused=False):
|
||||||
self.pixel_object = pixel_object
|
self.pixel_object = pixel_object
|
||||||
self._speed_ns = 0
|
self._speed_ns = 0
|
||||||
self.speed = speed # sets _speed_ns
|
self.speed = speed # sets _speed_ns
|
||||||
|
|
@ -74,6 +75,7 @@ class Animation:
|
||||||
self.pixel_object.auto_write = False
|
self.pixel_object.auto_write = False
|
||||||
self.color = color
|
self.color = color
|
||||||
self.peers = peers if peers else []
|
self.peers = peers if peers else []
|
||||||
|
self._paused = paused
|
||||||
|
|
||||||
def animate(self):
|
def animate(self):
|
||||||
"""
|
"""
|
||||||
|
|
@ -81,6 +83,9 @@ class Animation:
|
||||||
configured by the speed property (set from init).
|
configured by the speed property (set from init).
|
||||||
:return: True if the animation draw cycle was triggered, otherwise False.
|
:return: True if the animation draw cycle was triggered, otherwise False.
|
||||||
"""
|
"""
|
||||||
|
if self._paused:
|
||||||
|
return False
|
||||||
|
|
||||||
now = monotonic_ns()
|
now = monotonic_ns()
|
||||||
if now < self._next_update:
|
if now < self._next_update:
|
||||||
return False
|
return False
|
||||||
|
|
@ -107,6 +112,24 @@ class Animation:
|
||||||
"""
|
"""
|
||||||
self.pixel_object.show()
|
self.pixel_object.show()
|
||||||
|
|
||||||
|
def freeze(self):
|
||||||
|
"""
|
||||||
|
Stops the animation until resumed.
|
||||||
|
"""
|
||||||
|
self._paused = True
|
||||||
|
|
||||||
|
def resume(self):
|
||||||
|
"""
|
||||||
|
Resumes the animation.
|
||||||
|
"""
|
||||||
|
self._paused = False
|
||||||
|
|
||||||
|
def fill(self, color):
|
||||||
|
"""
|
||||||
|
Fills the pixel object with a color.
|
||||||
|
"""
|
||||||
|
self.pixel_object.fill(color)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def color(self):
|
def color(self):
|
||||||
"""
|
"""
|
||||||
|
|
@ -319,24 +342,30 @@ class AnimationSequence:
|
||||||
:param advance_interval: Time in seconds between animations if cycling automatically. Defaults
|
:param advance_interval: Time in seconds between animations if cycling automatically. Defaults
|
||||||
to ``None``.
|
to ``None``.
|
||||||
"""
|
"""
|
||||||
def __init__(self, *members, advance_interval=None):
|
def __init__(self, *members, advance_interval=None, auto_clear=False):
|
||||||
self._members = members
|
self._members = members
|
||||||
self._advance_interval = advance_interval * 1000000000 if advance_interval else None
|
self._advance_interval = advance_interval * 1000000000 if advance_interval else None
|
||||||
self._last_advance = monotonic_ns()
|
self._last_advance = monotonic_ns()
|
||||||
self._current = 0
|
self._current = 0
|
||||||
|
self._auto_clear = auto_clear
|
||||||
|
self.clear_color = BLACK
|
||||||
|
self._paused = False
|
||||||
|
|
||||||
def _auto_advance(self):
|
def _auto_advance(self):
|
||||||
if not self._advance_interval:
|
if not self._advance_interval:
|
||||||
return
|
return
|
||||||
now = monotonic_ns()
|
now = monotonic_ns()
|
||||||
if self._last_advance - now > self._advance_interval:
|
if now - self._last_advance > self._advance_interval:
|
||||||
self._last_advance = now
|
self._last_advance = now
|
||||||
self.next()
|
self.next()
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
|
if self._auto_clear:
|
||||||
|
self.fill(self.clear_color)
|
||||||
self._current = (self._current + 1) % len(self._members)
|
self._current = (self._current + 1) % len(self._members)
|
||||||
|
|
||||||
def animate(self):
|
def animate(self):
|
||||||
|
if not self._paused:
|
||||||
self._auto_advance()
|
self._auto_advance()
|
||||||
self.current_animation.animate()
|
self.current_animation.animate()
|
||||||
|
|
||||||
|
|
@ -352,6 +381,27 @@ class AnimationSequence:
|
||||||
for item in self._members:
|
for item in self._members:
|
||||||
item.change_color(color)
|
item.change_color(color)
|
||||||
|
|
||||||
|
def fill(self, color):
|
||||||
|
"""
|
||||||
|
Fills the current animation with a color.
|
||||||
|
"""
|
||||||
|
self.current_animation.fill(color)
|
||||||
|
|
||||||
|
def freeze(self):
|
||||||
|
"""
|
||||||
|
Freeze the current animation in the sequence.
|
||||||
|
Also stops auto_advance.
|
||||||
|
"""
|
||||||
|
self._paused = True
|
||||||
|
self.current_animation.freeze()
|
||||||
|
|
||||||
|
def resume(self):
|
||||||
|
"""
|
||||||
|
Resume the current animation in the sequence and resumes auto advance
|
||||||
|
if enabled.
|
||||||
|
"""
|
||||||
|
self._paused = False
|
||||||
|
self.current_animation.resume()
|
||||||
|
|
||||||
class AnimationGroup:
|
class AnimationGroup:
|
||||||
"""
|
"""
|
||||||
|
|
@ -371,10 +421,32 @@ class AnimationGroup:
|
||||||
|
|
||||||
return any([item.animate() for item in self._members])
|
return any([item.animate() for item in self._members])
|
||||||
|
|
||||||
|
|
||||||
|
def _for_all(self, method, *args, **kwargs):
|
||||||
|
for item in self._members:
|
||||||
|
getattr(item, method)(*args, **kwargs)
|
||||||
|
|
||||||
def change_color(self, color):
|
def change_color(self, color):
|
||||||
"""
|
"""
|
||||||
Change the color of all members that support setting the color with change_color.
|
Change the color of all members that support setting the color with change_color.
|
||||||
Ignored by animations that do not support it.
|
Ignored by animations that do not support it.
|
||||||
"""
|
"""
|
||||||
for item in self._members:
|
self._for_all('change_color', color)
|
||||||
item.change_color(color)
|
|
||||||
|
def fill(self, color):
|
||||||
|
"""
|
||||||
|
Fills all pixel objects in the group with a color.
|
||||||
|
"""
|
||||||
|
self._for_all('fill', color)
|
||||||
|
|
||||||
|
def freeze(self):
|
||||||
|
"""
|
||||||
|
Freeze all animations in the group.
|
||||||
|
"""
|
||||||
|
self._for_all('freeze')
|
||||||
|
|
||||||
|
def resume(self):
|
||||||
|
"""
|
||||||
|
Resume all animations in the group.
|
||||||
|
"""
|
||||||
|
self._for_all('resume')
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue