X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwindows%2Fradio.py;h=0aea0d701d2270bdbda4fac9b3a8436f40e13262;hb=HEAD;hp=436f5328427b01dbfacdc934b90d95891932be35;hpb=be76b644bf353e9cdd223cb17e4c19f296190366;p=watersofshiloah diff --git a/src/windows/radio.py b/src/windows/radio.py index 436f532..0aea0d7 100644 --- a/src/windows/radio.py +++ b/src/windows/radio.py @@ -6,6 +6,8 @@ import gtk import hildonize import util.misc as misc_utils +import util.time_utils as time_utils +import util.go_utils as go_utils import banners import presenter @@ -27,13 +29,6 @@ class RadioWindow(windows._base.BasicWindow): self._loadingBanner = banners.GenericBanner() - headerPath = self._store.STORE_LOOKUP["radio_header"] - self._header = self._store.get_image_from_store(headerPath) - self._headerNavigation = presenter.NavigationBox() - self._headerNavigation.toplevel.add(self._header) - self._headerNavigation.connect("action", self._on_nav_action) - self._headerNavigation.connect("navigating", self._on_navigating) - self._programmingModel = gtk.ListStore( gobject.TYPE_STRING, gobject.TYPE_STRING, @@ -61,31 +56,35 @@ class RadioWindow(windows._base.BasicWindow): self._treeView.append_column(titleColumn) self._treeView.get_selection().connect("changed", self._on_row_changed) - viewport = gtk.Viewport() - viewport.add(self._treeView) + self._viewport = gtk.Viewport() + self._viewport.add(self._treeView) self._treeScroller = gtk.ScrolledWindow() - self._treeScroller.add(viewport) + self._treeScroller.add(self._viewport) self._treeScroller.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) self._treeScroller = hildonize.hildonize_scrollwindow(self._treeScroller) self._presenter = presenter.StreamMiniPresenter(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.connect_auto(self._presenterNavigation, "action", self._on_nav_action) + self.connect_auto(self._presenterNavigation, "navigating", self._on_navigating) + self.connect_auto(self._player, "error", self._on_player_error) self._radioLayout = gtk.VBox(False) - self._radioLayout.pack_start(self._headerNavigation.toplevel, False, False) self._radioLayout.pack_start(self._treeScroller, True, True) self._radioLayout.pack_start(self._presenterNavigation.toplevel, False, True) self._layout.pack_start(self._loadingBanner.toplevel, False, False) self._layout.pack_start(self._radioLayout, True, True) - self._dateShown = datetime.datetime.now() + self._dateShown = datetime.datetime.now(tz=time_utils.Mountain) + self._currentTime = self._dateShown self._update_title() + self._continualUpdate = go_utils.Timeout(self._on_continual_update, once = False) + self._continualUpdate.start(seconds=60) + def show(self): windows._base.BasicWindow.show(self) @@ -97,6 +96,15 @@ class RadioWindow(windows._base.BasicWindow): def jump_to(self, node): _moduleLogger.info("Only 1 channel, nothing to jump to") + def _update_time(self, newTime): + oldTime = self._dateShown + self._dateShown = newTime + if newTime.date() == oldTime.date(): + self._select_row() + else: + self._update_title() + self._refresh() + def _update_title(self): self._window.set_title("%s - %s" % (self._node.title, self._dateShown.strftime("%m/%d"))) @@ -148,8 +156,28 @@ class RadioWindow(windows._base.BasicWindow): return i @misc_utils.log_exception(_moduleLogger) + def _on_player_error(self, player, err, debug): + assert not self._isDestroyed + _moduleLogger.error("%r - %r" % (err, debug)) + self._errorBanner.push_message(err) + + @misc_utils.log_exception(_moduleLogger) + def _on_continual_update(self, *args): + if self._isDestroyed: + return False + newTime = datetime.datetime.now(tz=time_utils.Mountain) + oldTime = self._currentTime + shownTime = self._dateShown + + self._currentTime = newTime + if shownTime.date() == oldTime.date(): + _moduleLogger.info("Today selected, updating selection") + self._update_time(newTime) + return True + + @misc_utils.log_exception(_moduleLogger) def _on_player_state_change(self, player, newState): - if self._headerNavigation.is_active() or self._presenterNavigation.is_active(): + if self._presenterNavigation.is_active(): return self._set_context(newState) @@ -208,13 +236,9 @@ class RadioWindow(windows._base.BasicWindow): elif navState == "up": pass elif navState == "left": - self._dateShown += datetime.timedelta(days=1) - self._update_title() - self._refresh() + self._update_time(self._dateShown + datetime.timedelta(days=1)) elif navState == "right": - self._dateShown -= datetime.timedelta(days=1) - self._update_title() - self._refresh() + self._update_time(self._dateShown - datetime.timedelta(days=1)) @misc_utils.log_exception(_moduleLogger) def _on_channels(self, channels): @@ -243,14 +267,17 @@ class RadioWindow(windows._base.BasicWindow): row = program["time"], program["title"] self._programmingModel.append(row) - currentDate = datetime.datetime.now() + currentDate = self._currentTime if currentDate.date() != self._dateShown.date(): self._treeView.get_selection().set_mode(gtk.SELECTION_NONE) else: self._treeView.get_selection().set_mode(gtk.SELECTION_SINGLE) - path = (self._get_current_row(), ) - self._treeView.scroll_to_cell(path) - self._treeView.get_selection().select_path(path) + self._select_row() + go_utils.Async(self._on_delay_scroll).start() + + @misc_utils.log_exception(_moduleLogger) + def _on_delay_scroll(self, *args): + self._scroll_to_row() @misc_utils.log_exception(_moduleLogger) def _on_load_error(self, exception): @@ -262,11 +289,40 @@ class RadioWindow(windows._base.BasicWindow): if len(self._programmingModel) == 0: return + # Undo the user's changing of the selection + self._select_row() + + def _select_row(self): + rowIndex = self._get_current_row() + if rowIndex < 0: + return + path = (rowIndex, ) + if not self._treeView.get_selection().path_is_selected(path): + self._treeView.get_selection().select_path(path) + + def _scroll_to_row(self): + if self._isDestroyed: + return rowIndex = self._get_current_row() + if rowIndex < 0: + return + path = (rowIndex, ) - if not selection.path_is_selected(path): - # Undo the user's changing of the selection - selection.select_path(path) + self._treeView.scroll_to_cell(path) + + treeViewHeight = self._treeView.get_allocation().height + viewportHeight = self._viewport.get_allocation().height + + viewsPerPort = treeViewHeight / float(viewportHeight) + maxRows = len(self._programmingModel) + percentThrough = rowIndex / float(maxRows) + dxByIndex = int(viewsPerPort * percentThrough * viewportHeight) + + dxMax = max(treeViewHeight - viewportHeight, 0) + + dx = min(dxByIndex, dxMax) + adjustment = self._treeScroller.get_vadjustment() + adjustment.value = dx gobject.type_register(RadioWindow)