Files
mopidy-touchscreen/mopidy_touchscreen/graphic_utils/view_pager.py
2015-07-14 12:53:31 +02:00

90 lines
3.2 KiB
Python

__author__ = 'ander'
from ..screens.base_screen import BaseScreen
import traceback
class ViewPager:
def __init__(self, size, manager):
self.size = size
self.objets_manager = [manager.create_objects_manager(), manager.create_objects_manager(), manager.create_objects_manager()]
self.pos = 0
self.manager = manager
self.next = False
self.direction = 0
self.previous = False
self.speed = self.size[0] / 15
self.update = False
self.update_rects = []
def notify_changed(self):
try:
for i in range(0, 3, 1):
self.manager.set_page_values(self.objets_manager[i], i)
self.update = True
except:
traceback.print_exc()
def change_to_page(self, page):
self.direction = page
self.update = True
def should_update(self):
if self.update or len(self.update_rects) > 0:
return BaseScreen.update_partial
else:
return BaseScreen.no_update
def set_update_rects(self, rects):
if self.update or self.direction != 0:
rects += self.objets_manager[0].get_update_rects(True)
rects += self.objets_manager[1].get_update_rects(True)
rects += self.objets_manager[2].get_update_rects(True)
self.shift()
rects += self.objets_manager[0].get_update_rects(True)
rects += self.objets_manager[1].get_update_rects(True)
rects += self.objets_manager[2].get_update_rects(True)
rects += self.update_rects
def shift(self):
if self.direction == 1:
if -self.pos > self.size[0]:
self.pos = 0
self.direction = 0
aux = self.objets_manager[0]
self.objets_manager[0] = self.objets_manager[1]
self.objets_manager[1] = self.objets_manager[2]
self.objets_manager[2] = aux
self.notify_changed()
else:
self.pos -= self.speed
self.objets_manager[2].set_horizontal_shift(self.size[0] + self.pos)
self.objets_manager[1].set_horizontal_shift(self.pos)
elif self.direction == -1:
if self.pos > self.size[0]:
self.pos = 0
self.direction = 0
aux = self.objets_manager[2]
self.objets_manager[2] = self.objets_manager[1]
self.objets_manager[1] = self.objets_manager[0]
self.objets_manager[0] = aux
self.notify_changed()
else:
self.pos += self.speed
self.objets_manager[0].set_horizontal_shift(-self.size[0] + self.pos)
self.objets_manager[1].set_horizontal_shift(self.pos)
def render(self, screen, update_type):
if self.direction != 0:
self.shift()
if self.pos != 0:
if self.direction == 1:
self.objets_manager[2].render(screen)
elif self.direction == -1:
self.objets_manager[0].render(screen)
else:
self.update = False
self.update_rects = self.objets_manager[1].get_update_rects(False)
self.objets_manager[1].render(screen)