diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index f2fc19192..01db2a60b 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,10 @@ +2006-01-19 Don Allingham + * src/DisplayModels.py: use dirty flag to only draw when requested + * src/PageView.py: use dirty flag to only draw when requested + * src/PeopleView.py: use dirty flag to only draw when requested + * src/PeopleModel.py: provide simple caching + * src/ViewManager.py: control dirty flags + 2006-01-19 Richard Taylor * src/ObjectSelector/_PersonFilterFrame.py, src/ObjectSelector/_PersonFrame.py src/ObjectSelector/_PersonTreeFrame.py: filters in Person view just about work. diff --git a/gramps2/src/DisplayModels.py b/gramps2/src/DisplayModels.py index 3fd9b2f39..82464af37 100644 --- a/gramps2/src/DisplayModels.py +++ b/gramps2/src/DisplayModels.py @@ -71,6 +71,8 @@ class BaseModel(gtk.GenericTreeModel): def __init__(self,db,scol=0,order=gtk.SORT_ASCENDING,tooltip_column=None): gtk.GenericTreeModel.__init__(self) + self.prev_handle = None + self.prev_data = None self.set_property("leak_references",False) self.db = db self.sort_func = self.smap[scol] @@ -161,7 +163,10 @@ class BaseModel(gtk.GenericTreeModel): def on_get_value(self,node,col): try: - return self.fmap[col](self.map(str(node))) + if node != self.prev_handle: + self.prev_data = self.map(str(node)) + self.prev_handle = node + return self.fmap[col](self.prev_data) except: return u'' diff --git a/gramps2/src/GenericFilter.py b/gramps2/src/GenericFilter.py index 792d7ad6b..a98950958 100644 --- a/gramps2/src/GenericFilter.py +++ b/gramps2/src/GenericFilter.py @@ -2652,7 +2652,7 @@ class FilterWidget: def get_filter( self): print "get_filter" - print self.DataFilter.flist[0] + #print self.DataFilter.flist[0] return self.DataFilter def inverted( self): diff --git a/gramps2/src/PageView.py b/gramps2/src/PageView.py index 6b648f4f2..02239d86f 100644 --- a/gramps2/src/PageView.py +++ b/gramps2/src/PageView.py @@ -47,6 +47,20 @@ class PageView: self.ui = '' self.dbstate.connect('no-database',self.disable_action_group) self.dbstate.connect('database-changed',self.enable_action_group) + self.dirty = True + self.active = False + + def set_active(self): + self.active = True + if self.dirty: + print self,"set active dirty" + self.build_tree() + + def set_inactive(self): + self.active = False + + def build_tree(self): + pass def navigation_type(self): return NAVIGATION_NONE @@ -405,33 +419,53 @@ class ListView(PageView): index += 1 def build_tree(self): - self.model = self.make_model(self.dbstate.db,self.sort_col) - self.list.set_model(self.model) - self.selection = self.list.get_selection() - - if self.model.tooltip_column != None: - self.tooltips = TreeTips.TreeTips(self.list, - self.model.tooltip_column,True) + if self.active: + self.model = self.make_model(self.dbstate.db,self.sort_col) + self.list.set_model(self.model) + self.selection = self.list.get_selection() + if self.model.tooltip_column != None: + self.tooltips = TreeTips.TreeTips(self.list, + self.model.tooltip_column,True) + self.dirty = False + else: + self.dirty = True + def change_db(self,db): for sig in self.signal_map: db.connect(sig, self.signal_map[sig]) self.model = self.make_model(self.dbstate.db,0) self.list.set_model(self.model) self.build_columns() - self.build_tree() + if self.active: + self.build_tree() + else: + print self,"change_db dirty" + self.dirty = True def row_add(self,handle_list): - for handle in handle_list: - self.model.add_row_by_handle(handle) + if self.active: + for handle in handle_list: + self.model.add_row_by_handle(handle) + else: + print self,"row add dirty" + self.dirty = True def row_update(self,handle_list): - for handle in handle_list: - self.model.update_row_by_handle(handle) + if self.active: + for handle in handle_list: + self.model.update_row_by_handle(handle) + else: + print self,"row update dirty" + self.dirty = True def row_delete(self,handle_list): - for handle in handle_list: - self.model.delete_row_by_handle(handle) + if self.active: + for handle in handle_list: + self.model.delete_row_by_handle(handle) + else: + print self,"row delete dirty" + self.dirty = True def define_actions(self): """ diff --git a/gramps2/src/PeopleModel.py b/gramps2/src/PeopleModel.py index 85df80dc5..03433f251 100644 --- a/gramps2/src/PeopleModel.py +++ b/gramps2/src/PeopleModel.py @@ -112,8 +112,10 @@ class PeopleModel(gtk.GenericTreeModel): self.sortnames = {} self.marker_color_column = 11 self.tooltip_column = 12 + self.prev_handle = None + self.prev_data = None self.rebuild_data(data_filter) - + def rebuild_data(self,data_filter=None,skip=None): self.calculate_data(data_filter,skip) self.assign_data() @@ -236,7 +238,10 @@ class PeopleModel(gtk.GenericTreeModel): # return values for 'data' row, calling a function # according to column_defs table try: - return COLUMN_DEFS[col][COLUMN_DEF_LIST](self,self.db.get_raw_person_data(str(node)),node) + if node != self.prev_handle: + self.prev_data = self.db.get_raw_person_data(str(node)) + self.prev_handle = node + return COLUMN_DEFS[col][COLUMN_DEF_LIST](self,self.prev_data,node) except: print "".join(traceback.format_exception(*sys.exc_info())) return u'error' diff --git a/gramps2/src/PersonView.py b/gramps2/src/PersonView.py index 69dea5808..6c4c1540b 100644 --- a/gramps2/src/PersonView.py +++ b/gramps2/src/PersonView.py @@ -231,6 +231,12 @@ class PersonView(PageView.PersonNavView): self.generic_filter_widget.apply_filter() def goto_active_person(self,obj=None): + import time + t = time.time() + self.goto_active_person_2(None) + print time.time() - t + + def goto_active_person_2(self,obj=None): """ Callback (and usable function) that selects the active person in the display tree. @@ -319,14 +325,17 @@ class PersonView(PageView.PersonNavView): Creates a new PeopleModel instance. Essentially creates a complete rebuild of the data. """ - self.model = PeopleModel.PeopleModel( - self.dbstate.db, self.generic_filter_widget.get_filter(), self.generic_filter_widget.inverted()) - self.tree.set_model(self.model) - - if self.model.tooltip_column != None: - self.tooltips = TreeTips.TreeTips(self.tree,self.model.tooltip_column,True) - self.build_columns() + if self.active: + self.model = PeopleModel.PeopleModel( + self.dbstate.db, self.generic_filter_widget.get_filter(), self.generic_filter_widget.inverted()) + self.tree.set_model(self.model) + if self.model.tooltip_column != None: + self.tooltips = TreeTips.TreeTips(self.tree,self.model.tooltip_column,True) + self.build_columns() + self.dirty = False + else: + self.dirty = True def filter_toggle(self,obj): if obj.get_active(): diff --git a/gramps2/src/ViewManager.py b/gramps2/src/ViewManager.py index af970a9ff..48f594a20 100644 --- a/gramps2/src/ViewManager.py +++ b/gramps2/src/ViewManager.py @@ -466,22 +466,28 @@ class ViewManager: index += 1 self.bbox.pack_start(button,False) + self.active_page = self.pages[0] + self.active_page.set_active() + def change_page(self,obj,page,num=-1): if num == -1: num = self.notebook.get_current_page() + if self.state.open == True: for mergeid in self.merge_ids: self.uimanager.remove_ui(mergeid) if self.active_page: + self.active_page.set_inactive() groups = self.active_page.get_actions() for grp in groups: self.uimanager.remove_action_group(grp) if len(self.pages) > 0: self.active_page = self.pages[num] - + self.active_page.set_active() + old_nav = self.navigation_type[self.prev_nav] if old_nav[0] != None: old_nav[0].disable()