From: Ed Page Date: Tue, 18 May 2010 03:32:32 +0000 (-0500) Subject: Fixing scrolling to cell when I addec viewports (which was to add pannable areas) X-Git-Url: http://git.maemo.org/git/?p=watersofshiloah;a=commitdiff_plain;h=ba0a385b5bf7d4822b63467d23978aca83d95f82;ds=sidebyside Fixing scrolling to cell when I addec viewports (which was to add pannable areas) --- diff --git a/src/mormonchannel_gtk.py b/src/mormonchannel_gtk.py index f3e541e..5eafe64 100755 --- a/src/mormonchannel_gtk.py +++ b/src/mormonchannel_gtk.py @@ -2,7 +2,6 @@ # -*- coding: utf-8 -*- """ -@todo Fix scrollto for Fremantle @todo backgrounds need some resizing @todo Re-use windows for better performance @bug For some reason, the back/close button doesn't work when I nest multiple levels diff --git a/src/windows/_base.py b/src/windows/_base.py index 721aeec..bf5969a 100644 --- a/src/windows/_base.py +++ b/src/windows/_base.py @@ -188,11 +188,11 @@ class ListWindow(BasicWindow): if column is not None: self._treeView.append_column(column) - 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) @@ -274,6 +274,10 @@ class ListWindow(BasicWindow): window = self._window_from_node(child) window.jump_to(node) + @misc_utils.log_exception(_moduleLogger) + def _on_delay_scroll(self, *args): + self._scroll_to_row() + def _show_loading(self): animationPath = self._store.STORE_LOOKUP["loading"] animation = self._store.get_pixbuf_animation_from_store(animationPath) @@ -291,9 +295,30 @@ class ListWindow(BasicWindow): if rowIndex < 0: return path = (rowIndex, ) - self._treeView.scroll_to_cell(path) self._treeView.get_selection().select_path(path) + def _scroll_to_row(self): + rowIndex = self._get_current_row() + if rowIndex < 0: + return + + path = (rowIndex, ) + 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._model) + 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 + class PresenterWindow(BasicWindow): diff --git a/src/windows/conferences.py b/src/windows/conferences.py index 7f11b95..e51aed2 100644 --- a/src/windows/conferences.py +++ b/src/windows/conferences.py @@ -62,6 +62,7 @@ class ConferencesWindow(windows._base.ListWindow): self._model.append(row) self._select_row() + go_utils.Async(self._on_delay_scroll).start() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): @@ -121,6 +122,7 @@ class ConferenceSessionsWindow(windows._base.ListWindow): self._model.append(row) self._select_row() + go_utils.Async(self._on_delay_scroll).start() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): @@ -179,6 +181,7 @@ class ConferenceTalksWindow(windows._base.ListWindow): self._model.append(row) self._select_row() + go_utils.Async(self._on_delay_scroll).start() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): diff --git a/src/windows/magazines.py b/src/windows/magazines.py index bff0853..212c0ef 100644 --- a/src/windows/magazines.py +++ b/src/windows/magazines.py @@ -65,6 +65,7 @@ class MagazinesWindow(windows._base.ListWindow): programNode.get_children(self._create_on_issues(i), self._on_error) self._select_row() + go_utils.Async(self._on_delay_scroll).start() def _create_on_issues(self, row): return lambda issues: self._on_issues(row, issues) @@ -161,6 +162,7 @@ class MagazineIssuesWindow(windows._base.ListWindow): ) self._select_row() + go_utils.Async(self._on_delay_scroll).start() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): @@ -234,6 +236,7 @@ class MagazineArticlesWindow(windows._base.ListWindow): self._model.append(row) self._select_row() + go_utils.Async(self._on_delay_scroll).start() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): diff --git a/src/windows/radio.py b/src/windows/radio.py index d75db1a..faa3789 100644 --- a/src/windows/radio.py +++ b/src/windows/radio.py @@ -7,6 +7,7 @@ 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 @@ -62,11 +63,11 @@ 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) @@ -249,9 +250,12 @@ class RadioWindow(windows._base.BasicWindow): 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): @@ -263,11 +267,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 selection.path_is_selected(path): - # Undo the user's changing of the selection - selection.select_path(path) + 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, ) + 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) diff --git a/src/windows/scriptures.py b/src/windows/scriptures.py index 7c26aed..40274b7 100644 --- a/src/windows/scriptures.py +++ b/src/windows/scriptures.py @@ -54,6 +54,7 @@ class ScripturesWindow(windows._base.ListWindow): self._model.append(row) self._select_row() + go_utils.Async(self._on_delay_scroll).start() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): @@ -113,6 +114,7 @@ class ScriptureBooksWindow(windows._base.ListWindow): self._model.append(row) self._select_row() + go_utils.Async(self._on_delay_scroll).start() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception): @@ -172,6 +174,7 @@ class ScriptureChaptersWindow(windows._base.ListWindow): self._model.append(row) self._select_row() + go_utils.Async(self._on_delay_scroll).start() @misc_utils.log_exception(_moduleLogger) def _on_error(self, exception):