list_view.py 4.6 KB

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