Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/jarabe/journal/browse/lazymodel.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/jarabe/journal/browse/lazymodel.py')
-rw-r--r--src/jarabe/journal/browse/lazymodel.py154
1 files changed, 83 insertions, 71 deletions
diff --git a/src/jarabe/journal/browse/lazymodel.py b/src/jarabe/journal/browse/lazymodel.py
index 8e5c12e..d590fbc 100644
--- a/src/jarabe/journal/browse/lazymodel.py
+++ b/src/jarabe/journal/browse/lazymodel.py
@@ -18,10 +18,13 @@ import gtk
import logging
from gobject import GObject, SIGNAL_RUN_FIRST, TYPE_PYOBJECT
+
class Source(GObject):
+
__gsignals__ = {
'objects-updated': (SIGNAL_RUN_FIRST, None, []),
- 'row-delayed-fetch': (SIGNAL_RUN_FIRST, None, 2*[TYPE_PYOBJECT]) }
+ 'row-delayed-fetch': (SIGNAL_RUN_FIRST, None, 2 * [TYPE_PYOBJECT]),
+ }
def get_count(self):
""" Returns number of objects """
@@ -46,28 +49,36 @@ class Source(GObject):
""" Set current order """
pass
+
class LazyModel(gtk.GenericTreeModel):
- def __init__(self, columns, calc_columns={}):
+
+ def __init__(self, columns, calc_columns=None):
""" columns/calc_columns = {field_name: (column_num, column_type)} """
gtk.GenericTreeModel.__init__(self)
- self._columns_by_name = {}
- self._columns_by_num = {}
- self._columns_types = {}
+ self.columns_by_name = {}
+ self.columns_by_num = {}
+ self.columns_types = {}
for name, i in columns.items():
- self._columns_by_name[name] = i[0]
- self._columns_by_num[i[0]] = name
- self._columns_types[i[0]] = i[1]
+ self.columns_by_name[name] = i[0]
+ self.columns_by_num[i[0]] = name
+ self.columns_types[i[0]] = i[1]
- for name, i in calc_columns.items():
- self._columns_types[i[0]] = i[1]
+ if calc_columns is not None:
+ for name, i in calc_columns.items():
+ self.columns_types[i[0]] = i[1]
- self._n_columns = max(self._columns_types.keys()) + 1
+ self._n_columns = max(self.columns_types.keys()) + 1
self._source = None
self._closing = False
self._view = None
+ self._last_count = 0
+ self._cache = {}
+ self._frame = (0, -1)
+ self._in_process = {}
+ self._postponed = []
self.set_source(None, force=True)
self.set_view(None, force=True)
@@ -85,12 +96,12 @@ class LazyModel(gtk.GenericTreeModel):
if self._source is not None:
self._source.disconnect_by_func(self.refresh)
- self._source.disconnect_by_func(self._delayed_fetch_cb)
+ self._source.disconnect_by_func(self.__delayed_fetch_cb)
self._source = source
if self._source is not None:
self._source.connect('objects-updated', self.refresh)
- self._source.connect('row-delayed-fetch', self._delayed_fetch_cb)
+ self._source.connect('row-delayed-fetch', self.__delayed_fetch_cb)
self.refresh()
@@ -129,17 +140,17 @@ class LazyModel(gtk.GenericTreeModel):
view = property(get_view, set_view)
def get_order(self):
- if not self._source:
+ if self._source is None:
return None
order = self._source.get_order()
if order is None:
return None
- return (self._columns_by_name[order[0]], order[1])
+ return (self.columns_by_name[order[0]], order[1])
def set_order(self, column, order):
- if not self._source:
+ if self._source is None:
return
- self._source.set_order(self._columns_by_num[column], order)
+ self._source.set_order(self.columns_by_num[column], order)
self._update_columns()
def refresh(self, sender=None):
@@ -157,17 +168,17 @@ class LazyModel(gtk.GenericTreeModel):
# commented for now since in TableView
# it works fine w/o these updates
#for i in range(self._last_count, count):
- # self.emit('row-inserted', (i,), self.get_iter((i,)))
+ # self.emit('row-inserted', (i, ), self.get_iter((i, )))
#for i in reversed(range(count, self._last_count)):
- # self.emit('row-deleted', (i,))
+ # self.emit('row-deleted', (i, ))
if self._last_count != count:
- self.emit('rows-reordered', (0,), self.get_iter((0,)), None)
+ self.emit('rows-reordered', (0, ), self.get_iter((0, )), None)
if self._frame[0] >= count:
self._frame = (0, -1)
elif self._frame[1] >= count:
for i in range(count, self._frame[1]):
- if self._cache.has_key(i):
+ if i in self._cache:
del self._cache[i]
self._frame = (self._frame[0], count-1)
@@ -175,40 +186,40 @@ class LazyModel(gtk.GenericTreeModel):
if self._last_count == count:
for i in range(self._frame[0], self._frame[1]+1):
- self.emit('row-changed', (i,), self.get_iter((i,)))
+ self.emit('row-changed', (i, ), self.get_iter((i, )))
self._last_count = count
def recalc(self, fields):
for i, row in self._cache.items():
for field in fields:
- if row.has_key(field):
+ if field in row:
del row[field]
- self.emit('row-changed', (i,), self.get_iter((i,)))
+ self.emit('row-changed', (i, ), self.get_iter((i, )))
def get_row(self, pos, frame=None):
- if not self._source:
+ if self._source is None:
return False
if not isinstance(pos, tuple):
pos = self.get_path(pos)
return self._get_row(pos[0], frame or (pos, pos))
- def _delayed_fetch_cb(self, source, offset, object):
- if not self._in_process.has_key(offset):
- logging.debug('_delayed_fetch_cb: no offset=%s' % offset)
+ def __delayed_fetch_cb(self, source, offset, metadata):
+ if not offset in self._in_process:
+ logging.debug('__delayed_fetch_cb: no offset=%s' % offset)
return
- logging.debug('_delayed_fetch_cb: get %s' % offset)
+ logging.debug('__delayed_fetch_cb: get %s' % offset)
- path = (offset,)
- iter = self.get_iter(path)
- row = Row(self, path, iter, object)
+ path = (offset, )
+ iterator = self.get_iter(path)
+ row = Row(self, path, iterator, metadata)
if self.in_frame(offset):
self._cache[offset] = row
del self._in_process[offset]
- self.emit('row-changed', path, iter)
+ self.emit('row-changed', path, iterator)
if self._in_process:
return
@@ -216,13 +227,14 @@ class LazyModel(gtk.GenericTreeModel):
offset, force = self._postponed.pop()
if not force and not self.in_frame(offset):
continue
- row = self.get_row((offset,))
- if row:
- self.emit('row-changed', row.path, row.iter)
+ row = self.get_row((offset, ))
+ if row is not None and row != False:
+ self.emit('row-changed', row.path, row.iterator)
else:
break
def _get_row(self, offset, frame):
+
def fetch():
row = self._source.get_row(offset)
@@ -234,12 +246,12 @@ class LazyModel(gtk.GenericTreeModel):
self._in_process[offset] = True
return None
- row = Row(self, (offset,), self.get_iter(offset), row)
+ row = Row(self, (offset, ), self.get_iter(offset), row)
self._cache[offset] = row
return row
out = self._cache.get(offset)
- if out:
+ if out is not None:
return out
if frame[0] >= frame[1]:
@@ -259,10 +271,10 @@ class LazyModel(gtk.GenericTreeModel):
self._cache = {}
else:
for i in range(self._frame[0], intersect_min):
- if self._cache.has_key(i):
+ if i in self._cache:
del self._cache[i]
for i in range(intersect_max+1, self._frame[1]+1):
- if self._cache.has_key(i):
+ if i in self._cache:
del self._cache[i]
self._frame = frame
@@ -274,7 +286,7 @@ class LazyModel(gtk.GenericTreeModel):
def _update_columns(self):
order = self.get_order()
- if not order or not hasattr(self._view, 'get_columns'):
+ if order is None or not hasattr(self._view, 'get_columns'):
return
for column in self._view.get_columns():
@@ -287,38 +299,36 @@ class LazyModel(gtk.GenericTreeModel):
def in_frame(self, offset):
return offset >= self._frame[0] and offset <= self._frame[1]
- # interface implementation -------------------------------------------------
-
def on_get_n_columns(self):
return self._n_columns
def on_get_column_type(self, index):
- return self._columns_types.get(index, bool)
+ return self.columns_types.get(index, bool)
- def on_iter_n_children(self, iter):
- if iter is None and not self._closing:
+ def on_iter_n_children(self, iterator):
+ if iterator is None and not self._closing:
return self._source.get_count()
else:
return 0
def on_get_value(self, offset, column):
- if not self._view or offset >= self._source.get_count():
+ if self._view is None or offset >= self._source.get_count():
return None
- # return value only if iter came from visible range
+ # return value only if iterator came from visible range
# (on setting model, gtk.TreeView scans all items)
- range = self._view.get_visible_range()
- if range and offset >= range[0][0] and offset <= range[1][0]:
- row = self._get_row(offset, (range[0][0], range[1][0]))
- return row and row[column]
+ vrange = self._view.get_visible_range()
+ if vrange and offset >= vrange[0][0] and offset <= vrange[1][0]:
+ row = self._get_row(offset, (vrange[0][0], vrange[1][0]))
+ return row is not None and row != False and row[column]
return None
- def on_iter_nth_child(self, iter, n):
+ def on_iter_nth_child(self, iterator, n):
return n
- def on_get_path(self, iter):
- return (iter)
+ def on_get_path(self, iterator):
+ return iterator
def on_get_iter(self, path):
if self._source.get_count() and not self._closing:
@@ -326,36 +336,38 @@ class LazyModel(gtk.GenericTreeModel):
else:
return False
- def on_iter_next(self, iter):
- if iter != None:
- if iter >= self._source.get_count() - 1 or self._closing:
+ def on_iter_next(self, iterator):
+ if iterator is not None:
+ if iterator >= self._source.get_count() - 1 or self._closing:
return None
- return iter + 1
+ return iterator + 1
return None
def on_get_flags(self):
return gtk.TREE_MODEL_ITERS_PERSIST | gtk.TREE_MODEL_LIST_ONLY
- def on_iter_children(self, iter):
+ def on_iter_children(self, iterator):
return None
- def on_iter_has_child(self, iter):
+ def on_iter_has_child(self, iterator):
return False
- def on_iter_parent(self, iter):
+ def on_iter_parent(self, iterator):
return None
+
class Row:
- def __init__(self, model, path, iter, object):
+
+ def __init__(self, model, path, iterator, metadata):
self.model = model
- self.iter = iter
+ self.iterator = iterator
self.path = path
- self.metadata = object
- self.row = [None] * len(model._columns_by_name)
+ self.metadata = metadata
+ self.row = [None] * len(model.columns_by_name)
self._calced_row = {}
- for name, value in object.items():
- column = model._columns_by_name.get(str(name), -1)
+ for name, value in metadata.items():
+ column = model.columns_by_name.get(str(name), -1)
if column != -1:
self.row[column] = value
@@ -364,7 +376,7 @@ class Row:
if key < len(self.row):
return self.row[key]
else:
- if self._calced_row.has_key(key):
+ if key in self._calced_row:
return self._calced_row[key]
else:
value = self.model.on_calc_value(self, key)
@@ -394,7 +406,7 @@ class Row:
def __contains__(self, key):
if isinstance(key, int):
- return key < len(self.row) or self._calced_row.has_key(key)
+ return key < len(self.row) or key in self._calced_row
else:
return self.metadata.__contains__(key)
@@ -402,7 +414,7 @@ class Row:
return self.__contains__(key)
def get(self, key, default=None):
- if self.has_key(key):
+ if key in self:
return self.__getitem__(key)
else:
return default