signage-ng/signage/fader.py

76 lines
2.3 KiB
Python

import time
import random
from kivy.clock import Clock
from kivy.uix.screenmanager import ScreenManager, FadeTransition
from kivy.uix.screenmanager import Screen as BaseScreen
from kivy.properties import NumericProperty
class Node(BaseScreen):
interval = NumericProperty(0.0)
Screen = Node
class Fader(ScreenManager):
interval = NumericProperty(5.0)
view_start = NumericProperty(5.0)
_interval = None
def __init__(self, **kwargs):
super(Fader, self).__init__(**kwargs)
if 'transition' not in kwargs:
self.transition = FadeTransition()
from kivy.graphics import Color, Rectangle
with self.canvas.after:
Color(1., 1., 1., 0.2)
self.progress_rect = Rectangle(pos=self.pos, size=self.size)
self.bind(pos=self.update_rect)
self.bind(size=self.update_rect)
self.progress_interval = Clock.schedule_interval(self.update_rect, 0)
self.rotate_screens(0)
def update_rect(self, *args):
progress = ((time.time() - self.view_start)/self.current_interval)
self.progress_rect.pos = self.pos
self.progress_rect.size = (self.size[0] * progress, 10)
def on_interval(self, instance, value):
if self._interval:
self._interval.cancel()
self._interval = Clock.schedule_once(
self.rotate_screens, self.current_interval)
def add_widget(self, screen):
"""Just wrap everything in Screen"""
if not isinstance(screen, Screen):
print ('Wrapping!')
s = Screen()
s.add_widget(screen)
screen = s
return super(Fader, self).add_widget(screen)
def generate_ids(self):
"""Generates random IDs for all screens without set name"""
for c in self.screens:
if not c.name:
c.name = 'screen_%.4f' % (random.random())
def rotate_screens(self, dt):
self.generate_ids()
self.current = self.next()
self.view_start = time.time()
self._interval = Clock.schedule_once(
self.rotate_screens, self.current_interval)
@property
def current_interval(self):
if self.current_screen and self.current_screen.interval:
return self.current_screen.interval
return self.interval