From: Ed Page Date: Fri, 7 May 2010 02:45:01 +0000 (-0500) Subject: Implementing the first stream presenter X-Git-Url: http://vcs.maemo.org/git/?a=commitdiff_plain;h=101b2011b603040e0d05e050dbf1c32dbf1c7e5f;p=watersofshiloah Implementing the first stream presenter --- diff --git a/src/player.py b/src/player.py index b99d1c6..a800a3d 100644 --- a/src/player.py +++ b/src/player.py @@ -34,6 +34,10 @@ class Player(gobject.GObject): return "" @property + def subtitle(self): + return "" + + @property def can_navigate(self): return True @@ -43,7 +47,7 @@ class Player(gobject.GObject): @property def background(self): - return "night_temple_background" + return "conference_background" def play(self): _moduleLogger.info("play") diff --git a/src/windows.py b/src/windows.py index c10c9c6..ebd525b 100644 --- a/src/windows.py +++ b/src/windows.py @@ -27,10 +27,20 @@ class BasicWindow(gobject.GObject): gobject.TYPE_NONE, (), ), + 'home' : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (), + ), + 'rotate' : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_BOOLEAN, ), + ), 'fullscreen' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, - (gobject.TYPE_PYOBJECT, ), + (gobject.TYPE_BOOLEAN, ), ), } @@ -126,6 +136,16 @@ class BasicWindow(gobject.GObject): self._clipboard.set_text(str(log)) return True + @misc_utils.log_exception(_moduleLogger) + def _on_home(self, *args): + self.emit("home") + self._window.destroy() + + @misc_utils.log_exception(_moduleLogger) + def _on_quit(self, *args): + self.emit("quit") + self._window.destroy() + class SourceSelector(BasicWindow): @@ -224,6 +244,7 @@ class SourceSelector(BasicWindow): sourceWindow.window.set_modal(True) sourceWindow.window.set_transient_for(self._window) sourceWindow.window.set_default_size(*self._window.get_size()) + sourceWindow.connect("quit", self._on_quit) gobject.type_register(SourceSelector) @@ -573,6 +594,8 @@ class ConferencesWindow(ListWindow): sessionsWindow.window.set_modal(True) sessionsWindow.window.set_transient_for(self._window) sessionsWindow.window.set_default_size(*self._window.get_size()) + sessionsWindow.connect("quit", self._on_quit) + sessionsWindow.connect("home", self._on_home) gobject.type_register(ConferencesWindow) @@ -638,6 +661,8 @@ class ConferenceSessionsWindow(ListWindow): sessionsWindow.window.set_modal(True) sessionsWindow.window.set_transient_for(self._window) sessionsWindow.window.set_default_size(*self._window.get_size()) + sessionsWindow.connect("quit", self._on_quit) + sessionsWindow.connect("home", self._on_home) gobject.type_register(ConferenceSessionsWindow) @@ -682,7 +707,7 @@ class ConferenceTalksWindow(ListWindow): self._hide_loading() for program in programs: - row = program["id"], "%s\n%s" % (program["title"], program["speaker"]) + row = program, "%s\n%s" % (program["title"], program["speaker"]) self._model.append(row) path = (self._get_current_row(), ) @@ -696,7 +721,122 @@ class ConferenceTalksWindow(ListWindow): @misc_utils.log_exception(_moduleLogger) def _on_row_activated(self, view, path, column): - raise NotImplementedError("") + itr = self._model.get_iter(path) + program = self._model.get_value(itr, 0) + + sessionsWindow = ConferenceTalkWindow(self._player, self._store, self._index, program) + sessionsWindow.window.set_modal(True) + sessionsWindow.window.set_transient_for(self._window) + sessionsWindow.window.set_default_size(*self._window.get_size()) + sessionsWindow.connect("quit", self._on_quit) + sessionsWindow.connect("home", self._on_home) gobject.type_register(ConferenceTalksWindow) + + +class ConferenceTalkWindow(BasicWindow): + + def __init__(self, player, store, index, talkData): + BasicWindow.__init__(self, player, store, index) + + self._player.connect("state-change", self._on_player_state_change) + self._player.connect("title-change", self._on_player_title_change) + + self._loadingBanner = banners.GenericBanner() + + self._presenter = presenter.StreamPresenter(self._store) + self._presenterNavigation = presenter.NavigationBox() + self._presenterNavigation.toplevel.add(self._presenter.toplevel) + self._presenterNavigation.connect("action", self._on_nav_action) + self._presenterNavigation.connect("navigating", self._on_navigating) + + self._layout.pack_start(self._loadingBanner.toplevel, False, False) + self._layout.pack_start(self._presenterNavigation.toplevel, True, True) + + self._window.set_title("Talk") + self._window.show_all() + self._errorBanner.toplevel.hide() + self._loadingBanner.toplevel.hide() + + self._presenter.set_context( + self._store.STORE_LOOKUP[self._player.background], + self._player.title, + self._player.subtitle, + ) + if self._player.state == "play": + self._presenter.set_state(self._store.STORE_LOOKUP["play"]) + else: + self._presenter.set_state(self._store.STORE_LOOKUP["pause"]) + + def _show_loading(self): + animationPath = self._store.STORE_LOOKUP["loading"] + animation = self._store.get_pixbuf_animation_from_store(animationPath) + self._loadingBanner.show(animation, "Loading...") + + def _hide_loading(self): + self._loadingBanner.hide() + + @misc_utils.log_exception(_moduleLogger) + def _on_player_state_change(self, player, newState): + if self._headerNavigation.is_active() or self._presenterNavigation.is_active(): + return + + if newState == "play": + self._presenter.set_state(self._store.STORE_LOOKUP["play"]) + elif newState == "pause": + self._presenter.set_state(self._store.STORE_LOOKUP["pause"]) + else: + _moduleLogger.info("Unhandled player state %s" % newState) + self._presenter.set_state(self._store.STORE_LOOKUP["pause"]) + + @misc_utils.log_exception(_moduleLogger) + def _on_player_title_change(self, player, newState): + self._presenter.set_context( + self._store.STORE_LOOKUP[self._player.background], + self._player.title, + self._player.subtitle, + ) + + @misc_utils.log_exception(_moduleLogger) + def _on_navigating(self, widget, navState): + if navState == "clicking": + if self._player.state == "play": + imageName = "pause" + else: + imageName = "play" + elif navState == "down": + imageName = "home" + elif navState == "up": + imageName = "play" + elif navState == "left": + imageName = "next" + elif navState == "right": + imageName = "prev" + + self._presenter.set_state(self._store.STORE_LOOKUP[imageName]) + + @misc_utils.log_exception(_moduleLogger) + def _on_nav_action(self, widget, navState): + if self._player.state == "play": + self._presenter.set_state(self._store.STORE_LOOKUP["play"]) + else: + self._presenter.set_state(self._store.STORE_LOOKUP["pause"]) + + if navState == "clicking": + if self._player.state == "play": + self._player.pause() + else: + self._player.play() + elif navState == "down": + self.emit("home") + self._window.destroy() + elif navState == "up": + pass + elif navState == "left": + self._player.next() + elif navState == "right": + self._player.back() + + +gobject.type_register(ConferenceTalkWindow)