view_pager.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. __author__ = 'ander'
  2. from ..screens.base_screen import BaseScreen
  3. import traceback
  4. class ViewPager:
  5. def __init__(self, size, manager):
  6. self.size = size
  7. self.objets_manager = [manager.create_objects_manager(), manager.create_objects_manager(), manager.create_objects_manager()]
  8. self.pos = 0
  9. self.manager = manager
  10. self.next = False
  11. self.direction = 0
  12. self.previous = False
  13. self.speed = self.size[0] / 15
  14. self.update = False
  15. self.update_rects = []
  16. def notify_changed(self):
  17. try:
  18. for i in range(0, 3, 1):
  19. self.manager.set_page_values(self.objets_manager[i], i)
  20. self.update = True
  21. except:
  22. traceback.print_exc()
  23. def change_to_page(self, page):
  24. self.direction = page
  25. self.update = True
  26. def should_update(self):
  27. if self.update or len(self.update_rects) > 0:
  28. return BaseScreen.update_partial
  29. else:
  30. return BaseScreen.no_update
  31. def set_update_rects(self, rects):
  32. if self.update or self.direction != 0:
  33. rects += self.objets_manager[0].get_update_rects(True)
  34. rects += self.objets_manager[1].get_update_rects(True)
  35. rects += self.objets_manager[2].get_update_rects(True)
  36. self.shift()
  37. rects += self.objets_manager[0].get_update_rects(True)
  38. rects += self.objets_manager[1].get_update_rects(True)
  39. rects += self.objets_manager[2].get_update_rects(True)
  40. rects += self.update_rects
  41. def shift(self):
  42. if self.direction == 1:
  43. if -self.pos > self.size[0]:
  44. self.pos = 0
  45. self.direction = 0
  46. aux = self.objets_manager[0]
  47. self.objets_manager[0] = self.objets_manager[1]
  48. self.objets_manager[1] = self.objets_manager[2]
  49. self.objets_manager[2] = aux
  50. self.notify_changed()
  51. else:
  52. self.pos -= self.speed
  53. self.objets_manager[2].set_horizontal_shift(self.size[0] + self.pos)
  54. self.objets_manager[1].set_horizontal_shift(self.pos)
  55. elif self.direction == -1:
  56. if self.pos > self.size[0]:
  57. self.pos = 0
  58. self.direction = 0
  59. aux = self.objets_manager[2]
  60. self.objets_manager[2] = self.objets_manager[1]
  61. self.objets_manager[1] = self.objets_manager[0]
  62. self.objets_manager[0] = aux
  63. self.notify_changed()
  64. else:
  65. self.pos += self.speed
  66. self.objets_manager[0].set_horizontal_shift(-self.size[0] + self.pos)
  67. self.objets_manager[1].set_horizontal_shift(self.pos)
  68. def render(self, screen, update_type):
  69. if self.direction != 0:
  70. self.shift()
  71. if self.pos != 0:
  72. if self.direction == 1:
  73. self.objets_manager[2].render(screen)
  74. elif self.direction == -1:
  75. self.objets_manager[0].render(screen)
  76. else:
  77. self.update = False
  78. self.update_rects = self.objets_manager[1].get_update_rects(False)
  79. self.objets_manager[1].render(screen)