9and3r 11 жил өмнө
parent
commit
45a6e83798

+ 4 - 0
mopidy_touchscreen/screen_manager.py

@@ -129,6 +129,8 @@ class ScreenManager():
         self.screens[4].check_connection()
         self.change_screen(self.current_screen)
 
+        self.screen_objects_manager.set_selected("pause_play")
+
     def update(self):
         surface = pygame.Surface(self.size)
         self.background.draw_background(surface)
@@ -186,6 +188,8 @@ class ScreenManager():
                             self.screens[4].check_connection()
                         elif key[:-1] == "menu_":
                             self.change_screen(int(key[-1:]))
+            elif event.type == InputManager.key:
+                self.screen_objects_manager.change_selected((0,0), InputManager.down)
             self.screens[self.current_screen].touch_event(event)
 
     def volume_changed(self, volume):

+ 45 - 2
mopidy_touchscreen/screen_objects.py

@@ -3,6 +3,9 @@ import math
 
 import pygame
 
+from .input_manager import InputManager
+
+
 logger = logging.getLogger(__name__)
 
 
@@ -10,6 +13,7 @@ class ScreenObjectsManager():
     def __init__(self):
         self.touch_objects = {}
         self.text_objects = {}
+        self.selected = None
 
     def set_object(self, key, add_object):
         self.text_objects[key] = add_object
@@ -47,6 +51,37 @@ class ScreenObjectsManager():
         else:
             self.touch_objects = {}
 
+    def set_selected(self, key):
+        if self.selected is not None:
+            self.selected.set_selected(False)
+        if key is not None:
+            self.selected = self.touch_objects[key]
+            self.selected.set_selected(True)
+
+    def change_selected(self, pos, direction):
+        if direction == InputManager.up:
+            pass
+        elif direction == InputManager.down:
+            best = None
+            for key in self.touch_objects:
+                if self.touch_objects[key].pos[1] > pos[1]:
+                    if best is None:
+                        best = self.touch_objects[key].pos[1]
+                    elif best > self.touch_objects[key].pos[1]:
+                        best = self.touch_objects[key].pos[1]
+            self.set_selected(self.find_best(pos, True, best))
+
+    def find_best(self, pos, horizontal, best):
+        if horizontal:
+            keys = []
+            for key in self.touch_objects:
+                if self.touch_objects[key].pos[1] == best:
+                    keys.append(key)
+            logger.error(keys)
+            return keys[0]
+
+
+
 
 class BaseItem():
     def __init__(self, pos, size):
@@ -129,6 +164,7 @@ class TouchObject(BaseItem):
     def __init__(self, pos, size):
         BaseItem.__init__(self, pos, size)
         self.active = False
+        self.selected = False
 
     def is_pos_inside(self, pos):
         return self.rect_in_pos.collidepoint(pos)
@@ -136,13 +172,18 @@ class TouchObject(BaseItem):
     def set_active(self, active):
         self.active = active
 
+    def set_selected(self, selected):
+        self.selected = selected
+
 
 class TouchAndTextItem(TouchObject, TextItem):
     def __init__(self, font, text, pos, size):
         TextItem.__init__(self, font, text, pos, size)
         TouchObject.__init__(self, pos, self.size)
         self.active_color = (0, 150, 255)
+        self.selected_color = (150, 0, 255)
         self.active_box = self.font.render(text, True, self.active_color)
+        self.selected_box = self.font.render(text, True, self.selected_color)
 
     def update(self):
         TextItem.update(self)
@@ -150,6 +191,7 @@ class TouchAndTextItem(TouchObject, TextItem):
     def set_text(self, text, change_size):
         TextItem.set_text(self, text, change_size)
         self.active_box = self.font.render(text, True, self.active_color)
+        self.selected_box = self.font.render(text, True, self.selected_color)
 
     def render(self, surface):
         if self.fit_horizontal:
@@ -160,8 +202,9 @@ class TouchAndTextItem(TouchObject, TextItem):
                                                    self.active_color)
             else:
                 self.box = self.font.render(self.text, True, self.color)
-        if self.active:
-            # Area h*2 to render letters like g, j, y...
+        if self.selected:
+            surface.blit(self.selected_box, self.pos, area=self.rect)
+        elif self.active:
             surface.blit(self.active_box, self.pos, area=self.rect)
         else:
             surface.blit(self.box, self.pos, area=self.rect)