Forráskód Böngészése

Search updates
Text items can be centered

Ander 11 éve
szülő
commit
38304996ca

+ 8 - 7
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

+ 14 - 9
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):

+ 100 - 24
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]}
+    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': [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
-
-            for result in iterable:
-                self.results.append(result)
-                self.results_strings.append(result.name)
-        self.list_view.set_list(self.results_strings)
+            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)
+
+
 
     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)