Working listview with keys or GPIO

This commit is contained in:
Ander
2015-01-14 16:36:54 +01:00
parent 7ad61c53c4
commit 3bf0072fdf
5 changed files with 81 additions and 27 deletions

View File

@@ -11,7 +11,7 @@ class DynamicBackground():
self.auto_mode = True self.auto_mode = True
self.target_current_same = False self.target_current_same = False
def draw_background(self, surface): def draw_background(self, surfaces):
if not self.target_current_same: if not self.target_current_same:
for x in range(0, 3): for x in range(0, 3):
if abs(self.current[x]-self.target[x]) < change_speed: 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: if self.auto_mode and self.target_current_same:
self.target = get_valid_color() self.target = get_valid_color()
self.target_current_same = False self.target_current_same = False
surface.fill(self.current) for surface in surfaces:
surface.fill(self.current)
def set_target_color(self, color): def set_target_color(self, color):
if color is not None: if color is not None:

View File

@@ -19,8 +19,9 @@ class ListView():
self.list_size = 0 self.list_size = 0
self.list = [] self.list = []
self.scrollbar = False self.scrollbar = False
self.selected = None
self.set_list([]) self.set_list([])
self.selected = [] self.active = []
# Sets the list for the lisview. It should be an iterable of strings # Sets the list for the lisview. It should be an iterable of strings
def set_list(self, item_list): def set_list(self, item_list):
@@ -38,6 +39,10 @@ class ListView():
scroll_bar) scroll_bar)
else: else:
self.scrollbar = False self.scrollbar = False
if self.list_size > 0:
self.selected = 0
else:
self.selected = None
self.load_new_item_position(0) self.load_new_item_position(0)
# Will load items currently displaying in item_pos # Will load items currently displaying in item_pos
@@ -60,7 +65,7 @@ class ListView():
self.screen_objects.set_touch_object(str(i), item) self.screen_objects.set_touch_object(str(i), item)
i += 1 i += 1
z += 1 z += 1
self.reload_selected()
def render(self, surface): def render(self, surface):
self.screen_objects.render(surface) self.screen_objects.render(surface)
@@ -79,12 +84,21 @@ class ListView():
self.move_to(direction) self.move_to(direction)
else: else:
return int(key) 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: elif touch_event.type == InputManager.swipe:
if touch_event.direction == InputManager.up: if touch_event.direction == InputManager.up:
self.move_to(-1) self.move_to(-1)
elif touch_event.direction == InputManager.down: elif touch_event.direction == InputManager.down:
self.move_to(1) self.move_to(1)
# Scroll to direction # Scroll to direction
# direction == 1 will scroll down # direction == 1 will scroll down
# direction == -1 will scroll up # direction == -1 will scroll up
@@ -106,22 +120,59 @@ class ListView():
self.screen_objects.get_touch_object( self.screen_objects.get_touch_object(
"scrollbar").set_item( "scrollbar").set_item(
self.current_item) self.current_item)
self.set_selected(self.selected) self.set_active(self.active)
# Set selected items
def set_selected(self, selected): # Set active items
for number in self.selected: def set_active(self, active):
for number in self.active:
try: try:
self.screen_objects.get_touch_object( self.screen_objects.get_touch_object(
str(number)).set_active( str(number)).set_active(
False) False)
except KeyError: except KeyError:
pass pass
for number in selected: for number in active:
try: try:
self.screen_objects.get_touch_object( self.screen_objects.get_touch_object(
str(number)).set_active( str(number)).set_active(
True) True)
except KeyError: except KeyError:
pass 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

View File

@@ -103,11 +103,15 @@ class ScreenManager():
(x, self.base_size * 7), button_size, center=True) (x, self.base_size * 7), button_size, center=True)
self.down_bar_objects.set_touch_object("menu_5", button) 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 # Down bar
self.down_bar = pygame.Surface( self.down_bar = pygame.Surface(
(self.size[0], self.size[1] - self.base_size * 7), (self.size[0], self.size[1] - self.base_size * 7), pygame.SRCALPHA)
pygame.SRCALPHA) self.down_bar.fill((0,0,0,200))
self.down_bar.fill((0, 0, 0, 128))
self.options_changed() self.options_changed()
self.mute_changed(self.core.playback.mute.get()) self.mute_changed(self.core.playback.mute.get())
@@ -118,9 +122,10 @@ class ScreenManager():
def update(self): def update(self):
surface = pygame.Surface(self.size) 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.screens[self.current_screen].update(surface,
self.screen_changed) self.screen_changed)
surface.blit(self.down_bar_solid, (0, self.base_size * 7))
surface.blit(self.down_bar, (0, self.base_size * 7)) surface.blit(self.down_bar, (0, self.base_size * 7))
self.down_bar_objects.render(surface) self.down_bar_objects.render(surface)
self.screen_changed = False self.screen_changed = False

View File

@@ -237,7 +237,7 @@ class TextItem(BaseItem):
self.fit_horizontal = False self.fit_horizontal = False
self.step = 0 self.step = 0
self.step_2 = None self.step_2 = None
self.scroll_white_gap = self.size[1] * 4 self.scroll_white_gap = self.font.get_height() * 4
else: else:
self.fit_horizontal = True self.fit_horizontal = True
if self.pos[1] + self.box.get_rect().height > pos[1] + \ if self.pos[1] + self.box.get_rect().height > pos[1] + \
@@ -296,6 +296,9 @@ class TouchObject(BaseItem):
BaseItem.__init__(self, pos, size) BaseItem.__init__(self, pos, size)
self.active = False self.active = False
self.selected = 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): def is_pos_inside(self, pos):
return self.rect_in_pos.collidepoint(pos) return self.rect_in_pos.collidepoint(pos)
@@ -306,6 +309,10 @@ class TouchObject(BaseItem):
def set_selected(self, selected): def set_selected(self, selected):
self.selected = selected self.selected = selected
def render(self, surface):
if self.selected:
surface.blit(self.selected_box, self.pos)
class TouchAndTextItem(TouchObject, TextItem): class TouchAndTextItem(TouchObject, TextItem):
def __init__(self, font, text, pos, size, center=False): def __init__(self, font, text, pos, size, center=False):
@@ -316,8 +323,6 @@ class TouchAndTextItem(TouchObject, TextItem):
self.normal_box = self.box self.normal_box = self.box
self.active_box = self.font.render(text, True, self.active_box = self.font.render(text, True,
self.active_color) self.active_color)
self.selected_box = self.font.render(text, True,
self.selected_color)
def update(self): def update(self):
TextItem.update(self) TextItem.update(self)
@@ -327,8 +332,6 @@ class TouchAndTextItem(TouchObject, TextItem):
self.normal_box = self.box self.normal_box = self.box
self.active_box = self.font.render(text, True, self.active_box = self.font.render(text, True,
self.active_color) self.active_color)
self.selected_box = self.font.render(text, True,
self.selected_color)
def set_active(self, active): def set_active(self, active):
TouchObject.set_active(self, active) TouchObject.set_active(self, active)
@@ -337,14 +340,8 @@ class TouchAndTextItem(TouchObject, TextItem):
else: else:
self.box = self.normal_box 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): def render(self, surface):
TouchObject.render(self, surface)
TextItem.render(self, surface) TextItem.render(self, surface)

View File

@@ -36,5 +36,5 @@ class Tracklist(BaseScreen):
on_error_step=1) on_error_step=1)
def track_started(self, track): def track_started(self, track):
self.list_view.set_selected( self.list_view.set_active(
[self.manager.core.tracklist.index(track).get()]) [self.manager.core.tracklist.index(track).get()])