list_view.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from .screen_objects import ScreenObjectsManager
  2. import logging
  3. import pygame
  4. from .touch_manager import TouchManager
  5. from .touch_manager import TouchEvent
  6. from .screen_objects import *
  7. logger = logging.getLogger(__name__)
  8. class ListView():
  9. def __init__(self, pos, size, base_size, fonts):
  10. self.size = size
  11. self.pos = pos
  12. self.base_size = base_size
  13. self.screen_objects = ScreenObjectsManager()
  14. self.max_rows = self.size[1] / self.base_size
  15. self.current_item = 0
  16. self.fonts = fonts
  17. self.list_size = 0
  18. self.list = []
  19. self.scrollbar = False
  20. self.set_list([])
  21. self.selected = []
  22. def set_list(self, item_list):
  23. self.list = item_list
  24. self.list_size = len(item_list)
  25. if self.max_rows < self.list_size:
  26. self.scrollbar = True
  27. scroll_bar = ScrollBar((self.pos[0]+self.size[0]-self.base_size,self.pos[1]), (self.base_size, self.size[1]),self.list_size,self.max_rows)
  28. self.screen_objects.set_touch_object("scrollbar", scroll_bar)
  29. logger.error("hemen nao")
  30. else:
  31. self.scrollbar = False
  32. self.load_new_item_position(0)
  33. def load_new_item_position(self, item_pos):
  34. self.current_item = item_pos
  35. if self.scrollbar:
  36. self.screen_objects.clear_touch(["scrollbar"])
  37. else:
  38. self.screen_objects.clear_touch(None)
  39. i = self.current_item
  40. z = 0
  41. if self.scrollbar:
  42. width = self.size[0] - self.base_size
  43. else:
  44. width = self.size[0]
  45. while i < self.list_size and z < self.max_rows:
  46. item = TouchAndTextItem(self.fonts['dejavusans'], self.list[i], (self.pos[0], self.pos[1]+self.base_size*z), (width, self.base_size))
  47. self.screen_objects.set_touch_object(str(i), item)
  48. i += 1
  49. z += 1
  50. def render(self, surface):
  51. self.screen_objects.render(surface)
  52. def touch_event(self, touch_event):
  53. if touch_event.type == TouchManager.click:
  54. objects = self.screen_objects.get_touch_objects_in_pos(touch_event.current_pos)
  55. if objects is not None:
  56. for key in objects:
  57. if key == "scrollbar":
  58. direction = self.screen_objects.get_touch_object(key).touch(touch_event.current_pos)
  59. if direction != 0:
  60. self.move_to(direction)
  61. elif touch_event.type == TouchManager.swipe:
  62. if touch_event.direction == TouchManager.up:
  63. self.move_to(-1)
  64. elif touch_event.direction == TouchManager.down:
  65. self.move_to(1)
  66. def move_to(self, direction):
  67. if direction == 1:
  68. self.current_item += self.max_rows
  69. if self.current_item + self.max_rows > self.list_size:
  70. self.current_item = self.list_size - self.max_rows
  71. self.load_new_item_position(self.current_item)
  72. self.screen_objects.get_touch_object("scrollbar").set_item(self.current_item)
  73. elif direction == -1:
  74. self.current_item -= self.max_rows
  75. if self.current_item < 0:
  76. self.current_item = 0
  77. self.load_new_item_position(self.current_item)
  78. self.screen_objects.get_touch_object("scrollbar").set_item(self.current_item)
  79. self.set_selected(self.selected)
  80. def set_selected(self, selected):
  81. for number in self.selected:
  82. try:
  83. self.screen_objects.get_touch_object(str(number)).set_active(False)
  84. except KeyError:
  85. pass
  86. for number in selected:
  87. try:
  88. self.screen_objects.get_touch_object(str(number)).set_active(True)
  89. except KeyError:
  90. pass
  91. self.selected = selected