From 38304996ca6b79fb983cbbc17ed0b076c4e60b5d Mon Sep 17 00:00:00 2001 From: Ander <9and3r@gmail.com> Date: Thu, 18 Dec 2014 01:27:23 +0100 Subject: [PATCH] Search updates Text items can be centered --- mopidy_touchscreen/screen_manager.py | 15 ++-- mopidy_touchscreen/screen_objects.py | 23 +++-- mopidy_touchscreen/search_screen.py | 124 +++++++++++++++++++++------ 3 files changed, 122 insertions(+), 40 deletions(-) diff --git a/mopidy_touchscreen/screen_manager.py b/mopidy_touchscreen/screen_manager.py index 53e7d6a..8c2b941 100644 --- a/mopidy_touchscreen/screen_manager.py +++ b/mopidy_touchscreen/screen_manager.py @@ -41,7 +41,7 @@ class ScreenManager(): self.fonts['icon'] = pygame.font.Font(font, self.base_size) try: self.screens = [ - SearchScreen(size, self.base_size, self), + SearchScreen(size, self.base_size, self, self.fonts), MainScreen(size, self, cache, core, self.fonts), Tracklist(size, self.base_size, self), LibraryScreen(size, self.base_size, self), @@ -64,41 +64,42 @@ class ScreenManager(): # Search button button = TouchAndTextItem(self.fonts['icon'], u" \ue986", (0, self.base_size * 7), - button_size) + button_size, center=True) self.down_bar_objects.set_touch_object("menu_0", button) x = button.get_right_pos() # Main button button = TouchAndTextItem(self.fonts['icon'], u" \ue600", (x, self.base_size * 7), - button_size) + button_size, center=True) self.down_bar_objects.set_touch_object("menu_1", button) x = button.get_right_pos() # Tracklist button button = TouchAndTextItem(self.fonts['icon'], u" \ue60d", (x, self.base_size * 7), - button_size) + button_size, center=True) self.down_bar_objects.set_touch_object("menu_2", button) x = button.get_right_pos() # Library button button = TouchAndTextItem(self.fonts['icon'], u" \ue604", (x, self.base_size * 7), - button_size) + button_size, center=True) self.down_bar_objects.set_touch_object("menu_3", button) x = button.get_right_pos() # Playlist button button = TouchAndTextItem(self.fonts['icon'], u" \ue605", (x, self.base_size * 7), - button_size) + button_size, center=True) + self.down_bar_objects.set_touch_object("menu_4", button) x = button.get_right_pos() # Menu button button = TouchAndTextItem(self.fonts['icon'], u" \ue60a", - (x, self.base_size * 7), None) + (x, self.base_size * 7), button_size, center=True) self.down_bar_objects.set_touch_object("menu_5", button) # Down bar diff --git a/mopidy_touchscreen/screen_objects.py b/mopidy_touchscreen/screen_objects.py index c7fe782..02ee4dd 100644 --- a/mopidy_touchscreen/screen_objects.py +++ b/mopidy_touchscreen/screen_objects.py @@ -214,7 +214,7 @@ class BaseItem(): class TextItem(BaseItem): - def __init__(self, font, text, pos, size): + def __init__(self, font, text, pos, size, center=False): self.font = font self.text = text self.color = (255, 255, 255) @@ -242,6 +242,11 @@ class TextItem(BaseItem): else: self.fit_horizontal = True self.fit_vertical = True + self.margin = 0 + self.center = center + if self.center: + if self.fit_horizontal: + self.margin = (self.size[0]-self.box.get_rect().width)/2 def update(self): if not self.fit_horizontal: @@ -255,7 +260,7 @@ class TextItem(BaseItem): def render(self, surface): if self.fit_horizontal: - surface.blit(self.box, self.pos, area=self.rect) + surface.blit(self.box, ((self.pos[0] + self.margin), self.pos[1]), area=self.rect) else: surface.blit(self.box, self.pos, area=pygame.Rect(self.step, 0, self.size[0], @@ -266,10 +271,10 @@ class TextItem(BaseItem): if text != self.text: if change_size: TextItem.__init__(self, self.font, text, self.pos, - None) + None, self.center) else: TextItem.__init__(self, self.font, text, self.pos, - self.size) + self.size, self.center) class TouchObject(BaseItem): @@ -289,8 +294,8 @@ class TouchObject(BaseItem): class TouchAndTextItem(TouchObject, TextItem): - def __init__(self, font, text, pos, size): - TextItem.__init__(self, font, text, pos, size) + def __init__(self, font, text, pos, size, center=False): + TextItem.__init__(self, font, text, pos, size, center=center) TouchObject.__init__(self, pos, self.size) self.active_color = (0, 150, 255) self.selected_color = (150, 0, 255) @@ -314,11 +319,11 @@ class TouchAndTextItem(TouchObject, TextItem): self.rect = pygame.Rect(self.step, 0, self.size[0], self.size[1]) if self.selected: - surface.blit(self.selected_box, self.pos, area=self.rect) + surface.blit(self.selected_box, (self.pos[0]+self.margin, self.pos[1]), area=self.rect) elif self.active: - surface.blit(self.active_box, self.pos, area=self.rect) + surface.blit(self.active_box, (self.pos[0]+self.margin, self.pos[1]), area=self.rect) else: - surface.blit(self.box, self.pos, area=self.rect) + surface.blit(self.box, (self.pos[0]+self.margin, self.pos[1]), area=self.rect) class Progressbar(TouchObject): diff --git a/mopidy_touchscreen/search_screen.py b/mopidy_touchscreen/search_screen.py index 2cea803..4be8d7a 100644 --- a/mopidy_touchscreen/search_screen.py +++ b/mopidy_touchscreen/search_screen.py @@ -1,50 +1,116 @@ from .list_view import ListView import logging +import pygame + +from .screen_objects import Progressbar, ScreenObjectsManager, \ + TouchAndTextItem, TextItem + logger = logging.getLogger(__name__) + mode_track_name = 0 mode_album_name = 1 mode_artist_name = 2 class SearchScreen(): - def __init__(self, size, base_size, manager): + def __init__(self, size, base_size, manager, fonts): self.size = size self.base_size = base_size self.manager = manager - self.list_view = ListView((0, self.base_size), ( - self.size[0], self.size[1] - 2*self.base_size), + self.fonts = fonts + self.list_view = ListView((0, self.base_size*2), ( + self.size[0], self.size[1] - 3*self.base_size), self.base_size, manager.fonts['base']) self.results_strings = [] self.results = [] + self.screen_objects = ScreenObjectsManager() + self.query = "" + + # Query text + text = TextItem(self.fonts['base'],self.query, (0, 0), (self.size[0], self.base_size), center=True) + self.screen_objects.set_object("query", text) + + # Mode buttons + button_size = (self.size[0] / 3, self.base_size) + self.mode_objects_keys = ["mode_track", "mode_album", "mode_artist"] + + # Track button + button = TouchAndTextItem(self.fonts['base'], "Track", + (0, self.base_size), + button_size, center=True) + self.screen_objects.set_touch_object(self.mode_objects_keys[0], button) + + # Album button + button = TouchAndTextItem(self.fonts['base'], "Album", + (button_size[0], self.base_size), + button_size, center=True) + self.screen_objects.set_touch_object(self.mode_objects_keys[1], button) + + # Artist button + button = TouchAndTextItem(self.fonts['base'], "Artist", + (button_size[0]*2, self.base_size), + button_size, center=True) + self.screen_objects.set_touch_object(self.mode_objects_keys[2], button) + + + # Top Bar + self.top_bar = pygame.Surface( + (self.size[0], self.base_size * 2), + pygame.SRCALPHA) + self.top_bar.fill((0, 0, 0, 128)) + + self.mode = -100 + self.set_mode(mode=mode_track_name) + self.set_query("") def update(self, screen, update_all): + screen.blit(self.top_bar, (0, 0)) + self.screen_objects.render(screen) self.list_view.render(screen) - def search(self, query, mode): - if mode == mode_track_name: - search_query = {'any': [query]} - elif mode == mode_album_name: - search_query = {'album': [query]} - else: - search_query = {'artist': [query]} - current_results = self.manager.core.library.search(search_query).get() - self.results = [] - self.results_strings = [] - for backend in current_results: - if mode == mode_track_name: - iterable = backend.tracks - elif mode == mode_album_name: - iterable = backend.albums - else: - iterable = backend.artists + def set_mode(self, mode=mode_track_name): + if mode is not self.mode: + self.mode = mode + for key in self.mode_objects_keys: + self.screen_objects.get_touch_object(key).set_active(False) + self.screen_objects.get_touch_object(self.mode_objects_keys[self.mode]).set_active(True) + + def set_query(self, query=""): + self.query = query + self.screen_objects.get_object("query").set_text(self.query, False) + + def search(self, query=None, mode=None): + if query is not None: + self.set_query(query) + if mode is not None: + self.set_mode(mode) + if self.mode == mode_track_name: + search_query = {'any': [self.query]} + elif self.mode == mode_album_name: + search_query = {'album': [self.query]} + else: + search_query = {'artist': [self.query]} + if len(self.query)>0: + current_results = self.manager.core.library.search(search_query).get() + self.results = [] + self.results_strings = [] + for backend in current_results: + if mode == mode_track_name: + iterable = backend.tracks + elif mode == mode_album_name: + iterable = backend.albums + else: + iterable = backend.artists + + for result in iterable: + self.results.append(result) + self.results_strings.append(result.name) + self.list_view.set_list(self.results_strings) + - for result in iterable: - self.results.append(result) - self.results_strings.append(result.name) - self.list_view.set_list(self.results_strings) def touch_event(self, touch_event): clicked = self.list_view.touch_event(touch_event) @@ -53,3 +119,13 @@ class SearchScreen(): self.manager.core.tracklist.add( uri=self.results[clicked].uri) self.manager.core.playback.play() + else: + clicked = self.screen_objects.get_touch_objects_in_pos(touch_event.down_pos) + if len(clicked) > 0: + clicked = clicked[0] + if clicked == self.mode_objects_keys[0]: + self.search(mode=0) + if clicked == self.mode_objects_keys[1]: + self.search(mode=1) + if clicked == self.mode_objects_keys[2]: + self.search(mode=2)