diff --git a/ChangeLog b/ChangeLog index 0e627c80e..ee7ffdb47 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2004-12-19 Don Allingham + * src/DisplayModels.py: use a dictionary to handle reverse + indices instead of list.index function. Drastically reduces + time are larger lists. + * src/GrampsDbBase.py: use cursors to build sorted key lists + * src/PeopleModel.py: fetch sort names out of database first + instead of continuously fetching from database during sort + * src/PeopleView.py: remove unnecessary apply_filter + * src/PlaceView.py: remove commented-out code + * src/ReadXML.py: add gtk event handling to allow screen to + update + * src/gramps.glade: use gramps.png for loading message window + * src/gramps_main.py: remove delete_abandoned_photos calls + +2004-12-16 Don Allingham + * src/PeopleModel.py: Fixed rebuild_display + * src/ReadXML.py: Fixed calendar handling + 2004-12-16 Julio Sanchez * src/po/es.po: forward port of the Spanish translations in STABLE, plus many new translations diff --git a/TODO b/TODO index 39fc26ac2..9cee845ca 100644 --- a/TODO +++ b/TODO @@ -10,10 +10,6 @@ see http://sourceforge.net/mailarchive/forum.php?thread_id=3066997&forum_id=1993 and http://sourceforge.net/mailarchive/forum.php?thread_id=3134931&forum_id=1993 for the details. -* Make Date parsing locale dependent, like relationship calculator -* Add Confession as a standard event -* Now that the completeness flag exists, create filters that are using it - (both individual and family). * Add autofill feature for City, Church parish, County, State and Country? * Move LDS temple info out of const.py and into an XML file * Enhanced web page generator @@ -23,5 +19,4 @@ 3 entries per page. * Add slideshow generation ability to web page generator * Enhance privacy handling -* Better name handling, especially of non-European style names * And a whole lot more.... diff --git a/src/DisplayModels.py b/src/DisplayModels.py index f7c755240..f79033726 100644 --- a/src/DisplayModels.py +++ b/src/DisplayModels.py @@ -51,25 +51,37 @@ class BaseModel(gtk.GenericTreeModel): def rebuild_data(self): if self.db.is_open(): self.datalist = self.sort_keys() + i = 0 + self.indexlist = {} + for key in self.datalist: + self.indexlist[key] = i + i += 1 else: self.datalist = [] + self.indexlist = [] def on_row_inserted(self,obj,path,node): self.rebuild_data() def add_row_by_handle(self,handle): self.datalist = self.sort_keys() - index = self.datalist.index(handle) + i = 0 + self.indexlist = {} + for key in self.datalist: + self.indexlist[key] = i + i += 1 + index = self.indexlist[handle] node = self.get_iter(index) self.row_inserted(index,node) def delete_row_by_handle(self,handle): - index = self.datalist.index(handle) + index = self.indexlist[handle] del self.datalist[index] + del self.indexlist[handle] self.row_deleted(index) def update_row_by_handle(self,handle): - index = self.datalist.index(handle) + index = self.indexlist[handle] node = self.get_iter(index) self.row_changed(index,node) @@ -83,7 +95,7 @@ class BaseModel(gtk.GenericTreeModel): def on_get_path(self, node): '''returns the tree path (a tuple of indices at the various levels) for a particular node.''' - return self.datalist.index(node[0]) + return self.indexlist[node[0]] def on_get_column_type(self,index): return gobject.TYPE_STRING @@ -103,7 +115,7 @@ class BaseModel(gtk.GenericTreeModel): def on_iter_next(self, node): '''returns the next node at this level of the tree''' try: - return self.datalist[self.datalist.index(node)+1] + return self.datalist[self.indexlist[node]+1] except IndexError: return None diff --git a/src/GrampsDbBase.py b/src/GrampsDbBase.py index cf816c844..03259b328 100644 --- a/src/GrampsDbBase.py +++ b/src/GrampsDbBase.py @@ -676,10 +676,18 @@ class GrampsDbBase: the database. If sort_handles is True, the list is sorted by surnames """ if self.person_map: - handle_list = self.person_map.keys() if sort_handles: - handle_list.sort(self._sortbyname) - return handle_list + slist = [] + cursor = self.get_person_cursor() + data = cursor.first() + while data: + slist.append((data[1][3].sname,data[0])) + data = cursor.next() + cursor.close() + slist.sort() + return map(lambda x: x[1], slist) + else: + return self.person_map.keys() return [] def get_place_handles(self,sort_handles=True): @@ -689,10 +697,19 @@ class GrampsDbBase: Place title. """ if self.place_map: - handle_list = self.place_map.keys() if sort_handles: - handle_list.sort(self._sortbyplace) - return handle_list + slist = [] + cursor = self.get_place_cursor() + data = cursor.first() + while data: + slist.append((data[1][2],data[0])) + data = cursor.next() + cursor.close() + slist.sort() + val = map(lambda x: x[1], slist) + return val + else: + return self.place_map.keys() return [] def get_source_handles(self,sort_handles=True): diff --git a/src/PeopleModel.py b/src/PeopleModel.py index ec6c5ab7c..bb3557201 100644 --- a/src/PeopleModel.py +++ b/src/PeopleModel.py @@ -86,7 +86,9 @@ class PeopleModel(gtk.GenericTreeModel): return if data_filter: - keys = self.data_filter.apply(self.db,self.db.get_person_handles(sort_handles=False)) + handle_list = self.db.get_person_handles(sort_handles=False) + keys = data_filter.apply(self.db,handle_list) + del handle_list else: keys = self.db.get_person_handles(sort_handles=False) @@ -107,9 +109,14 @@ class PeopleModel(gtk.GenericTreeModel): temp_top_path2iter = self.sname_sub.keys() temp_top_path2iter.sort(locale.strcoll) for name in temp_top_path2iter: + + slist = [] + for handle in self.sname_sub[name]: + n = self.db.person_map.get(handle)[_NAME_COL].get_sort_name() + slist.append((n,handle)) + slist.sort(self.byname) + entries = map(lambda x: x[1], slist) val = 0 - entries = self.sname_sub[name] - entries.sort(self.byname) for person_handle in entries: tpl = (name,val) temp_iter2path[person_handle] = tpl @@ -120,18 +127,8 @@ class PeopleModel(gtk.GenericTreeModel): self.iter2path = temp_iter2path self.path2iter = temp_path2iter - self.db.set_people_view_maps(self.get_maps()) - - def get_maps(self): - return (self.top_path2iter, - self.iter2path, - self.path2iter, - self.sname_sub) - def byname(self,f,s): - n1 = self.db.person_map.get(str(f))[_NAME_COL].get_sort_name() - n2 = self.db.person_map.get(str(s))[_NAME_COL].get_sort_name() - return locale.strcoll(n1,n2) + return locale.strcoll(f[0],s[0]) def on_get_flags(self): '''returns the GtkTreeModelFlags for this particular type of model''' diff --git a/src/PeopleView.py b/src/PeopleView.py index 60a8ce2f8..c89645eb8 100644 --- a/src/PeopleView.py +++ b/src/PeopleView.py @@ -72,7 +72,7 @@ class PeopleView: all.set_name(_("Entire Database")) all.add_rule(GenericFilter.Everyone([])) - self.DataFilter = all + self.DataFilter = None self.pscroll = self.parent.gtop.get_widget("pscroll") self.person_tree = self.parent.gtop.get_widget("person_tree") self.person_tree.set_rules_hint(gtk.TRUE) @@ -87,9 +87,6 @@ class PeopleView: self.person_tree.connect('button-press-event', self.on_plist_button_press) - def get_maps(self): - return self.person_model.get_maps() - def build_columns(self): for column in self.columns: self.person_tree.remove_column(column) @@ -147,9 +144,6 @@ class PeopleView: self.build_columns() self.person_model = PeopleModel.PeopleModel(db,self.DataFilter) self.sort_model = self.person_model - #self.sort_model = self.person_model.filter_new() - #self.sort_model.set_visible_column(PeopleModel.COLUMN_VIEW) - self.apply_filter() self.person_tree.set_model(self.sort_model) def remove_from_person_list(self,person): diff --git a/src/PlaceView.py b/src/PlaceView.py index cc1e637e3..f8ee261d2 100644 --- a/src/PlaceView.py +++ b/src/PlaceView.py @@ -70,7 +70,6 @@ class PlaceView: self.parent = parent self.glade = glade self.list = glade.get_widget("place_list") - #self.list.set_property('fixed-height-mode',True) self.list.connect('button-press-event',self.button_press) self.list.connect('key-press-event',self.key_press) self.selection = self.list.get_selection() diff --git a/src/ReadXML.py b/src/ReadXML.py index 91e8a4c60..df7c61f8a 100644 --- a/src/ReadXML.py +++ b/src/ReadXML.py @@ -1142,6 +1142,8 @@ class GrampsParser: def stop_family(self,*tag): self.db.commit_family(self.family,self.trans,self.change) self.family = None + while gtk.events_pending(): + gtk.main_iteration() def stop_event(self,*tag): self.event.name = self.event_type @@ -1186,6 +1188,8 @@ class GrampsParser: self.event.set_place_handle(self.placeobj.get_handle()) self.db.commit_place(self.placeobj,self.trans,self.change) self.placeobj = None + while gtk.events_pending(): + gtk.main_iteration() def stop_date(self,tag): if tag: @@ -1203,6 +1207,8 @@ class GrampsParser: def stop_person(self,*tag): self.db.commit_person(self.person,self.trans,self.change) self.person = None + while gtk.events_pending(): + gtk.main_iteration() def stop_description(self,tag): self.event.set_description(tag) diff --git a/src/gramps.glade b/src/gramps.glade index f55c8eb55..0a555929c 100644 --- a/src/gramps.glade +++ b/src/gramps.glade @@ -31735,36 +31735,16 @@ Family name Given name 12 True - 2 + 3 2 False - 0 - 0 - - - - True - gtk-dialog-info - 6 - 0.5 - 0 - 0 - 0 - - - 0 - 1 - 0 - 2 - fill - fill - - + 6 + 6 True - <span size="larger" weight="bold">Loading Database</span> + <span size="larger" weight="bold">Loading database</span> False True GTK_JUSTIFY_LEFT @@ -31808,6 +31788,49 @@ Family name Given name + + + + True + + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + + + 1 + 2 + 2 + 3 + fill + + + + + + + True + gramps.png + 0.5 + 0 + 0 + 0 + + + 0 + 1 + 0 + 3 + fill + fill + + diff --git a/src/gramps_main.py b/src/gramps_main.py index f09176d06..251ce7ba9 100755 --- a/src/gramps_main.py +++ b/src/gramps_main.py @@ -77,10 +77,7 @@ import RecentFiles from QuestionDialog import * -try: # First try python2.3 and later: this is the future - from bsddb import db -except ImportError: # try python2.2 - from bsddb3 import db +from bsddb import db #------------------------------------------------------------------------- # @@ -598,7 +595,8 @@ class Gramps: item = gtk.MenuItem("_%d. %s [%s]" % (num,person.get_primary_name().get_name(), person.get_gramps_id())) - item.connect("activate",self.bookmark_callback,person.get_handle()) + item.connect("activate",self.bookmark_callback, + person.get_handle()) item.show() gomenu.append(item) num = num + 1 @@ -629,7 +627,9 @@ class Gramps: break person = self.db.get_person_from_handle(pid) item = gtk.MenuItem("%s. %s [%s]" % - (hotkey,person.get_primary_name().get_name(),person.get_gramps_id())) + (hotkey, + person.get_primary_name().get_name(), + person.get_gramps_id())) item.connect("activate",self.back_clicked,num) item.show() backhistmenu.append(item) @@ -657,7 +657,9 @@ class Gramps: break person = self.db.get_person_from_handle(pid) item = gtk.MenuItem("%s. %s [%s]" % - (hotkey,person.get_primary_name().get_name(),person.get_gramps_id())) + (hotkey, + person.get_primary_name().get_name(), + person.get_gramps_id())) item.connect("activate",self.fwd_clicked,num) item.show() fwdhistmenu.append(item) @@ -901,29 +903,18 @@ class Gramps: def on_exit_activate(self,obj): """Prompt to save on exit if needed""" - self.delete_abandoned_photos() self.db.close() gtk.main_quit() def quit(self): """Catch the reponse to the save on exit question""" - self.delete_abandoned_photos() self.db.close() gtk.main_quit() def close_noquit(self): """Close database and delete abandoned photos, no quit""" - self.delete_abandoned_photos() self.db.close() - def delete_abandoned_photos(self): - """ - We only want to delete local objects, not external objects, however, we - can delete any thumbnail images. The thumbnails may or may not exist, depending - on if the image was previewed. - """ - self.db.set_people_view_maps(self.people_view.get_maps()) - def on_about_activate(self,obj): """Displays the about box. Called from Help menu""" pixbuf = gtk.gdk.pixbuf_new_from_file(const.logo) @@ -1026,7 +1017,8 @@ class Gramps: def read_xml(self,filename): import ReadXML - filename = os.path.normpath(os.path.abspath(os.path.join(filename,const.xmlFile))) + filename = os.path.normpath( + os.path.abspath(os.path.join(filename,const.xmlFile))) try: ReadXML.importData(self.db,filename,None) @@ -1602,9 +1594,10 @@ class Gramps: if self.db.load(filename,self.load_progress) == 0: self.status_text('') return 0 - self.status_text('') - return self.post_load(name) + + val = self.post_load(name) + return val def setup_bookmarks(self): self.bookmarks = Bookmarks.Bookmarks(self.db,self.db.get_bookmarks(), diff --git a/src/plugins/ReorderIds.py b/src/plugins/ReorderIds.py index 7efec924c..602324a89 100644 --- a/src/plugins/ReorderIds.py +++ b/src/plugins/ReorderIds.py @@ -33,13 +33,6 @@ _findint = re.compile('^[^\d]*(\d+)[^\d]*') def runTool(db,active_person,callback,parent): """Changed person, family, object, source, and place ids""" - # FIXME: Remove when plugin is properly implemented - from QuestionDialog import OkDialog - OkDialog(_("Plugin unavailable"), - _("This plugin is not implemented yet. Please check the next version."), - parent.topWindow) - return - try: ReorderIds(db,callback) except: @@ -52,33 +45,31 @@ class ReorderIds: self.db = db - self.reorder(db.get_person_handle_map(),db.iprefix,db.build_person_display) + self.reorder_person() self.reorder(db.get_family_handle_map(),db.fprefix,None) self.reorder(db.get_object_map(),db.oprefix,None) self.reorder(db.get_source_map(),db.sprefix,db.build_source_display) self.reorder(db.get_place_handle_map(),db.pprefix,db.build_place_display) - Utils.history_broken() callback(1) - def reorder(self,data_map,prefix,update): - """Try to extract the old integer out of the id, and reuse it - if possible. Otherwise, blindly renumber those that can't.""" - + def reorder_person(): dups = [] newids = {} key_list = [] # search all ids in the map - for x in data_map.keys(): - key_list.append(x) + cursor = self.db.get_person_cursor() + data = cursor.first() + while data: + (handle,sdata) = data + + gramps_id = sdata[1] - for handle in key_list: - # attempt to extract integer, if we can't, treat it as a # duplicate - match = _findint.match(handle) + match = _findint.match(gramps_id) if match: # get the integer, build the new handle. Make sure it # hasn't already been chosen. If it has, put this @@ -86,42 +77,45 @@ class ReorderIds: try: index = match.groups()[0] - newhandle = prefix % int(index) - if newhandle == handle: - newids[newhandle] = handle + newgramps_id = prefix % int(index) + if newgramps_id == gramps_id: + newids[newgramps_id] = gramps_id continue - elif data_map.has_key(newhandle): + elif data_map.has_key(newgramps_id): dups.append(handle) else: - data = data_map[handle] - data_map[newhandle] = data - newids[newhandle] = handle - data.set_handle(newhandle) - del data_map[handle] + data = data_map[gramps_id] + data_map[newgramps_id] = data + newids[newgramps_id] = gramps_id + data.set_gramps_id(newgramps_id) + del data_map[gramps_id] if update: - update(newhandle,handle) + update(newgramps_id,gramps_id) except: dups.append(handle) else: dups.append(handle) + + data = cursor.next() + # go through the duplicates, looking for the first availble # handle that matches the new scheme. index = 0 - for handle in dups: + for gramps_id in dups: while 1: - newhandle = prefix % index - if not newids.has_key(newhandle): + newgramps_id = prefix % index + if not newids.has_key(newgramps_id): break index = index + 1 - newids[newhandle] = newhandle - data = data_map[handle] - data.set_handle(newhandle) - data_map[newhandle] = data + newids[newgramps_id] = newgramps_id + data = data_map[gramps_id] + data.set_gramps_id(newgramps_id) + data_map[newgramps_id] = data if update: - update(newhandle,handle) - del data_map[handle] + update(newgramps_id,gramps_id) + del data_map[gramps_id] #------------------------------------------------------------------------- #