diff --git a/mopidy_touchscreen/dynamic_background.py b/mopidy_touchscreen/dynamic_background.py index bb02880..e690b28 100644 --- a/mopidy_touchscreen/dynamic_background.py +++ b/mopidy_touchscreen/dynamic_background.py @@ -11,7 +11,7 @@ class DynamicBackground(): self.auto_mode = True self.target_current_same = False - def draw_background(self, surface): + def draw_background(self, surfaces): if not self.target_current_same: for x in range(0, 3): if abs(self.current[x]-self.target[x]) < change_speed: @@ -26,7 +26,8 @@ class DynamicBackground(): if self.auto_mode and self.target_current_same: self.target = get_valid_color() self.target_current_same = False - surface.fill(self.current) + for surface in surfaces: + surface.fill(self.current) def set_target_color(self, color): if color is not None: diff --git a/mopidy_touchscreen/list_view.py b/mopidy_touchscreen/list_view.py index bdad9ed..fa81a8a 100644 --- a/mopidy_touchscreen/list_view.py +++ b/mopidy_touchscreen/list_view.py @@ -19,8 +19,9 @@ class ListView(): self.list_size = 0 self.list = [] self.scrollbar = False + self.selected = None self.set_list([]) - self.selected = [] + self.active = [] # Sets the list for the lisview. It should be an iterable of strings def set_list(self, item_list): @@ -38,6 +39,10 @@ class ListView(): scroll_bar) else: self.scrollbar = False + if self.list_size > 0: + self.selected = 0 + else: + self.selected = None self.load_new_item_position(0) # Will load items currently displaying in item_pos @@ -60,7 +65,7 @@ class ListView(): self.screen_objects.set_touch_object(str(i), item) i += 1 z += 1 - + self.reload_selected() def render(self, surface): self.screen_objects.render(surface) @@ -79,12 +84,21 @@ class ListView(): self.move_to(direction) else: return int(key) + elif touch_event.type == InputManager.key: + if touch_event.direction == InputManager.enter: + if self.selected is not None: + return self.selected + elif touch_event.direction == InputManager.up: + self.set_selected(self.selected-1) + elif touch_event.direction == InputManager.down: + self.set_selected(self.selected+1) elif touch_event.type == InputManager.swipe: if touch_event.direction == InputManager.up: self.move_to(-1) elif touch_event.direction == InputManager.down: self.move_to(1) + # Scroll to direction # direction == 1 will scroll down # direction == -1 will scroll up @@ -106,22 +120,59 @@ class ListView(): self.screen_objects.get_touch_object( "scrollbar").set_item( self.current_item) - self.set_selected(self.selected) + self.set_active(self.active) - # Set selected items - def set_selected(self, selected): - for number in self.selected: + + # Set active items + def set_active(self, active): + for number in self.active: try: self.screen_objects.get_touch_object( str(number)).set_active( False) except KeyError: pass - for number in selected: + for number in active: try: self.screen_objects.get_touch_object( str(number)).set_active( True) except KeyError: pass - self.selected = selected + self.active = active + + def set_selected(self, selected): + if selected > -1 and selected < len(self.list): + if self.selected is not None: + try: + self.screen_objects.get_touch_object( + str(self.selected)).set_selected( + False) + except KeyError: + pass + if selected is not None: + try: + self.screen_objects.get_touch_object( + str(selected)).set_selected( + True) + except KeyError: + pass + self.selected = selected + self.set_selected_on_screen() + + def set_selected_on_screen(self): + if self.current_item + self.max_rows <= self.selected: + self.move_to(1) + self.set_selected_on_screen() + elif self.current_item > self.selected: + self.move_to(-1) + self.set_selected_on_screen() + + def reload_selected(self): + if self.selected is not None: + try: + self.screen_objects.get_touch_object( + str(self.selected)).set_selected( + True) + except KeyError: + pass \ No newline at end of file diff --git a/mopidy_touchscreen/screen_manager.py b/mopidy_touchscreen/screen_manager.py index 6b0ffbe..527c36a 100644 --- a/mopidy_touchscreen/screen_manager.py +++ b/mopidy_touchscreen/screen_manager.py @@ -103,11 +103,15 @@ class ScreenManager(): (x, self.base_size * 7), button_size, center=True) self.down_bar_objects.set_touch_object("menu_5", button) + # Down bar Solid + self.down_bar_solid = pygame.Surface( + (self.size[0], self.size[1] - self.base_size * 7)) + # Down bar self.down_bar = pygame.Surface( - (self.size[0], self.size[1] - self.base_size * 7), - pygame.SRCALPHA) - self.down_bar.fill((0, 0, 0, 128)) + (self.size[0], self.size[1] - self.base_size * 7), pygame.SRCALPHA) + self.down_bar.fill((0,0,0,200)) + self.options_changed() self.mute_changed(self.core.playback.mute.get()) @@ -118,9 +122,10 @@ class ScreenManager(): def update(self): surface = pygame.Surface(self.size) - self.background.draw_background(surface) + self.background.draw_background([surface, self.down_bar_solid]) self.screens[self.current_screen].update(surface, self.screen_changed) + surface.blit(self.down_bar_solid, (0, self.base_size * 7)) surface.blit(self.down_bar, (0, self.base_size * 7)) self.down_bar_objects.render(surface) self.screen_changed = False diff --git a/mopidy_touchscreen/screen_objects.py b/mopidy_touchscreen/screen_objects.py index 91d97a0..55de212 100644 --- a/mopidy_touchscreen/screen_objects.py +++ b/mopidy_touchscreen/screen_objects.py @@ -237,7 +237,7 @@ class TextItem(BaseItem): self.fit_horizontal = False self.step = 0 self.step_2 = None - self.scroll_white_gap = self.size[1] * 4 + self.scroll_white_gap = self.font.get_height() * 4 else: self.fit_horizontal = True if self.pos[1] + self.box.get_rect().height > pos[1] + \ @@ -296,6 +296,9 @@ class TouchObject(BaseItem): BaseItem.__init__(self, pos, size) self.active = False self.selected = False + self.selected_box = pygame.Surface(size,pygame.SRCALPHA) + self.selected_box.fill((0,0,0,128)) + pygame.draw.rect(self.selected_box, (255,255,255), self.selected_box.get_rect(), size[1]/10+1) def is_pos_inside(self, pos): return self.rect_in_pos.collidepoint(pos) @@ -306,6 +309,10 @@ class TouchObject(BaseItem): def set_selected(self, selected): self.selected = selected + def render(self, surface): + if self.selected: + surface.blit(self.selected_box, self.pos) + class TouchAndTextItem(TouchObject, TextItem): def __init__(self, font, text, pos, size, center=False): @@ -316,8 +323,6 @@ class TouchAndTextItem(TouchObject, TextItem): self.normal_box = self.box 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) @@ -327,8 +332,6 @@ class TouchAndTextItem(TouchObject, TextItem): self.normal_box = self.box self.active_box = self.font.render(text, True, self.active_color) - self.selected_box = self.font.render(text, True, - self.selected_color) def set_active(self, active): TouchObject.set_active(self, active) @@ -337,14 +340,8 @@ class TouchAndTextItem(TouchObject, TextItem): else: self.box = self.normal_box - def set_selected(self, selected): - TouchObject.set_selected(self, selected) - if self.selected: - self.box = self.selected_box - else: - self.box = self.normal_box - def render(self, surface): + TouchObject.render(self, surface) TextItem.render(self, surface) diff --git a/mopidy_touchscreen/tracklist.py b/mopidy_touchscreen/tracklist.py index 25208cc..5c04fe9 100644 --- a/mopidy_touchscreen/tracklist.py +++ b/mopidy_touchscreen/tracklist.py @@ -36,5 +36,5 @@ class Tracklist(BaseScreen): on_error_step=1) def track_started(self, track): - self.list_view.set_selected( + self.list_view.set_active( [self.manager.core.tracklist.index(track).get()])