From 912e5556e2775356c0803c38fcc3a5779af933a6 Mon Sep 17 00:00:00 2001 From: Gary Burton Date: Thu, 26 Feb 2009 21:44:22 +0000 Subject: [PATCH] Bug 2616. Fixes for memory leaks in person and family editors svn: r12141 --- src/Editors/_EditFamily.py | 80 +++++++++++++++---------- src/Editors/_EditPerson.py | 118 +++++++++++++++++++++++-------------- src/ManagedWindow.py | 8 ++- 3 files changed, 128 insertions(+), 78 deletions(-) diff --git a/src/Editors/_EditFamily.py b/src/Editors/_EditFamily.py index e8c859d63..6e60798c3 100644 --- a/src/Editors/_EditFamily.py +++ b/src/Editors/_EditFamily.py @@ -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() diff --git a/src/Editors/_EditPerson.py b/src/Editors/_EditPerson.py index 5e1222b15..682dd0e91 100644 --- a/src/Editors/_EditPerson.py +++ b/src/Editors/_EditPerson.py @@ -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"), diff --git a/src/ManagedWindow.py b/src/ManagedWindow.py index 9a0792945..7bb5e0dd9 100644 --- a/src/ManagedWindow.py +++ b/src/ManagedWindow.py @@ -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) #------------------------------------------------------------------------- #