list_view.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. logger = logging.getLogger(__name__)
  7. class ListView():
  8. def __init__(self, pos, size, base_size,fonts):
  9. self.size = size
  10. self.pos = pos
  11. self.base_size = base_size
  12. self.screen_objects = ScreenObjectsManager(self.base_size)
  13. self.max_rows = self.size[1] / self.base_size
  14. self.current_item = 0
  15. self.fonts = fonts
  16. self.list_size = 0
  17. self.list = []
  18. self.scrollbar = False
  19. self.set_list([])
  20. def set_list(self, item_list):
  21. self.list = item_list
  22. self.list_size = len(item_list)
  23. if self.max_rows < self.list_size:
  24. self.scrollbar = True
  25. self.screen_objects.add_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)
  26. else:
  27. self.scrollbar = False
  28. self.load_new_item_position(0)
  29. def load_new_item_position(self, item_pos):
  30. self.current_item = item_pos
  31. if self.scrollbar:
  32. self.screen_objects.clear("scrollbar")
  33. else:
  34. self.screen_objects.clear(None)
  35. i = self.current_item
  36. z = 0
  37. while i < self.list_size and z < self.max_rows:
  38. self.screen_objects.add_touch_object(str(i),self.fonts['dejavusans'], str(self.list[i]), (self.pos[0],self.pos[1]+self.base_size*z),None, (255, 255, 255))
  39. i += 1
  40. z += 1
  41. def render(self, surface):
  42. self.screen_objects.render(surface)
  43. def touch_event(self, touch_event):
  44. if touch_event.type == TouchManager.click:
  45. objects = self.screen_objects.get_touch_objects_in_pos(touch_event.current_pos)
  46. if objects is not None:
  47. for key in objects:
  48. if key == "scrollbar":
  49. direction = self.screen_objects.get_touch_object(key).touch(touch_event.current_pos)
  50. if direction != 0:
  51. self.move_to(direction)
  52. def move_to(self, direction):
  53. if direction == 1:
  54. self.current_item += self.max_rows
  55. if self.current_item + self.max_rows > self.list_size:
  56. self.current_item = self.list_size - self.max_rows
  57. self.load_new_item_position(self.current_item)
  58. self.screen_objects.get_touch_object("scrollbar").set_item(self.current_item)
  59. elif direction == -1:
  60. self.current_item -= self.max_rows
  61. if self.current_item < 0:
  62. self.current_item = 0
  63. self.load_new_item_position(self.current_item)
  64. self.screen_objects.get_touch_object("scrollbar").set_item(self.current_item)