From a0843d18dbf4d5dc53472cb3c4b01147b5bee111 Mon Sep 17 00:00:00 2001 From: 9and3r <9and3r@gmail.com> Date: Fri, 8 Aug 2014 01:40:42 +0200 Subject: [PATCH] Arrows first working version --- mopidy_touchscreen/screen_manager.py | 79 ++++++++------- mopidy_touchscreen/screen_objects.py | 146 +++++++++++++++++++++++---- 2 files changed, 171 insertions(+), 54 deletions(-) diff --git a/mopidy_touchscreen/screen_manager.py b/mopidy_touchscreen/screen_manager.py index 0eae9d3..be4ee6d 100644 --- a/mopidy_touchscreen/screen_manager.py +++ b/mopidy_touchscreen/screen_manager.py @@ -154,42 +154,12 @@ class ScreenManager(): if event.type == InputManager.click: objects = self.screen_objects_manager.get_touch_objects_in_pos( event.current_pos) - if objects is not None: - for key in objects: - if key == "volume": - manager = self.screen_objects_manager - volume = manager.get_touch_object(key) - pos = event.current_pos - value = volume.get_pos_value(pos) - self.backend.tell( - {'action': 'volume', 'value': value}) - self.volume_changed(value) - elif key == "pause_play": - if self.core.playback.state.get() == \ - mopidy.core.PlaybackState.PLAYING: - self.core.playback.pause() - else: - self.core.playback.play() - elif key == "mute": - mute = not self.core.playback.mute.get() - self.core.playback.set_mute(mute) - self.mute_changed(mute) - elif key == "random": - random = not self.core.tracklist.random.get() - self.core.tracklist.set_random(random) - self.options_changed() - elif key == "repeat": - self.core.tracklist.set_repeat( - not self.core.tracklist.repeat.get()) - elif key == "single": - self.core.tracklist.set_single( - not self.core.tracklist.single.get()) - elif key == "internet": - self.screens[4].check_connection() - elif key[:-1] == "menu_": - self.change_screen(int(key[-1:])) + self.click_on_objects(objects, event) + elif event.type == InputManager.key and event.direction == InputManager.enter: + objects = [self.screen_objects_manager.selected_key] + self.click_on_objects(objects, event) elif event.type == InputManager.key: - self.screen_objects_manager.change_selected((0,0), InputManager.down) + self.screen_objects_manager.change_selected(event.direction) self.screens[self.current_screen].touch_event(event) def volume_changed(self, volume): @@ -209,6 +179,45 @@ class ScreenManager(): self.screen_objects_manager.get_touch_object("volume").set_value( volume) + def click_on_objects(self, objects, event): + if objects is not None: + for key in objects: + if key == "volume": + self.change_volume(event) + elif key == "pause_play": + if self.core.playback.state.get() == \ + mopidy.core.PlaybackState.PLAYING: + self.core.playback.pause() + else: + self.core.playback.play() + elif key == "mute": + mute = not self.core.playback.mute.get() + self.core.playback.set_mute(mute) + self.mute_changed(mute) + elif key == "random": + random = not self.core.tracklist.random.get() + self.core.tracklist.set_random(random) + self.options_changed() + elif key == "repeat": + self.core.tracklist.set_repeat( + not self.core.tracklist.repeat.get()) + elif key == "single": + self.core.tracklist.set_single( + not self.core.tracklist.single.get()) + elif key == "internet": + self.screens[4].check_connection() + elif key[:-1] == "menu_": + self.change_screen(int(key[-1:])) + + def change_volume(self,event): + manager = self.screen_objects_manager + volume = manager.get_touch_object("volume") + pos = event.current_pos + value = volume.get_pos_value(pos) + self.backend.tell( + {'action': 'volume', 'value': value}) + self.volume_changed(value) + def playback_state_changed(self, old_state, new_state): if new_state == mopidy.core.PlaybackState.PLAYING: self.screen_objects_manager.get_touch_object( diff --git a/mopidy_touchscreen/screen_objects.py b/mopidy_touchscreen/screen_objects.py index 4e7fbae..fd639d4 100644 --- a/mopidy_touchscreen/screen_objects.py +++ b/mopidy_touchscreen/screen_objects.py @@ -14,6 +14,7 @@ class ScreenObjectsManager(): self.touch_objects = {} self.text_objects = {} self.selected = None + self.selected_key = None def set_object(self, key, add_object): self.text_objects[key] = add_object @@ -57,28 +58,135 @@ class ScreenObjectsManager(): if key is not None: self.selected = self.touch_objects[key] self.selected.set_selected(True) + self.selected_key = key + else: + self.selected = None + self.selected.set_selected(False) + self.selected_key = None - def change_selected(self, pos, direction): - if direction == InputManager.up: - pass + def change_selected(self, direction): + pos = self.selected.pos + if direction == InputManager.right: + bests = self.find_nearest_objects(self.find_in_quadrant(False, True), True) + best_key = self.find_best_object(bests, False, True) + elif direction == InputManager.left: + bests = self.find_nearest_objects(self.find_in_quadrant(False, False), True) + best_key = self.find_best_object(bests, False, False) 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)) + bests = self.find_nearest_objects(self.find_in_quadrant(True, True), False) + best_key = self.find_best_object(bests, True, True) + elif direction == InputManager.up: + bests = self.find_nearest_objects(self.find_in_quadrant(True, False), False) + best_key = self.find_best_object(bests, True, False) + if best_key is None: + return False + else: + self.set_selected(best_key) + return True + + # Find touch objects on specified quadrant + # The quadrant is the normal math one with x and y + # x is positive on the bottom as pygame x + # The quadrant origin (0,0) is the selected pos + def find_in_quadrant(self, vertical, positive): + pos = self.selected.pos + objects = {} + if vertical: + if positive: + for key in self.touch_objects: + current = self.touch_objects[key] + if current.pos[1] > pos[1]: + objects[key] = current + else: + for key in self.touch_objects: + current = self.touch_objects[key] + if current.pos[1] < pos[1]: + objects[key] = current + else: + if positive: + for key in self.touch_objects: + current = self.touch_objects[key] + if current.pos[0] > pos[0]: + objects[key] = current + else: + for key in self.touch_objects: + current = self.touch_objects[key] + if current.pos[0] < pos[0]: + objects[key] = current + return objects + + # Find the objects that are nearest + def find_nearest_objects(self, objects, vertical): + pos = self.selected.pos + best_pos = None + min_value = None + best_objects = {} + if vertical: + for key in objects: + if min_value is None: + best_pos = objects[key].pos[1] + min_value = abs(objects[key].pos[1] - pos[1]) + elif abs(objects[key].pos[1] - pos[1]) < min_value: + min_value = abs(objects[key].pos[1] - pos[1]) + best_pos = objects[key].pos[1] + for key in objects: + if objects[key].pos[1] == best_pos: + best_objects[key] = objects[key] + return best_objects + else: + for key in objects: + if min_value is None: + best_pos = objects[key].pos[0] + min_value = abs(objects[key].pos[0] - pos[0]) + elif abs(objects[key].pos[0] - pos[0]) < min_value: + min_value = abs(objects[key].pos[0] - pos[0]) + best_pos = objects[key].pos[0] + for key in objects: + if objects[key].pos[0] == best_pos: + best_objects[key] = objects[key] + return best_objects + + def find_best_object(self, objects, vertical, positive): + pos = self.selected.pos + best_key = None + best_pos = None + if vertical: + if positive: + for key in objects: + if best_pos is None: + best_pos = objects[key].pos[1] + best_key = key + elif objects[key].pos[1] >= pos[1] and objects[key].pos[1] < best_pos: + best_pos = objects[key].pos[1] + best_key = key + else: + for key in objects: + if best_pos is None: + best_pos = objects[key].pos[1] + best_key = key + elif objects[key].pos[1] <= pos[1] and objects[key].pos[1] > best_pos: + best_pos = objects[key].pos[1] + best_key = key + else: + if positive: + for key in objects: + if best_pos is None: + best_pos = objects[key].pos[0] + best_key = key + elif objects[key].pos[0] >= pos[0] and objects[key].pos[0] < best_pos: + best_pos = objects[key].pos[0] + best_key = key + else: + for key in objects: + if best_pos is None: + best_pos = objects[key].pos[0] + best_key = key + elif objects[key].pos[0] <= pos[0] and objects[key].pos[0] > best_pos: + best_pos = objects[key].pos[0] + best_key = key + return best_key + - 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]