From: Ed Page Date: Tue, 11 May 2010 03:17:56 +0000 (-0500) Subject: Adding an alternative play control while browsing the selection X-Git-Url: http://git.maemo.org/git/?p=watersofshiloah;a=commitdiff_plain;h=26a388bc2959bc61bfb32299259dbce66760d2f4 Adding an alternative play control while browsing the selection --- diff --git a/data/small_home.png b/data/small_home.png new file mode 100644 index 0000000..81c2468 Binary files /dev/null and b/data/small_home.png differ diff --git a/data/small_next.png b/data/small_next.png new file mode 100644 index 0000000..367a8b5 Binary files /dev/null and b/data/small_next.png differ diff --git a/data/small_pause.png b/data/small_pause.png new file mode 100644 index 0000000..7bdbfb8 Binary files /dev/null and b/data/small_pause.png differ diff --git a/data/small_play.png b/data/small_play.png new file mode 100644 index 0000000..c9a0fc7 Binary files /dev/null and b/data/small_play.png differ diff --git a/data/small_prev.png b/data/small_prev.png new file mode 100644 index 0000000..3140836 Binary files /dev/null and b/data/small_prev.png differ diff --git a/data/small_stop.png b/data/small_stop.png new file mode 100644 index 0000000..67a0d9e Binary files /dev/null and b/data/small_stop.png differ diff --git a/hand_tests/fake_player.py b/hand_tests/fake_player.py index 1a215ba..c9b7ef0 100644 --- a/hand_tests/fake_player.py +++ b/hand_tests/fake_player.py @@ -57,6 +57,10 @@ class FakePlayer(gobject.GObject): return self._layout @property + def node(self): + return None + + @property def title(self): return self._title.get_text() diff --git a/hand_tests/test_nav_control.py b/hand_tests/test_nav_control.py new file mode 100755 index 0000000..e1649fa --- /dev/null +++ b/hand_tests/test_nav_control.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +import sys +import logging + +import gtk + +sys.path.append('../src') + +import imagestore +import playcontrol +import fake_player + + +if __name__ == "__main__": + logging.basicConfig(level=logging.DEBUG) + + store = imagestore.ImageStore("../data", ".") + + player = fake_player.FakePlayer() + sp = playcontrol.NavControl(player, store) + + layout = gtk.VBox() + layout.pack_start(player.toplevel) + layout.pack_start(sp.toplevel) + + window = gtk.Window() + window.set_title("Test") + window.add(layout) + window.connect("destroy", lambda w: gtk.main_quit()) + window.show_all() + + sp.refresh() + + gtk.main() diff --git a/src/imagestore.py b/src/imagestore.py index bf82efc..9ca9964 100644 --- a/src/imagestore.py +++ b/src/imagestore.py @@ -13,6 +13,14 @@ class ImageStore(object): "play": "play.png", "stop": "stop.png", "home": "home.png", + + "small_next": "small_next.png", + "small_prev": "small_prev.png", + "small_pause": "small_pause.png", + "small_play": "small_play.png", + "small_stop": "small_stop.png", + "small_home": "small_home.png", + "loading": "loading.gif", "radio_header": "radio_header.png", diff --git a/src/playcontrol.py b/src/playcontrol.py index c0fa3b5..f9bf348 100644 --- a/src/playcontrol.py +++ b/src/playcontrol.py @@ -1,15 +1,156 @@ import logging +import gobject import gtk import gtk_toolbox import hildonize import util.misc as misc_utils +import presenter + _moduleLogger = logging.getLogger(__name__) +class NavControl(gobject.GObject): + + + __gsignals__ = { + 'home' : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (), + ), + 'jump-to' : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_PYOBJECT, ), + ), + } + + def __init__(self, player, store): + gobject.GObject.__init__(self) + + self._store = store + + self._player = player + self._player.connect("state-change", self._on_player_state_change) + self._player.connect("title-change", self._on_player_title_change) + + self._controlButton = store.get_image_from_store(store.STORE_LOOKUP["small_play"]) + + self._controlBox = presenter.NavigationBox() + self._controlBox.toplevel.add(self._controlButton) + self._controlBox.connect("action", self._on_nav_action) + self._controlBox.connect("navigating", self._on_navigating) + + self._titleButton = gtk.Label("") + + self._displayBox = presenter.NavigationBox() + self._displayBox.toplevel.add(self._titleButton) + self._displayBox.connect("action", self._on_nav_action) + self._displayBox.connect("navigating", self._on_navigating) + + self._layout = gtk.HBox() + self._layout.pack_start(self._controlBox.toplevel, False, False) + self._layout.pack_start(self._displayBox.toplevel, False, True) + + def refresh(self): + if not self._player.title: + self.toplevel.hide() + + @property + def toplevel(self): + return self._layout + + def set_orientation(self, orientation): + pass + + @misc_utils.log_exception(_moduleLogger) + def _on_player_state_change(self, player, newState): + if self._controlBox.is_active() or self._displayBox.is_active(): + return + + if newState == "play": + stateImage = self._store.STORE_LOOKUP["small_play"] + self._store.set_image_from_store(self._controlButton, stateImage) + self.toplevel.show() + elif newState == "pause": + stateImage = self._store.STORE_LOOKUP["small_pause"] + self._store.set_image_from_store(self._controlButton, stateImage) + self.toplevel.show() + elif newState == "stop": + self._titleButton.set_label("") + self.toplevel.hide() + else: + _moduleLogger.info("Unhandled player state %s" % newState) + stateImage = self._store.STORE_LOOKUP["small_pause"] + self._store.set_image_from_store(self._controlButton, stateImage) + + @misc_utils.log_exception(_moduleLogger) + def _on_player_title_change(self, player, newState): + self._titleButton.set_label(self._player.title) + + @misc_utils.log_exception(_moduleLogger) + def _on_navigating(self, widget, navState): + if navState == "down": + imageName = "small_home" + elif navState == "up": + imageName = "small_play" + elif navState == "clicking" or not self._player.can_navigate: + if widget is self._controlBox: + if self._player.state == "play": + imageName = "small_pause" + else: + imageName = "small_play" + elif widget is self._displayBox: + if self._player.state == "play": + imageName = "small_play" + else: + imageName = "small_pause" + else: + raise NotImplementedError() + elif navState == "left": + imageName = "small_next" + elif navState == "right": + imageName = "small_prev" + + imagePath = self._store.STORE_LOOKUP[imageName] + self._store.set_image_from_store(self._controlButton, imagePath) + + @misc_utils.log_exception(_moduleLogger) + def _on_nav_action(self, widget, navState): + if self._player.state == "play": + imageName = "small_play" + else: + imageName = "small_pause" + imagePath = self._store.STORE_LOOKUP[imageName] + self._store.set_image_from_store(self._controlButton, imagePath) + + if navState == "clicking": + if widget is self._controlBox: + if self._player.state == "play": + self._player.pause() + else: + self._player.play() + elif widget is self._displayBox: + self.emit("jump-to", self._player.node) + else: + raise NotImplementedError() + elif navState == "down": + self.emit("home") + elif navState == "up": + pass + elif navState == "left": + self._player.next() + elif navState == "right": + self._player.back() + + +gobject.type_register(NavControl) + + class PlayControl(object): def __init__(self, player, store): @@ -21,27 +162,27 @@ class PlayControl(object): self._player.connect("state-change", self._on_player_state_change) self._player.connect("title-change", self._on_player_nav_change) - img = store.get_image_from_store(store.STORE_LOOKUP["prev"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_prev"]) self._back = gtk.Button() self._back.set_image(img) self._back.connect("clicked", self._on_back_clicked) - img = store.get_image_from_store(store.STORE_LOOKUP["stop"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_stop"]) self._stop = gtk.Button() self._stop.set_image(img) self._stop.connect("clicked", self._on_stop_clicked) - img = store.get_image_from_store(store.STORE_LOOKUP["pause"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_pause"]) self._pause = gtk.Button() self._pause.set_image(img) self._pause.connect("clicked", self._on_pause_clicked) - img = store.get_image_from_store(store.STORE_LOOKUP["play"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_play"]) self._play = gtk.Button() self._play.set_image(img) self._play.connect("clicked", self._on_play_clicked) - img = store.get_image_from_store(store.STORE_LOOKUP["next"]) + img = store.get_image_from_store(store.STORE_LOOKUP["small_next"]) self._next = gtk.Button() self._next.set_image(img) self._next.connect("clicked", self._on_next_clicked) diff --git a/src/player.py b/src/player.py index 6197138..c4a06de 100644 --- a/src/player.py +++ b/src/player.py @@ -35,6 +35,10 @@ class Player(gobject.GObject): self.emit("title_change", self._state) @property + def node(self): + return self._node + + @property def title(self): if self._node is None: return ""