list_view.py 4.1 KB

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