From f39989b9a0518898a64f6773deaecf4c64f3bd27 Mon Sep 17 00:00:00 2001 From: 9and3r <9and3r@gmai.com> Date: Sat, 19 Jul 2014 23:32:10 +0200 Subject: [PATCH] Progressbar touch to seekb --- mopidy_touchscreen/.idea/workspace.xml | 122 +++++++++++++++++++------ mopidy_touchscreen/main_screen.py | 17 +++- mopidy_touchscreen/screen_manager.py | 26 ++++-- mopidy_touchscreen/screen_objects.py | 22 ++++- mopidy_touchscreen/touch_manager.py | 33 +++++++ mopidy_touchscreen/touch_screen.py | 6 +- 6 files changed, 179 insertions(+), 47 deletions(-) create mode 100644 mopidy_touchscreen/touch_manager.py diff --git a/mopidy_touchscreen/.idea/workspace.xml b/mopidy_touchscreen/.idea/workspace.xml index 3c4cc4f..dbedb36 100644 --- a/mopidy_touchscreen/.idea/workspace.xml +++ b/mopidy_touchscreen/.idea/workspace.xml @@ -26,9 +26,23 @@ - - - + + + + + + + + + + + + + + + + + @@ -36,9 +50,23 @@ - - - + + + + + + + + + + + + + + + + + @@ -46,8 +74,8 @@ - - + + @@ -65,9 +93,11 @@ @@ -342,7 +372,9 @@ - + + + @@ -350,7 +382,9 @@ - + + + @@ -368,7 +402,9 @@ - + + + @@ -376,7 +412,9 @@ - + + + @@ -394,7 +432,9 @@ - + + + @@ -402,7 +442,9 @@ - + + + @@ -420,7 +462,9 @@ - + + + @@ -438,14 +482,16 @@ - + + + - - + + @@ -454,17 +500,41 @@ - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + diff --git a/mopidy_touchscreen/main_screen.py b/mopidy_touchscreen/main_screen.py index fe83580..5234c18 100644 --- a/mopidy_touchscreen/main_screen.py +++ b/mopidy_touchscreen/main_screen.py @@ -16,7 +16,8 @@ logger = logging.getLogger(__name__) class MainScreen(): - def __init__(self,size,manager,cache): + def __init__(self,size,manager,cache,core): + self.core = core self.size = size self.base_size = self.size[1]/12 self.manager = manager @@ -28,14 +29,14 @@ class MainScreen(): self.touch_text_manager.add_touch_object("pause_play","Play",(0,0),(255,255,255)) - def update(self,core): + def update(self): screen = pygame.Surface(self.size) self.background.drawBackground(screen) if self.track is not None: if self.image is not None: screen.blit(self.image, (self.base_size, self.base_size*3)) - self.touch_text_manager.get_touch_object("time_progress").set_value(core.playback.time_position.get()/1000) - self.touch_text_manager.get_object("track_time").set_text(time.strftime('%M:%S', time.gmtime(core.playback.time_position.get()/1000))+"/"+time.strftime('%M:%S', time.gmtime(self.track.length/1000))) + self.touch_text_manager.get_touch_object("time_progress").set_value(self.core.playback.time_position.get()/1000) + self.touch_text_manager.get_object("track_time").set_text(time.strftime('%M:%S', time.gmtime(self.core.playback.time_position.get()/1000))+"/"+time.strftime('%M:%S', time.gmtime(self.track.length/1000))) self.touch_text_manager.render(screen) return screen @@ -92,3 +93,11 @@ class MainScreen(): size = self.base_size*6 self.image = pygame.transform.scale(pygame.image.load(self.getCoverFolder()+self.getImageFileName()).convert(),(size,size)) + def touch_event(self, event): + objects = self.touch_text_manager.get_touch_objects_in_pos(event.current_pos) + logger.error(objects) + if objects is not None: + for key in objects: + if key == "time_progress": + value = self.touch_text_manager.get_touch_object(key).get_pos_value(event.current_pos) * 1000 + self.core.playback.seek(value) \ No newline at end of file diff --git a/mopidy_touchscreen/screen_manager.py b/mopidy_touchscreen/screen_manager.py index 023fdcd..dfef78a 100644 --- a/mopidy_touchscreen/screen_manager.py +++ b/mopidy_touchscreen/screen_manager.py @@ -1,24 +1,30 @@ from .main_screen import MainScreen +from .touch_manager import TouchManager import pygame import logging logger = logging.getLogger(__name__) + class ScreenManager(): + def __init__(self, size, core): + self.screen_size = size + self.screens = [MainScreen(size, self, "/home/ander", core)] + self.track = None + self.touch_manager = TouchManager() + def update(self): + return self.screens[0].update() - def __init__(self,size): - self.screen_size=size - self.screens=[MainScreen(size,self,"/home/ander")] - self.track=None - - def update(self,core): - return self.screens[0].update(core) - - def track_started(self,track): - self.track=track + def track_started(self, track): + self.track = track self.screens[0].track_started(track.track) + def event(self, event): + touch_event = self.touch_manager.event(event) + if touch_event is not None: + self.screens[0].touch_event(touch_event) + diff --git a/mopidy_touchscreen/screen_objects.py b/mopidy_touchscreen/screen_objects.py index a96811c..be8fb4c 100644 --- a/mopidy_touchscreen/screen_objects.py +++ b/mopidy_touchscreen/screen_objects.py @@ -20,13 +20,13 @@ class ScreenObjectsManager(): return self.text_objects[key] def add_touch_object(self, key, text, pos, color): - self.touch_objects['key'] = TouchAndTextItem(text, pos, color, self.base_size) + self.touch_objects[key] = TouchAndTextItem(text, pos, color, self.base_size) def get_touch_object(self,key): - return self.touch_objects['key'] + return self.touch_objects[key] def add_progressbar(self, key, pos, pos2, max): - self.touch_objects['key'] = Progressbar(pos,pos2,max) + self.touch_objects[key] = Progressbar(pos,pos2,max) def render(self, surface): for key in self.text_objects: @@ -35,6 +35,13 @@ class ScreenObjectsManager(): for key in self.touch_objects: self.touch_objects[key].render(surface) + def get_touch_objects_in_pos(self, pos): + objects = [] + for key in self.touch_objects: + if self.touch_objects[key].is_pos_inside(pos): + objects.append(key) + return objects + class BaseItem(): @@ -45,6 +52,7 @@ class BaseItem(): self.size[0] = self.pos2[0] - self.pos[0] self.size[1] = self.pos2[1] - self.pos[1] self.rect = pygame.Rect(0,0,self.size[0],self.size[1]) + self.rect_in_pos = pygame.Rect(self.pos[0],self.pos[1],self.size[0],self.size[1]) class TextItem(BaseItem): @@ -114,6 +122,8 @@ class TouchObject(BaseItem): def render(self,surface): surface.blit(self.background_box, self.pos) + def is_pos_inside(self, pos): + return self.rect_in_pos.collidepoint(pos) class TouchAndTextItem(TouchObject, TextItem): @@ -128,7 +138,7 @@ class TouchAndTextItem(TouchObject, TextItem): TouchObject.render(self,surface) TextItem.render(self,surface) -class Progressbar(BaseItem): +class Progressbar(TouchObject): def __init__(self, pos, pos2, max): BaseItem.__init__(self, pos, pos2) @@ -153,3 +163,7 @@ class Progressbar(BaseItem): rect = pygame.Rect(0,0,pos_pixel,self.size[1]) self.surface.fill(self.main_color, rect) + def get_pos_value(self, pos): + x = pos[0] - self.pos[0] + return x * self.max / self.size[0] + diff --git a/mopidy_touchscreen/touch_manager.py b/mopidy_touchscreen/touch_manager.py new file mode 100644 index 0000000..401257a --- /dev/null +++ b/mopidy_touchscreen/touch_manager.py @@ -0,0 +1,33 @@ +import pygame +import logging + +logger = logging.getLogger(__name__) + + +class TouchManager(): + + click = 1 + + def __init__(self): + self.down_pos = (0, 0) + self.up_pos = (0, 0) + + def event(self, event): + if event.type == pygame.MOUSEBUTTONUP: + return self.mouse_up(event) + elif event.type == pygame.MOUSEBUTTONDOWN: + return None + + def mouse_down(self, event): + self.down_pos = event.pos + + def mouse_up(self,event): + self.up_pos = event.pos + return TouchEvent(TouchManager.click, self.down_pos, self.up_pos) + +class TouchEvent(): + + def __init__(self, event_type, down_pos, current_pos): + self.type = event_type + self.down_pos = down_pos + self.current_pos = current_pos \ No newline at end of file diff --git a/mopidy_touchscreen/touch_screen.py b/mopidy_touchscreen/touch_screen.py index 25a241d..a2c24e4 100644 --- a/mopidy_touchscreen/touch_screen.py +++ b/mopidy_touchscreen/touch_screen.py @@ -21,17 +21,17 @@ class TouchScreen(pykka.ThreadingActor, core.CoreListener): #self.screen_size=(320, 240) self.screen_size=(800, 600) pygame.init() - self.screen_manager = ScreenManager(self.screen_size) + self.screen_manager = ScreenManager(self.screen_size,self.core) def start_thread(self): clock = pygame.time.Clock() screen = pygame.display.set_mode(self.screen_size) while self.running: clock.tick(30) - screen.blit(self.screen_manager.update(self.core),(0,0)) + screen.blit(self.screen_manager.update(),(0,0)) pygame.display.flip() for event in pygame.event.get(): - pass + self.screen_manager.event(event) pygame.quit() def on_start(self):