Use the new view plugin structure to offer a flat list person view

svn: r14195
This commit is contained in:
Benny Malengier
2010-02-03 13:01:04 +00:00
parent d97775d07c
commit 967f99bf7b
12 changed files with 244 additions and 154 deletions

View File

@@ -23,7 +23,7 @@
Package init for the treemodels package.
"""
from peoplemodel import PeopleModel
from peoplemodel import PeopleBaseModel, PersonListModel, PersonTreeModel
from familymodel import FamilyModel
from eventmodel import EventModel
from sourcemodel import SourceModel

View File

@@ -392,6 +392,7 @@ class FlatBaseModel(gtk.GenericTreeModel):
self.sort_func = self.smap[scol]
self.sort_col = scol
self.skip = skip
self._in_build = False
self.node_map = FlatNodeMap()
self.set_search(search)
@@ -494,6 +495,15 @@ class FlatBaseModel(gtk.GenericTreeModel):
"""
return None
def clear_cache(self, handle=None):
"""
If you use a cache, overwrite here so it is cleared when this
method is called (on rebuild)
:param handle: if None, clear entire cache, otherwise clear the handle
entry if present
"""
pass
def sort_keys(self):
"""
Return the (sort_key, handle) list of all data that can maximally
@@ -513,6 +523,8 @@ class FlatBaseModel(gtk.GenericTreeModel):
""" function called when view must be build, given a search text
in the top search bar
"""
self.clear_cache()
self._in_build = True
if self.db.is_open():
allkeys = self.node_map.full_srtkey_hndl_map()
if not allkeys:
@@ -534,11 +546,14 @@ class FlatBaseModel(gtk.GenericTreeModel):
reverse=self._reverse)
else:
self.node_map.clear_map()
self._in_build = False
def _rebuild_filter(self, ignore=None):
""" function called when view must be build, given filter options
in the filter sidebar
"""
self.clear_cache()
self._in_build = True
if self.db.is_open():
allkeys = self.node_map.full_srtkey_hndl_map()
if not allkeys:
@@ -561,6 +576,7 @@ class FlatBaseModel(gtk.GenericTreeModel):
reverse=self._reverse)
else:
self.node_map.clear_map()
self._in_build = False
def add_row_by_handle(self, handle):
"""
@@ -584,6 +600,7 @@ class FlatBaseModel(gtk.GenericTreeModel):
"""
Delete a row, called after the object with handle is deleted
"""
self.clear_cache(handle)
data = self.map(handle)
delete_val = (conv_unicode_tosrtkey_ongtk(self.sort_func(data)), handle)
delete_path = self.node_map.delete(delete_val)
@@ -595,6 +612,7 @@ class FlatBaseModel(gtk.GenericTreeModel):
"""
Update a row, called after the object with handle is changed
"""
self.clear_cache(handle)
oldsortkey = self.node_map.get_sortkey(handle)
newsortkey = conv_unicode_tosrtkey_ongtk(self.sort_func(self.map(
handle)))

View File

@@ -32,7 +32,6 @@ TreeModel for the GRAMPS Person tree.
# Standard python modules
#
#-------------------------------------------------------------------------
from __future__ import with_statement
from gen.ggettext import gettext as _
import time
import cgi
@@ -64,6 +63,7 @@ import DateHandler
import ToolTips
import GrampsLocale
from Lru import LRU
from gui.views.treemodels.flatbasemodel import FlatBaseModel
from gui.views.treemodels.treebasemodel import TreeBaseModel
import config
@@ -86,34 +86,26 @@ invalid_date_format = config.get('preferences.invalid-date-format')
#-------------------------------------------------------------------------
#
# PeopleModel
# PeopleBaseModel
#
#-------------------------------------------------------------------------
class PeopleModel(TreeBaseModel):
class PeopleBaseModel(object):
"""
Basic GenericTreeModel interface to handle the Tree interface for
the PersonView
Basic Model interface to handle the PersonViews
"""
_GENDER = [ _(u'female'), _(u'male'), _(u'unknown') ]
# The following is accessed from PersonView - CHECK
COLUMN_INT_ID = 12 # dynamic calculation of column indices
# LRU cache size
_CACHE_SIZE = 250
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING, search=None,
skip=set(), sort_map=None):
def __init__(self, db):
"""
Initialize the model building the initial data
"""
TreeBaseModel.__init__(self, db, search=search, skip=skip,
tooltip_column=11, marker_column=10,
scol=scol, order=order, sort_map=sort_map)
def _set_base_data(self):
"""See TreeBaseModel, we also set some extra lru caches
"""
self.gen_cursor = self.db.get_person_cursor
self.number_items = self.db.get_number_of_people
self.map = self.db.get_raw_person_data
self.gen_cursor = db.get_person_cursor
self.map = db.get_raw_person_data
self.fmap = [
self.column_name,
@@ -145,59 +137,71 @@ class PeopleModel(TreeBaseModel):
self.column_tooltip,
self.column_int_id,
]
self.hmap = [self.column_header] + [None]*len(self.smap)
self.lru_name = LRU(TreeBaseModel._CACHE_SIZE)
self.lru_bdate = LRU(TreeBaseModel._CACHE_SIZE)
self.lru_ddate = LRU(TreeBaseModel._CACHE_SIZE)
#columns are accessed on every mouse over, so it is worthwhile to
#cache columns visible in one screen to avoid expensive database
#lookup of derived values
self.lru_name = LRU(PeopleBaseModel._CACHE_SIZE)
self.lru_spouse = LRU(PeopleBaseModel._CACHE_SIZE)
self.lru_bdate = LRU(PeopleBaseModel._CACHE_SIZE)
self.lru_ddate = LRU(PeopleBaseModel._CACHE_SIZE)
def clear_cache(self):
def clear_local_cache(self, handle=None):
""" Clear the LRU cache """
TreeBaseModel.clear_cache(self)
self.lru_name.clear()
self.lru_bdate.clear()
self.lru_ddate.clear()
if handle:
try:
del self.lru_name[handle]
except KeyError:
pass
try:
del self.lru_spouse[handle]
except KeyError:
pass
try:
del self.lru_bdate[handle]
except KeyError:
pass
try:
del self.lru_ddate[handle]
except KeyError:
pass
else:
self.lru_name.clear()
self.lru_spouse.clear()
self.lru_bdate.clear()
self.lru_ddate.clear()
def on_get_n_columns(self):
""" Return the number of columns in the model """
return len(self.fmap)+1
def get_tree_levels(self):
"""
Return the headings of the levels in the hierarchy.
"""
return ['Group As', 'Name']
def add_row(self, handle, data):
"""
Add nodes to the node map for a single person.
handle The handle of the gramps object.
data The object data.
"""
ngn = name_displayer.name_grouping_data
nsn = name_displayer.raw_sorted_name
name_data = data[COLUMN_NAME]
group_name = ngn(self.db, name_data)
sort_key = self.sort_func(data)
#if group_name not in self.group_list:
#self.group_list.append(group_name)
#self.add_node(None, group_name, group_name, None)
# add as node: parent, child, sortkey, handle; parent and child are
# nodes in the treebasemodel, and will be used as iters
self.add_node(group_name, handle, sort_key, handle)
def sort_name(self, data):
n = Name()
n.unserialize(data[COLUMN_NAME])
return name_displayer.sort_string(n)
def column_spouse(self, data):
spouses_names = u""
def column_name(self, data):
handle = data[0]
if handle in self.lru_name:
name = self.lru_name[handle]
else:
name = name_displayer.raw_sorted_name(data[COLUMN_NAME])
if not self._in_build:
self.lru_name[handle] = name
return name
def column_spouse(self, data):
handle = data[0]
if handle in self.lru_spouse:
value = self.lru_spouse[handle]
else:
value = self._get_spouse_data(data)
if not self._in_build:
self.lru_spouse[handle] = value
return value
def _get_spouse_data(self, data):
spouses_names = u""
for family_handle in data[COLUMN_FAMILY]:
family = self.db.get_family_from_handle(family_handle)
for spouse_id in [family.get_father_handle(),
@@ -212,16 +216,6 @@ class PeopleModel(TreeBaseModel):
spouses_names += name_displayer.display(spouse)
return spouses_names
def column_name(self, data):
handle = data[0]
if handle in self.lru_name:
name = self.lru_name[handle]
else:
name = name_displayer.raw_sorted_name(data[COLUMN_NAME])
if not self._in_build:
self.lru_name[handle] = name
return name
def column_id(self, data):
return data[COLUMN_ID]
@@ -232,7 +226,7 @@ class PeopleModel(TreeBaseModel):
GrampsLocale.codeset)
def column_gender(self, data):
return PeopleModel._GENDER[data[COLUMN_GENDER]]
return PeopleBaseModel._GENDER[data[COLUMN_GENDER]]
def column_birth_day(self, data):
handle = data[0]
@@ -445,9 +439,80 @@ class PeopleModel(TreeBaseModel):
def column_int_id(self, data):
return data[0]
class PersonListModel(PeopleBaseModel, FlatBaseModel):
"""
Listed people model.
"""
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING, search=None,
skip=set(), sort_map=None):
PeopleBaseModel.__init__(self, db)
FlatBaseModel.__init__(self, db, search=search, skip=skip,
tooltip_column=11,
scol=scol, order=order, sort_map=sort_map)
def clear_cache(self, handle=None):
""" Clear the LRU cache """
PeopleBaseModel.clear_local_cache(self, handle)
def marker_column(self):
"""
Return the column for marker colour.
"""
return 10
class PersonTreeModel(PeopleBaseModel, TreeBaseModel):
"""
Hierarchical people model.
"""
def __init__(self, db, scol=0, order=gtk.SORT_ASCENDING, search=None,
skip=set(), sort_map=None):
PeopleBaseModel.__init__(self, db)
TreeBaseModel.__init__(self, db, 11, search=search, skip=skip,
marker_column=10,
scol=scol, order=order, sort_map=sort_map)
def _set_base_data(self):
"""See TreeBaseModel, we also set some extra lru caches
"""
self.number_items = self.db.get_number_of_people
self.hmap = [self.column_header] + [None]*len(self.smap)
def clear_cache(self, handle=None):
""" Clear the LRU cache
overwrite of base methods
"""
TreeBaseModel.clear_cache(self, handle)
PeopleBaseModel.clear_local_cache(self, handle)
def get_tree_levels(self):
"""
Return the headings of the levels in the hierarchy.
"""
return ['Group As', 'Name']
def column_header(self, node):
return node.name
def add_row(self, handle, data):
"""
Add nodes to the node map for a single person.
def column_header_view(self, node):
return True
handle The handle of the gramps object.
data The object data.
"""
ngn = name_displayer.name_grouping_data
nsn = name_displayer.raw_sorted_name
name_data = data[COLUMN_NAME]
group_name = ngn(self.db, name_data)
sort_key = self.sort_func(data)
#if group_name not in self.group_list:
#self.group_list.append(group_name)
#self.add_node(None, group_name, group_name, None)
# add as node: parent, child, sortkey, handle; parent and child are
# nodes in the treebasemodel, and will be used as iters
self.add_node(group_name, handle, sort_key, handle)

View File

@@ -386,11 +386,17 @@ class TreeBaseModel(gtk.GenericTreeModel):
"""
return self._marker_column
def clear_cache(self):
def clear_cache(self, handle=None):
"""
Clear the LRU cache.
"""
self.lru_data.clear()
if handle:
try:
del self.lru_data[handle]
except KeyError:
pass
else:
self.lru_data.clear()
def clear(self):
"""
@@ -671,7 +677,7 @@ class TreeBaseModel(gtk.GenericTreeModel):
Delete a row from the model.
"""
cput = time.clock()
self.clear_cache()
self.clear_cache(handle)
node = self.get_node(handle)
parent = self.nodemap.node(node.parent)