X-Git-Url: http://git.maemo.org/git/?p=watersofshiloah;a=blobdiff_plain;f=src%2Fwindows.py;h=0820900446eac4dfa3c895add19ea61e0b844a0c;hp=c056586c557dae4db329c7048afdfd2f26ccfaf6;hb=48391603fc793625843346917737373b891212a9;hpb=5ce7396688f8dbea8bb461ad6ecc49a766558361 diff --git a/src/windows.py b/src/windows.py index c056586..0820900 100644 --- a/src/windows.py +++ b/src/windows.py @@ -350,8 +350,8 @@ class RadioWindow(BasicWindow): self._layout.pack_start(self._loadingBanner.toplevel, False, False) self._layout.pack_start(self._radioLayout, True, True) - self._window.set_title(self._node.title) self._dateShown = datetime.datetime.now() + self._update_title() def show(self): BasicWindow.show(self) @@ -364,6 +364,9 @@ class RadioWindow(BasicWindow): def jump_to(self, node): _moduleLogger.info("Only 1 channel, nothing to jump to") + def _update_title(self): + self._window.set_title("%s - %s" % (self._node.title, self._dateShown.strftime("%m/%d"))) + @property def _active(self): return self._player.node is self._childNode @@ -441,12 +444,11 @@ class RadioWindow(BasicWindow): _moduleLogger.info("Unhandled player state %s" % self._player.state) elif navState == "down": imageName = "home" - elif navState == "up": - imageName = "play" - elif navState == "left": - imageName = "play" - elif navState == "right": - imageName = "play" + else: + if self._player.state == self._player.STATE_PLAY: + imageName = "pause" + else: + imageName = "play" self._presenter.set_state(self._store.STORE_LOOKUP[imageName]) @@ -474,9 +476,11 @@ class RadioWindow(BasicWindow): pass elif navState == "left": self._dateShown += datetime.timedelta(days=1) + self._update_title() self._refresh() elif navState == "right": self._dateShown -= datetime.timedelta(days=1) + self._update_title() self._refresh() @misc_utils.log_exception(_moduleLogger) @@ -541,6 +545,8 @@ class ListWindow(BasicWindow): BasicWindow.__init__(self, player, store) self._node = node + self.connect_auto(self._player, "title-change", self._on_player_title_change) + self._loadingBanner = banners.GenericBanner() modelTypes, columns = zip(*self._get_columns()) @@ -617,6 +623,10 @@ class ListWindow(BasicWindow): raise NotImplementedError("") @misc_utils.log_exception(_moduleLogger) + def _on_player_title_change(self, player, node): + self._select_row() + + @misc_utils.log_exception(_moduleLogger) def _on_jump(self, source, node): ancestors, current, descendants = stream_index.common_paths(node, self._node) if current is None: @@ -644,7 +654,10 @@ class ListWindow(BasicWindow): self._model.clear() def _select_row(self): - path = (self._get_current_row(), ) + rowIndex = self._get_current_row() + if rowIndex < 0: + return + path = (rowIndex, ) self._treeView.scroll_to_cell(path) self._treeView.get_selection().select_path(path) @@ -690,9 +703,7 @@ class ConferencesWindow(ListWindow): row = programNode, program["title"], program["full_title"] self._model.append(row) - path = (self._get_current_row(), ) - self._treeView.scroll_to_cell(path) - self._treeView.get_selection().select_path(path) + self._select_row() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): @@ -755,9 +766,7 @@ class ConferenceSessionsWindow(ListWindow): row = programNode, program["title"] self._model.append(row) - path = (self._get_current_row(), ) - self._treeView.scroll_to_cell(path) - self._treeView.get_selection().select_path(path) + self._select_row() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): @@ -820,9 +829,7 @@ class ConferenceTalksWindow(ListWindow): row = programNode, "%s\n%s" % (program["title"], program["speaker"]) self._model.append(row) - path = (self._get_current_row(), ) - self._treeView.scroll_to_cell(path) - self._treeView.get_selection().select_path(path) + self._select_row() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): @@ -855,8 +862,12 @@ class ConferenceTalkWindow(BasicWindow): def __init__(self, player, store, node): BasicWindow.__init__(self, player, store) self._node = node + self._playerNode = self._player.node + self._nextSearch = None + self._updateSeek = None self.connect_auto(self._player, "state-change", self._on_player_state_change) + self.connect_auto(self._player, "title-change", self._on_player_title_change) self.connect_auto(self._player, "error", self._on_player_error) self._loadingBanner = banners.GenericBanner() @@ -872,8 +883,12 @@ class ConferenceTalkWindow(BasicWindow): self._presenterNavigation.connect("action", self._on_nav_action) self._presenterNavigation.connect("navigating", self._on_navigating) + self._seekbar = hildonize.create_seekbar() + self._seekbar.connect("change-value", self._on_user_seek) + self._layout.pack_start(self._loadingBanner.toplevel, False, False) self._layout.pack_start(self._presenterNavigation.toplevel, True, True) + self._layout.pack_start(self._seekbar, False, False) self._window.set_title(self._node.title) @@ -883,13 +898,14 @@ class ConferenceTalkWindow(BasicWindow): self._errorBanner.toplevel.hide() self._loadingBanner.toplevel.hide() self._set_context(self._player.state) + self._seekbar.hide() def jump_to(self, node): assert self._node is node @property def _active(self): - return self._player.node is self._node + return self._playerNode is self._node def _show_loading(self): animationPath = self._store.STORE_LOOKUP["loading"] @@ -913,11 +929,37 @@ class ConferenceTalkWindow(BasicWindow): _moduleLogger.info("Unhandled player state %s" % state) @misc_utils.log_exception(_moduleLogger) + def _on_user_seek(self, widget, scroll, value): + self._player.seek(value / 100.0) + + @misc_utils.log_exception(_moduleLogger) + def _on_player_update_seek(self): + self._seekbar.set_value(self._player.percent_elapsed * 100) + return True if not self._isDestroyed else False + + @misc_utils.log_exception(_moduleLogger) def _on_player_state_change(self, player, newState): - if self._presenterNavigation.is_active(): - return + if self._active and self._player.state == self._player.STATE_PLAY: + self._seekbar.show() + assert self._updateSeek is None + self._updateSeek = go_utils.Timeout(self._updateSeek, once=False) + self._updateSeek.start(seconds=30) + else: + self._seekbar.hide() + self._updateSeek.cancel() + self._updateSeek = None - self._set_context(newState) + if not self._presenterNavigation.is_active(): + self._set_context(newState) + + @misc_utils.log_exception(_moduleLogger) + def _on_player_title_change(self, player, node): + if not self._active or node in [None, self._node]: + self._playerNode = player.node + return + self._playerNode = player.node + self.emit("jump-to", node) + self._window.destroy() @misc_utils.log_exception(_moduleLogger) def _on_player_error(self, player, err, debug): @@ -940,7 +982,17 @@ class ConferenceTalkWindow(BasicWindow): elif navState == "down": imageName = "home" elif navState == "up": - imageName = "play" + if self._player.state == self._player.STATE_PLAY: + if self._active: + imageName = "pause" + else: + imageName = "play" + elif self._player.state == self._player.STATE_PAUSE: + imageName = "play" + elif self._player.state == self._player.STATE_STOP: + imageName = "play" + else: + _moduleLogger.info("Unhandled player state %s" % self._player.state) elif navState == "left": imageName = "next" elif navState == "right": @@ -972,9 +1024,30 @@ class ConferenceTalkWindow(BasicWindow): elif navState == "up": pass elif navState == "left": - self._player.next() + if self._active: + self._player.next() + else: + assert self._nextSearch is None + self._nextSearch = stream_index.AsyncWalker(stream_index.get_next) + self._nextSearch.start(self._node, self._on_next_node, self._on_node_search_error) elif navState == "right": - self._player.back() + if self._active: + self._player.back() + else: + assert self._nextSearch is None + self._nextSearch = stream_index.AsyncWalker(stream_index.get_previous) + self._nextSearch.start(self._node, self._on_next_node, self._on_node_search_error) + + @misc_utils.log_exception(_moduleLogger) + def _on_next_node(self, node): + self._nextSearch = None + self.emit("jump-to", node) + self._window.destroy() + + @misc_utils.log_exception(_moduleLogger) + def _on_node_search_error(self, e): + self._nextSearch = None + self._errorBanner.push_message(str(e)) gobject.type_register(ConferenceTalkWindow)