Bug 2616. Fixes for memory leaks in person and family editors
svn: r12141
This commit is contained in:
		| @@ -2,7 +2,7 @@ | ||||
| # Gramps - a GTK+/GNOME based genealogy program | ||||
| # | ||||
| # Copyright (C) 2000-2007  Donald N. Allingham | ||||
| #               2009       Gary Burton | ||||
| # Copyright (C) 2009       Gary Burton | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| @@ -414,6 +414,8 @@ class EditFamily(EditPrimary): | ||||
|                              family, dbstate.db.get_family_from_handle, | ||||
|                              dbstate.db.get_family_from_gramps_id) | ||||
|  | ||||
|         self.track_ref_for_deletion("tooltips") | ||||
|  | ||||
|         # look for the scenerio of a child and no parents on a new | ||||
|         # family | ||||
|          | ||||
| @@ -466,10 +468,10 @@ class EditFamily(EditPrimary): | ||||
|  | ||||
|             self.obj = self.dbstate.db.get_family_from_handle(self.obj.get_handle()) | ||||
|             self.reload_people() | ||||
|             self.event_embed.rebuild() | ||||
|             self.source_embed.rebuild() | ||||
|             self.attr_embed.data = self.obj.get_attribute_list() | ||||
|             self.attr_embed.rebuild() | ||||
|             self.event_list.rebuild() | ||||
|             self.source_list.rebuild() | ||||
|             self.attr_list.data = self.obj.get_attribute_list() | ||||
|             self.attr_list.rebuild() | ||||
|             self.lds_embed.data = self.obj.get_lds_ord_list() | ||||
|             self.lds_embed.rebuild() | ||||
|  | ||||
| @@ -497,7 +499,7 @@ class EditFamily(EditPrimary): | ||||
|  | ||||
|         mhandle = self.obj.get_mother_handle() | ||||
|         self.update_mother(mhandle) | ||||
|         self.child_list.rebuild() | ||||
|         self.child_tab.rebuild() | ||||
|  | ||||
|     def get_menu_title(self): | ||||
|         if self.obj.get_handle(): | ||||
| @@ -524,7 +526,6 @@ class EditFamily(EditPrimary): | ||||
|         # FIXME: remove if we can use show() | ||||
|         self.window.show_all = self.window.show | ||||
|  | ||||
|  | ||||
|         self.fbirth  = self.top.get_widget('fbirth') | ||||
|         self.fdeath  = self.top.get_widget('fdeath') | ||||
|         self.fbirth_label = self.top.get_widget('label578') | ||||
| @@ -629,38 +630,57 @@ class EditFamily(EditPrimary): | ||||
|  | ||||
|         notebook = gtk.Notebook() | ||||
|  | ||||
|         self.child_list = self._add_tab( | ||||
|             notebook, | ||||
|             ChildEmbedList(self.dbstate,self.uistate, self.track, self.obj)) | ||||
|         self.child_list = ChildEmbedList(self.dbstate, | ||||
|                                          self.uistate, | ||||
|                                          self.track, | ||||
|                                          self.obj) | ||||
|         self.child_tab = self._add_tab(notebook, self.child_list) | ||||
|         self.track_ref_for_deletion("child_list") | ||||
|         self.track_ref_for_deletion("child_tab") | ||||
|          | ||||
|         self.event_embed = EventEmbedList(self.dbstate, self.uistate,  | ||||
|                                           self.track,self.obj) | ||||
|         self.event_list = self._add_tab(notebook, self.event_embed) | ||||
|         self.event_list = EventEmbedList(self.dbstate, | ||||
|                                          self.uistate,  | ||||
|                                          self.track, | ||||
|                                          self.obj) | ||||
|         self._add_tab(notebook, self.event_list) | ||||
|         self.track_ref_for_deletion("event_list") | ||||
|              | ||||
|         self.source_embed = SourceEmbedList(self.dbstate, self.uistate,  | ||||
|                                             self.track, self.obj) | ||||
|         self.src_list = self._add_tab(notebook, self.source_embed) | ||||
|              | ||||
|         self.attr_embed = FamilyAttrEmbedList(self.dbstate, self.uistate,  | ||||
|         self.source_list = SourceEmbedList(self.dbstate, | ||||
|                                            self.uistate,  | ||||
|                                            self.track, | ||||
|                                            self.obj) | ||||
|         self._add_tab(notebook, self.source_list) | ||||
|         self.track_ref_for_deletion("source_list") | ||||
|  | ||||
|         self.attr_list = FamilyAttrEmbedList(self.dbstate, | ||||
|                                               self.uistate,  | ||||
|                                               self.track, | ||||
|                                               self.obj.get_attribute_list()) | ||||
|         self.attr_list = self._add_tab(notebook, self.attr_embed) | ||||
|         self._add_tab(notebook, self.attr_list) | ||||
|         self.track_ref_for_deletion("attr_list") | ||||
|              | ||||
|         self.note_tab = self._add_tab( | ||||
|             notebook, | ||||
|             NoteTab(self.dbstate, self.uistate, self.track, | ||||
|                     self.obj.get_note_list(), self.get_menu_title(), | ||||
|                     notetype=gen.lib.NoteType.FAMILY)) | ||||
|         self.note_tab = NoteTab(self.dbstate, | ||||
|                                 self.uistate, | ||||
|                                 self.track, | ||||
|                                 self.obj.get_note_list(), | ||||
|                                 self.get_menu_title(), | ||||
|                                 notetype=gen.lib.NoteType.FAMILY) | ||||
|         self._add_tab(notebook, self.note_tab) | ||||
|         self.track_ref_for_deletion("note_tab") | ||||
|              | ||||
|         self.gallery_tab = self._add_tab( | ||||
|             notebook, | ||||
|             GalleryTab(self.dbstate, self.uistate, self.track, | ||||
|                        self.obj.get_media_list())) | ||||
|         self.gallery_tab = GalleryTab(self.dbstate, | ||||
|                                       self.uistate, | ||||
|                                       self.track, | ||||
|                                       self.obj.get_media_list()) | ||||
|         self._add_tab(notebook, self.gallery_tab) | ||||
|         self.track_ref_for_deletion("gallery_tab") | ||||
|  | ||||
|         self.lds_embed = FamilyLdsEmbedList(self.dbstate, self.uistate,  | ||||
|         self.lds_embed = FamilyLdsEmbedList(self.dbstate, | ||||
|                                             self.uistate,  | ||||
|                                             self.track, | ||||
|                                             self.obj.get_lds_ord_list()) | ||||
|         self.lds_list = self._add_tab(notebook, self.lds_embed) | ||||
|         self._add_tab(notebook, self.lds_embed) | ||||
|         self.track_ref_for_deletion("lds_embed") | ||||
|  | ||||
|         self._setup_notebook_tabs( notebook) | ||||
|         notebook.show_all() | ||||
|   | ||||
| @@ -2,7 +2,7 @@ | ||||
| # Gramps - a GTK+/GNOME based genealogy program | ||||
| # | ||||
| # Copyright (C) 2000-2007  Donald N. Allingham | ||||
| #               2009       Gary Burton | ||||
| # Copyright (C) 2009       Gary Burton | ||||
| # | ||||
| # This program is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| @@ -313,66 +313,92 @@ class EditPerson(EditPrimary): | ||||
|         notebook = gtk.Notebook() | ||||
|         notebook.set_scrollable(True) | ||||
|  | ||||
|         self.event_list = self._add_tab( | ||||
|             notebook,  | ||||
|             PersonEventEmbedList(self.dbstate, self.uistate,  | ||||
|                                  self.track, self.obj)) | ||||
|         self.event_list = PersonEventEmbedList(self.dbstate, | ||||
|                                                self.uistate,  | ||||
|                                                self.track, | ||||
|                                                self.obj) | ||||
|         self._add_tab(notebook, self.event_list)  | ||||
|         self.track_ref_for_deletion("event_list") | ||||
|          | ||||
|         self.name_list = self._add_tab( | ||||
|             notebook,  | ||||
|             NameEmbedList(self.dbstate, self.uistate, self.track,  | ||||
|                           self.obj.get_alternate_names(), self.obj, | ||||
|                           self.name_callback)) | ||||
|         self.name_list = NameEmbedList(self.dbstate, | ||||
|                                        self.uistate, | ||||
|                                        self.track,  | ||||
|                                        self.obj.get_alternate_names(), | ||||
|                                        self.obj, | ||||
|                                        self.name_callback) | ||||
|         self._add_tab(notebook, self.name_list) | ||||
|         self.track_ref_for_deletion("name_list") | ||||
|          | ||||
|         self.srcref_list = self._add_tab( | ||||
|             notebook,  | ||||
|             SourceEmbedList(self.dbstate,self.uistate,self.track,self.obj)) | ||||
|         self.srcref_list = SourceEmbedList(self.dbstate, | ||||
|                                            self.uistate, | ||||
|                                            self.track, | ||||
|                                            self.obj) | ||||
|         self._add_tab(notebook, self.srcref_list)  | ||||
|         self.track_ref_for_deletion("srcref_list") | ||||
|          | ||||
|         self.attr_list = self._add_tab( | ||||
|             notebook,  | ||||
|             AttrEmbedList(self.dbstate, self.uistate, self.track,  | ||||
|                           self.obj.get_attribute_list())) | ||||
|         self.attr_list = AttrEmbedList(self.dbstate, | ||||
|                                        self.uistate, | ||||
|                                        self.track,  | ||||
|                                        self.obj.get_attribute_list()) | ||||
|         self._add_tab(notebook, self.attr_list)  | ||||
|         self.track_ref_for_deletion("attr_list") | ||||
|          | ||||
|         self.addr_list = self._add_tab( | ||||
|             notebook,  | ||||
|             AddrEmbedList(self.dbstate, self.uistate, self.track,  | ||||
|                           self.obj.get_address_list())) | ||||
|         self.addr_list = AddrEmbedList(self.dbstate, | ||||
|                                        self.uistate, | ||||
|                                        self.track,  | ||||
|                                        self.obj.get_address_list()) | ||||
|         self._add_tab(notebook, self.addr_list)  | ||||
|         self.track_ref_for_deletion("addr_list") | ||||
|          | ||||
|         self.note_tab = self._add_tab( | ||||
|             notebook,  | ||||
|             NoteTab(self.dbstate, self.uistate, self.track,  | ||||
|                     self.obj.get_note_list(), self.get_menu_title(), | ||||
|                     notetype=gen.lib.NoteType.PERSON)) | ||||
|         self.note_tab = NoteTab(self.dbstate, | ||||
|                                 self.uistate, | ||||
|                                 self.track,  | ||||
|                                 self.obj.get_note_list(), | ||||
|                                 self.get_menu_title(), | ||||
|                                 notetype=gen.lib.NoteType.PERSON) | ||||
|         self._add_tab(notebook, self.note_tab)  | ||||
|         self.track_ref_for_deletion("note_tab") | ||||
|          | ||||
|         self.gallery_tab = self._add_tab( | ||||
|             notebook,  | ||||
|             GalleryTab(self.dbstate, self.uistate, self.track,  | ||||
|                        self.obj.get_media_list(), | ||||
|                        self.load_person_image)) | ||||
|         self.gallery_tab = GalleryTab(self.dbstate, | ||||
|                                       self.uistate, | ||||
|                                       self.track,  | ||||
|                                       self.obj.get_media_list(), | ||||
|                                       self.load_person_image) | ||||
|         self._add_tab(notebook, self.gallery_tab) | ||||
|         self.track_ref_for_deletion("gallery_tab") | ||||
|          | ||||
|         self.web_list = self._add_tab( | ||||
|             notebook,  | ||||
|             WebEmbedList(self.dbstate, self.uistate, self.track,  | ||||
|                          self.obj.get_url_list())) | ||||
|         self.web_list = WebEmbedList(self.dbstate, | ||||
|                                      self.uistate, | ||||
|                                      self.track,  | ||||
|                                      self.obj.get_url_list()) | ||||
|         self._add_tab(notebook, self.web_list) | ||||
|         self.track_ref_for_deletion("web_list") | ||||
|  | ||||
|         self.person_ref_list = PersonRefEmbedList(self.dbstate, self.uistate,  | ||||
|                                                   self.track,  | ||||
|                                                   self.obj.get_person_ref_list()) | ||||
|         self.pref_list = self._add_tab(notebook, self.person_ref_list) | ||||
|         self.lds_list = self._add_tab( | ||||
|             notebook,  | ||||
|             LdsEmbedList(self.dbstate, self.uistate, self.track,  | ||||
|                          self.obj.get_lds_ord_list())) | ||||
|         self._add_tab(notebook, self.person_ref_list) | ||||
|         self.track_ref_for_deletion("person_ref_list") | ||||
|  | ||||
|         self.backref_tab = self._add_tab( | ||||
|             notebook, | ||||
|             PersonBackRefList(self.dbstate, self.uistate, self.track, | ||||
|                               self.db.find_backlink_handles(self.obj.handle))) | ||||
|         self.lds_list = LdsEmbedList(self.dbstate, | ||||
|                                      self.uistate, | ||||
|                                      self.track,  | ||||
|                                      self.obj.get_lds_ord_list()) | ||||
|         self._add_tab(notebook, self.lds_list) | ||||
|         self.track_ref_for_deletion("lds_list") | ||||
|  | ||||
|         self._setup_notebook_tabs( notebook) | ||||
|         self.backref_tab = PersonBackRefList(self.dbstate, | ||||
|                                              self.uistate, | ||||
|                                              self.track, | ||||
|                               self.db.find_backlink_handles(self.obj.handle)) | ||||
|         self._add_tab(notebook, self.backref_tab) | ||||
|         self.track_ref_for_deletion("backref_tab") | ||||
|  | ||||
|         self._setup_notebook_tabs(notebook) | ||||
|         notebook.show_all() | ||||
|         self.top.get_widget('vbox').pack_start(notebook, True) | ||||
|  | ||||
|  | ||||
|     def _changed_title(self, obj): | ||||
|         """ | ||||
|         callback to changes typed by user to the person name. | ||||
| @@ -509,6 +535,8 @@ class EditPerson(EditPrimary): | ||||
|         """ | ||||
|         self.all_action    = gtk.ActionGroup("/PersonAll") | ||||
|         self.home_action   = gtk.ActionGroup("/PersonHome") | ||||
|         self.track_ref_for_deletion("all_action") | ||||
|         self.track_ref_for_deletion("home_action") | ||||
|          | ||||
|         self.all_action.add_actions([ | ||||
|                 ('ActivePerson', gtk.STOCK_APPLY, _("Make Active Person"),  | ||||
|   | ||||
| @@ -467,8 +467,8 @@ class ManagedWindow: | ||||
|  | ||||
|         Takes care of closing children and removing itself from menu. | ||||
|         """ | ||||
|         self.clean_up() | ||||
|         self._save_size() | ||||
|         self.clean_up() | ||||
|         self.uistate.gwm.close_track(self.track) | ||||
|         self.opened = False | ||||
|         self.parent_window.present() | ||||
| @@ -515,12 +515,14 @@ class ManagedWindow: | ||||
|         """ | ||||
|         Remove any instance variables from scope which point to non-glade | ||||
|         GTK objects so that the class can be garbage collected. | ||||
|         Run the clean_up method on the object first before removing it. | ||||
|         If the object is a Gramps widget then it should have a clean_up method | ||||
|         which can be called that removes any other GTK object it contains. | ||||
|         """ | ||||
|         while len(self.__refs_for_deletion):  | ||||
|             attr = self.__refs_for_deletion.pop() | ||||
|             obj = getattr(self, attr) | ||||
|             obj.clean_up() | ||||
|             if hasattr(obj, 'clean_up'): | ||||
|                 obj.clean_up() | ||||
|             delattr(self, attr) | ||||
| #------------------------------------------------------------------------- | ||||
| # | ||||
|   | ||||
		Reference in New Issue
	
	Block a user