Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/jarabe/journal/homogenetable.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/jarabe/journal/homogenetable.py')
-rw-r--r--src/jarabe/journal/homogenetable.py57
1 files changed, 39 insertions, 18 deletions
diff --git a/src/jarabe/journal/homogenetable.py b/src/jarabe/journal/homogenetable.py
index 64a22ec..43ff4fe 100644
--- a/src/jarabe/journal/homogenetable.py
+++ b/src/jarabe/journal/homogenetable.py
@@ -45,6 +45,7 @@ class VHomogeneTable(gtk.Container):
'set-scroll-adjustments': (gobject.SIGNAL_RUN_FIRST, None,
[gtk.Adjustment, gtk.Adjustment]),
'cursor-changed': (gobject.SIGNAL_RUN_FIRST, None, [object]),
+ 'frame-scrolled': (gobject.SIGNAL_RUN_FIRST, None, []),
}
def __init__(self, cell_class, **kwargs):
@@ -64,6 +65,7 @@ class VHomogeneTable(gtk.Container):
self._selected_index = None
self._editable = True
self._pending_allocate = None
+ self._frame_range = None
gtk.Container.__init__(self, **kwargs)
@@ -115,9 +117,10 @@ class VHomogeneTable(gtk.Container):
def set_cell_count(self, count):
if self._cell_count == count:
return
+
self._cell_count = count
- self.refill()
self._setup_adjustment(dry_run=False)
+ self._resize_table()
"""Number of virtual cells
Defines maximal number of virtual rows, the minimal has being described
@@ -149,6 +152,21 @@ class VHomogeneTable(gtk.Container):
"""Selected cell"""
cursor = gobject.property(getter=get_cursor, setter=set_cursor)
+ def get_frame_range(self):
+ if self._frame_range is None:
+ return xrange(0)
+ else:
+ begin, end = self._frame_range
+ return xrange(begin, end + 1)
+
+ """Range of visible cells"""
+ frame_range = gobject.property(getter=get_frame_range)
+
+ @property
+ def frame_cells(self):
+ for cell in self._cell_cache:
+ yield cell.widget
+
def get_editable(self):
return self._editable
@@ -213,12 +231,12 @@ class VHomogeneTable(gtk.Container):
self._pos_changed()
- def refill(self):
+ def refill(self, cells=None):
"""Force VHomogeneTable widget to run filling method for all cells"""
for cell in self._cell_cache:
- cell.invalidate_pos()
- cell.index = -1
- self._allocate_rows(force=True)
+ if cells is None or cell.index in cells:
+ cell.index = -1
+ self._allocate_rows(force=False)
# gtk.Widget overrides
@@ -360,16 +378,6 @@ class VHomogeneTable(gtk.Container):
return True
@property
- def _frame_range(self):
- if self._empty:
- return xrange(0)
- else:
- first = self._pos_y / self._cell_height * self._column_count
- last = int(math.ceil(float(self._pos_y + self._page) / \
- self._cell_height) * self._column_count)
- return xrange(first, min(last, self.cell_count))
-
- @property
def _empty(self):
return not self._row_cache
@@ -501,6 +509,7 @@ class VHomogeneTable(gtk.Container):
for row in self._row_cache:
for cell in row:
cell.invalidate_pos()
+ cell.index = -1
self._cell_height = height / self._frame_row_count
self._setup_adjustment(dry_run=True)
@@ -561,6 +570,7 @@ class VHomogeneTable(gtk.Container):
spare_rows = []
visible_rows = []
+ frame_rows = []
page_end = pos + self._page
if force:
@@ -584,6 +594,7 @@ class VHomogeneTable(gtk.Container):
row = spare_rows.pop()
self._allocate_cells(row, cell_y)
cell_y = cell_y + self._cell_height
+ frame_rows.append(row)
# visible_rows could not be continuous
# lets try to add spare rows to missed points
@@ -591,16 +602,26 @@ class VHomogeneTable(gtk.Container):
for i in visible_rows:
cell = i.row[0].widget.allocation
try_insert_spare_row(cell_y, cell.y)
+ self._allocate_cells(i.row, cell.y)
cell_y = cell.y + cell.height
+ frame_rows.append(i.row)
try_insert_spare_row(cell_y, page_end)
- if self.editing and self._selected_index not in self._frame_range:
- self.editing = False
-
self._bin_window.move(0, int(-pos))
self._bin_window.process_updates(True)
+ if frame_rows:
+ frame_range = (frame_rows[0][0].index, frame_rows[-1][-1].index)
+ else:
+ frame_range = None
+ if frame_range != self._frame_range:
+ self._frame_range = frame_range
+ self.emit('frame-scrolled')
+
+ if self.editing and self._selected_index not in self.frame_range:
+ self.editing = False
+
def __adjustment_value_changed_cb(self, adjustment):
self._allocate_rows(force=False)