diff --git a/mopidy_touchscreen/screen_manager.py b/mopidy_touchscreen/screen_manager.py index b5841ee..0eae9d3 100644 --- a/mopidy_touchscreen/screen_manager.py +++ b/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): diff --git a/mopidy_touchscreen/screen_objects.py b/mopidy_touchscreen/screen_objects.py index 5bd7e0c..4e7fbae 100644 --- a/mopidy_touchscreen/screen_objects.py +++ b/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)