From 654d5269b7204be2171c5610e7432dd5eb3e7e41 Mon Sep 17 00:00:00 2001
From: Aleksey Lim <alsroot@member.fsf.org>
Date: Sun, 6 Sep 2009 06:58:49 +0000
Subject: Journal list view: jumping back to first page when popping up a palette #1235
---
src/jarabe/journal/listmodel.py | 57 +++++++++++++++++++++++++++++++++-----
src/jarabe/journal/listview.py | 39 ++++++++------------------
src/jarabe/journal/model.py | 3 ++
3 files changed, 64 insertions(+), 35 deletions(-)
diff --git a/src/jarabe/journal/listmodel.py b/src/jarabe/journal/listmodel.py
index 917fbb1..0e1a3c8 100644
a
|
b
|
class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource): |
35 | 35 | __gtype_name__ = 'JournalListModel' |
36 | 36 | |
37 | 37 | __gsignals__ = { |
| 38 | 'setup': (gobject.SIGNAL_RUN_FIRST, |
| 39 | gobject.TYPE_NONE, |
| 40 | ([])), |
38 | 41 | 'ready': (gobject.SIGNAL_RUN_FIRST, |
39 | 42 | gobject.TYPE_NONE, |
40 | 43 | ([])), |
41 | 44 | 'progress': (gobject.SIGNAL_RUN_FIRST, |
42 | 45 | gobject.TYPE_NONE, |
43 | 46 | ([])), |
| 47 | 'invalidated': (gobject.SIGNAL_RUN_FIRST, |
| 48 | gobject.TYPE_NONE, |
| 49 | ([])), |
44 | 50 | } |
45 | 51 | |
46 | 52 | COLUMN_UID = 0 |
… |
… |
class ListModel(gtk.GenericTreeModel, gtk.TreeDragSource): |
67 | 73 | |
68 | 74 | _PAGE_SIZE = 10 |
69 | 75 | |
70 | | def __init__(self, query): |
| 76 | def __init__(self): |
71 | 77 | gobject.GObject.__init__(self) |
72 | 78 | |
| 79 | self._query = None |
73 | 80 | self._last_requested_index = None |
74 | 81 | self._cached_row = None |
75 | | self._result_set = model.find(query, ListModel._PAGE_SIZE) |
| 82 | self._result_set = None |
76 | 83 | self._temp_drag_file_path = None |
77 | 84 | |
78 | 85 | # HACK: The view will tell us that it is resizing so the model can |
79 | 86 | # avoid hitting D-Bus and disk. |
80 | 87 | self.view_is_resizing = False |
81 | 88 | |
82 | | self._result_set.ready.connect(self.__result_set_ready_cb) |
| 89 | model.updated.connect(self.__model_updated_cb) |
| 90 | model.created.connect(self.__model_created_cb) |
| 91 | model.deleted.connect(self.__model_deleted_cb) |
| 92 | |
| 93 | def refresh(self, query): |
| 94 | self._query = query |
| 95 | |
| 96 | old_len = None |
| 97 | if self._result_set is not None: |
| 98 | old_len = self._result_set.length |
| 99 | self._result_set.stop() |
| 100 | |
| 101 | self._last_requested_index = None |
| 102 | self._cached_row = None |
| 103 | |
| 104 | self.emit('setup') |
| 105 | |
| 106 | def result_set_ready_cb(**kwargs): |
| 107 | if old_len is not None: |
| 108 | new_len = self._result_set.length |
| 109 | for i in range(old_len, new_len): |
| 110 | self.emit('row-inserted', (i, ), self.get_iter((i, ))) |
| 111 | for i in reversed(range(new_len, old_len)): |
| 112 | self.emit('row-deleted', (i, )) |
| 113 | self.emit('ready') |
| 114 | |
| 115 | self._result_set = model.find(self._query, ListModel._PAGE_SIZE) |
| 116 | self._result_set.ready.connect(result_set_ready_cb, weak=False) |
83 | 117 | self._result_set.progress.connect(self.__result_set_progress_cb) |
| 118 | self._result_set.setup() |
| 119 | |
| 120 | def __model_updated_cb(self, sender, **kwargs): |
| 121 | self._result_set.invalidate() |
| 122 | self._last_requested_index = None |
| 123 | self._cached_row = None |
| 124 | self.emit('invalidated') |
| 125 | |
| 126 | def __model_created_cb(self, sender, **kwargs): |
| 127 | self.refresh(self._query) |
84 | 128 | |
85 | | def __result_set_ready_cb(self, **kwargs): |
86 | | self.emit('ready') |
| 129 | def __model_deleted_cb(self, sender, **kwargs): |
| 130 | self.refresh(self._query) |
87 | 131 | |
88 | 132 | def __result_set_progress_cb(self, **kwargs): |
89 | 133 | self.emit('progress') |
90 | 134 | |
91 | | def setup(self): |
92 | | self._result_set.setup() |
93 | | |
94 | 135 | def stop(self): |
95 | 136 | self._result_set.stop() |
96 | 137 | |
diff --git a/src/jarabe/journal/listview.py b/src/jarabe/journal/listview.py
index 057b7c4..6d21fc7 100644
a
|
b
|
class BaseListView(gtk.Bin): |
101 | 101 | |
102 | 102 | # Auto-update stuff |
103 | 103 | self._fully_obscured = True |
104 | | self._dirty = False |
105 | 104 | self._refresh_idle_handler = None |
106 | 105 | self._update_dates_timer = None |
107 | 106 | |
108 | | model.created.connect(self.__model_created_cb) |
109 | | model.updated.connect(self.__model_updated_cb) |
110 | | model.deleted.connect(self.__model_deleted_cb) |
111 | | |
112 | | def __model_created_cb(self, sender, **kwargs): |
113 | | self._set_dirty() |
114 | | |
115 | | def __model_updated_cb(self, sender, **kwargs): |
116 | | self._set_dirty() |
117 | | |
118 | | def __model_deleted_cb(self, sender, **kwargs): |
119 | | self._set_dirty() |
120 | | |
121 | 107 | def _add_columns(self): |
122 | 108 | cell_favorite = CellRendererFavorite(self.tree_view) |
123 | 109 | cell_favorite.connect('clicked', self.__favorite_clicked_cb) |
… |
… |
class BaseListView(gtk.Bin): |
261 | 247 | def __favorite_clicked_cb(self, cell, path): |
262 | 248 | row = self._model[path] |
263 | 249 | metadata = model.get(row[ListModel.COLUMN_UID]) |
264 | | if metadata['keep'] == '1': |
| 250 | if 'keep' in metadata and metadata['keep'] == '1': |
265 | 251 | metadata['keep'] = '0' |
266 | 252 | else: |
267 | 253 | metadata['keep'] = '1' |
… |
… |
class BaseListView(gtk.Bin): |
278 | 264 | |
279 | 265 | def refresh(self): |
280 | 266 | logging.debug('ListView.refresh query %r', self._query) |
281 | | self._stop_progress_bar() |
282 | | self._start_progress_bar() |
283 | 267 | |
284 | 268 | if self._model is not None: |
285 | 269 | self._model.stop() |
286 | 270 | |
287 | | self._model = ListModel(self._query) |
| 271 | self._model = ListModel() |
| 272 | self._model.connect('setup', self.__model_setup_cb) |
288 | 273 | self._model.connect('ready', self.__model_ready_cb) |
289 | 274 | self._model.connect('progress', self.__model_progress_cb) |
290 | | self._model.setup() |
| 275 | self._model.connect('invalidated', self.__model_invalidated_cb) |
| 276 | self._model.refresh(self._query) |
| 277 | |
| 278 | def __model_setup_cb(self, tree_model): |
| 279 | self._stop_progress_bar() |
| 280 | self._start_progress_bar() |
291 | 281 | |
292 | 282 | def __model_ready_cb(self, tree_model): |
293 | 283 | self._stop_progress_bar() |
… |
… |
class BaseListView(gtk.Bin): |
320 | 310 | self._progress_bar.pulse() |
321 | 311 | self._last_progress_bar_pulse = time.time() |
322 | 312 | |
| 313 | def __model_invalidated_cb(self, tree_model): |
| 314 | self.tree_view.queue_draw() |
| 315 | |
323 | 316 | def _start_progress_bar(self): |
324 | 317 | alignment = gtk.Alignment(xalign=0.5, yalign=0.5, xscale=0.5) |
325 | 318 | self.remove(self.child) |
… |
… |
class BaseListView(gtk.Bin): |
408 | 401 | next_iter = self._model.iter_next(self._model.get_iter(path)) |
409 | 402 | path = self._model.get_path(next_iter) |
410 | 403 | |
411 | | def _set_dirty(self): |
412 | | if self._fully_obscured: |
413 | | self._dirty = True |
414 | | else: |
415 | | self.refresh() |
416 | | |
417 | 404 | def set_is_visible(self, visible): |
418 | 405 | logging.debug('canvas_visibility_notify_event_cb %r', visible) |
419 | 406 | if visible: |
420 | 407 | self._fully_obscured = False |
421 | | if self._dirty: |
422 | | self.refresh() |
423 | 408 | if self._update_dates_timer is None: |
424 | 409 | logging.debug('Adding date updating timer') |
425 | 410 | self._update_dates_timer = \ |
diff --git a/src/jarabe/journal/model.py b/src/jarabe/journal/model.py
index 8ae78d8..76ac791 100644
a
|
b
|
class BaseResultSet(object): |
199 | 199 | |
200 | 200 | return self._cache[self._position - self._offset] |
201 | 201 | |
| 202 | def invalidate(self): |
| 203 | self._cache = _Cache() |
| 204 | |
202 | 205 | class DatastoreResultSet(BaseResultSet): |
203 | 206 | """Encapsulates the result of a query on the datastore |
204 | 207 | """ |