76 lines
2.3 KiB
Python
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
|