diff --git a/mopidy_touchscreen/.idea/workspace.xml b/mopidy_touchscreen/.idea/workspace.xml index 4c57dca..647ff75 100644 --- a/mopidy_touchscreen/.idea/workspace.xml +++ b/mopidy_touchscreen/.idea/workspace.xml @@ -23,16 +23,62 @@ - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -48,11 +94,11 @@ @@ -293,11 +339,11 @@ - + - + @@ -326,7 +372,9 @@ - + + + @@ -349,7 +397,9 @@ - + + + @@ -387,7 +437,9 @@ - + + + @@ -417,7 +469,9 @@ - + + + @@ -455,7 +509,9 @@ - + + + @@ -486,7 +542,9 @@ - + + + @@ -524,7 +582,9 @@ - + + + @@ -663,50 +723,57 @@ + + + + + + + + - - + + + + + - - - - - - - - - - - - - - - - - - + + - - + + - + - - - + + + + + + + + + + + + + + + diff --git a/mopidy_touchscreen/list_view.py b/mopidy_touchscreen/list_view.py index e19b54f..56784c0 100644 --- a/mopidy_touchscreen/list_view.py +++ b/mopidy_touchscreen/list_view.py @@ -1,6 +1,8 @@ from .screen_objects import ScreenObjectsManager import logging import pygame +from .touch_manager import TouchManager +from .touch_manager import TouchEvent logger = logging.getLogger(__name__) @@ -16,6 +18,7 @@ class ListView(): self.fonts = fonts self.list_size = 0 self.list = [] + self.scrollbar = False self.set_list([]) @@ -23,20 +26,52 @@ class ListView(): def set_list(self, item_list): self.list = item_list self.list_size = len(item_list) + if self.max_rows < self.list_size: + self.scrollbar = True + 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) + else: + self.scrollbar = False self.load_new_item_position(0) - logger.error(self.list_size) - self.screen_objects.add_scroll_bar("scroll", (self.pos[0]+self.size[0]-self.base_size,self.pos[1]), (self.base_size, self.size[1]),self.list_size,self.max_rows) def load_new_item_position(self, item_pos): self.current_item = item_pos + if self.scrollbar: + self.screen_objects.clear("scrollbar") + else: + self.screen_objects.clear(None) i = self.current_item - logger.error(self.max_rows) - while i < self.list_size and i - self.current_item < self.max_rows: - self.screen_objects.add_touch_object(str(i),self.fonts['dejavusans'], str(self.list[i]), (self.pos[0],self.pos[1]+self.base_size*i),None, (255, 255, 255)) + z = 0 + while i < self.list_size and z < self.max_rows: + 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)) i += 1 + z += 1 def render(self, surface): self.screen_objects.render(surface) + def touch_event(self, touch_event): + if touch_event.type == TouchManager.click: + objects = self.screen_objects.get_touch_objects_in_pos(touch_event.current_pos) + if objects is not None: + for key in objects: + if key == "scrollbar": + direction = self.screen_objects.get_touch_object(key).touch(touch_event.current_pos) + if direction != 0: + self.move_to(direction) + + + def move_to(self, direction): + if direction == 1: + self.current_item += self.max_rows + if self.current_item + self.max_rows > self.list_size: + self.current_item = self.list_size - self.max_rows + self.load_new_item_position(self.current_item) + self.screen_objects.get_touch_object("scrollbar").set_item(self.current_item) + elif direction == -1: + self.current_item -= self.max_rows + if self.current_item < 0: + self.current_item = 0 + self.load_new_item_position(self.current_item) + self.screen_objects.get_touch_object("scrollbar").set_item(self.current_item) diff --git a/mopidy_touchscreen/screen_manager.py b/mopidy_touchscreen/screen_manager.py index 35c6bf2..19e8bf3 100644 --- a/mopidy_touchscreen/screen_manager.py +++ b/mopidy_touchscreen/screen_manager.py @@ -82,7 +82,7 @@ class ScreenManager(): logger.error(self.core.tracklist.random) self.core.tracklist.random = not self.core.tracklist.random #self.backend.tell({'action':'random','value':random}) - self.screens[0].touch_event(touch_event) + self.screens[self.current_screen].touch_event(touch_event) def volume_changed(self, volume): self.screen_objects_manager.get_touch_object("volume").set_value(volume) diff --git a/mopidy_touchscreen/screen_objects.py b/mopidy_touchscreen/screen_objects.py index 90e9073..7e7d140 100644 --- a/mopidy_touchscreen/screen_objects.py +++ b/mopidy_touchscreen/screen_objects.py @@ -1,13 +1,13 @@ import pygame import logging +import math logger = logging.getLogger(__name__) + class ScreenObjectsManager(): - - - def __init__(self,base_size): + def __init__(self, base_size): self.base_size = base_size self.touch_objects = {} self.text_objects = {} @@ -45,6 +45,13 @@ class ScreenObjectsManager(): objects.append(key) return objects + def clear(self, mantain): + if mantain is not None: + object = self.get_touch_object(mantain) + self.touch_objects = {} + if mantain is not None: + self.touch_objects[mantain] = object + class BaseItem(): @@ -88,7 +95,6 @@ class TextItem(BaseItem): self.fit_horizontal = True self.fit_vertical = True - def update(self): if not self.fit_horizontal: if self.text == self.original_text: @@ -105,7 +111,7 @@ class TextItem(BaseItem): new_text = new_text + self.text[:1] self.text = new_text else: - self.step = self.step + 1 + self.step += 1 def render(self,surface): if self.fit_horizontal: @@ -120,6 +126,7 @@ class TextItem(BaseItem): else: TextItem.__init__(self, self.font, text, self.pos, self.pos2, self.color, self.text_size) + class TouchObject(BaseItem): def __init__(self,pos,pos2): @@ -132,6 +139,7 @@ class TouchObject(BaseItem): def set_active(self, active): self.active = active + class TouchAndTextItem(TouchObject, TextItem): def __init__(self, font, text, pos, pos2, color,text_size): @@ -149,6 +157,7 @@ class TouchAndTextItem(TouchObject, TextItem): color = (255,255,255) TextItem.__init__(self.font,self.text,self.pos,self.pos2,color,self.text_size) + class Progressbar(TouchObject, TextItem): def __init__(self,font,text, pos, pos2, max,size, value_text): @@ -192,9 +201,11 @@ class Progressbar(TouchObject, TextItem): def set_text(self, text): self.text.set_text(text , True) + class ScrollBar(TouchObject): def __init__(self, pos, size, max, items_on_screen): + BaseItem.__init__(self, pos, (pos[0]+size[0],pos[1]+size[1])) self.pos = pos self.size = size self.max = max @@ -202,14 +213,27 @@ class ScrollBar(TouchObject): self.current_item = 0 self.back_bar = pygame.Surface(self.size) self.back_bar.fill((255,255,255)) + self.bar_pos = 0 if self.max < 1: self.barsize = self.size[1] else: - self.barsize = float(self.items_on_screen)/float(self.max) * float(self.size[1]) - logger.error(self.barsize) + self.barsize = math.ceil(float(self.items_on_screen)/float(self.max) * float(self.size[1])) self.bar = pygame.Surface((self.size[0],self.barsize)) - self.bar.fill((255,255,0)) + self.bar.fill((255, 255, 0)) def render(self, surface): surface.blit(self.back_bar, self.pos) - surface.blit(self.bar,self.pos) \ No newline at end of file + surface.blit(self.bar, (self.pos[0], self.pos[1]+self.bar_pos)) + + def touch(self, pos): + if pos[1] < self.pos[1]+self.bar_pos: + return -1 + elif pos[1] > self.pos[1] + self.bar_pos + self.barsize: + return 1 + else: + return 0 + + def set_item(self, current_item): + logger.error(current_item) + self.current_item = current_item + self.bar_pos = float(self.current_item)/float(self.max) * float(self.size[1]) \ No newline at end of file diff --git a/mopidy_touchscreen/tracklist.py b/mopidy_touchscreen/tracklist.py index aa8dd2f..0dc94f7 100644 --- a/mopidy_touchscreen/tracklist.py +++ b/mopidy_touchscreen/tracklist.py @@ -7,10 +7,13 @@ class Tracklist(): self.size = size self.base_size = base_size self.list_view = ListView((0,self.base_size),(self.size[0],self.size[1]-2*self.base_size), self.base_size, manager.fonts) - self.list_view.set_list(["track 1","track 2","track 1","track 2","track 1","track 2","track 1","track 2","track 1","track 2"]) + self.list_view.set_list(["track 1","track 2","track 3","track 4","track 5","track 6","track 7","track 8","track 9","track 10","track 11","track 12","track 13","track 14"]) def update(self, screen): pass def update(self, screen): - self.list_view.render(screen) \ No newline at end of file + self.list_view.render(screen) + + def touch_event(self, touch_event): + self.list_view.touch_event(touch_event) \ No newline at end of file