# # Gramps - a GTK+/GNOME based genealogy program # # Copyright (C) 2000 Donald N. Allingham # # 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 # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # #------------------------------------------------------------------------- # # Standard python modules # #------------------------------------------------------------------------- import string #------------------------------------------------------------------------- # # GTK/Gnome modules # #------------------------------------------------------------------------- import gtk from gnome.ui import GnomeErrorDialog, GnomeWarningDialog, GnomeQuestionDialog import libglade import GdkImlib import GDK #------------------------------------------------------------------------- # # gramps modules # #------------------------------------------------------------------------- import const import utils import Config from RelLib import * import ImageSelect import sort from intl import gettext _ = gettext #------------------------------------------------------------------------- # # EditPerson class # #------------------------------------------------------------------------- class EditPerson: #--------------------------------------------------------------------- # # __init__ - Creates an edit window. Associates a person with the # window. # #--------------------------------------------------------------------- def __init__(self,person,db,callback): self.person = person self.db = db self.callback = callback self.path = db.getSavePath() self.not_loaded = 1 self.lists_changed = 0 self.update_birth = 0 self.update_death = 0 pid = "i%s" % person.getId() self.load_obj = None self.top = libglade.GladeXML(const.editPersonFile, "editPerson") self.gallery_widget = self.top.get_widget("photolist") self.gallery = ImageSelect.Gallery(person, self.path, pid, self.gallery_widget, self.db) self.top.signal_autoconnect({ "destroy_passed_object" : self.on_cancel_edit, "on_add_address_clicked" : self.on_add_addr_clicked, "on_add_aka_clicked" : self.on_add_aka_clicked, "on_add_attr_clicked" : self.on_add_attr_clicked, "on_add_url_clicked" : self.on_add_url_clicked, "on_addr_button_press" : self.addr_double_click, "on_web_button_press" : self.url_double_click, "on_addphoto_clicked" : self.gallery.on_add_photo_clicked, "on_address_list_select_row": self.on_addr_list_select_row, "on_aka_delete_clicked" : self.on_aka_delete_clicked, "on_aka_update_clicked" : self.on_aka_update_clicked, "on_apply_person_clicked" : self.on_apply_person_clicked, "on_attr_button_press" : self.attr_double_click, "on_attr_list_select_row" : self.on_attr_list_select_row, "on_combo_insert_text" : utils.combo_insert_text, "on_edit_birth_clicked" : self.on_edit_birth_clicked, "on_edit_death_clicked" : self.on_edit_death_clicked, "on_delete_address_clicked" : self.on_delete_addr_clicked, "on_delete_attr_clicked" : self.on_delete_attr_clicked, "on_delete_event" : self.on_delete_event, "on_delete_url_clicked" : self.on_delete_url_clicked, "on_deletephoto_clicked" : self.gallery.on_delete_photo_clicked, "on_edit_properties_clicked": self.gallery.popup_change_description, "on_editperson_switch_page" : self.on_switch_page, "on_event_add_clicked" : self.on_event_add_clicked, "on_event_button_press" : self.event_double_click, "on_event_delete_clicked" : self.on_event_delete_clicked, "on_event_select_row" : self.on_event_select_row, "on_event_update_clicked" : self.on_event_update_clicked, "on_name_button_press" : self.aka_double_click, "on_name_list_select_row" : self.on_name_list_select_row, "on_name_note_clicked" : self.on_name_note_clicked, "on_name_source_clicked" : self.on_primary_name_source_clicked, "on_photolist_button_press_event" : self.gallery.on_photolist_button_press_event, "on_photolist_select_icon" : self.gallery.on_photo_select_icon, "on_update_address_clicked" : self.on_update_addr_clicked, "on_update_attr_clicked" : self.on_update_attr_clicked, "on_update_url_clicked" : self.on_update_url_clicked, "on_web_go_clicked" : self.on_web_go_clicked, "on_web_list_select_row" : self.on_web_list_select_row, }) self.window = self.get_widget("editPerson") self.notes_field = self.get_widget("personNotes") self.event_name_field = self.get_widget("eventName") self.event_place_field = self.get_widget("eventPlace") self.event_cause_field = self.get_widget("eventCause") self.event_date_field = self.get_widget("eventDate") self.event_descr_field = self.get_widget("eventDescription") self.event_details_field = self.get_widget("event_details") self.attr_details_field = self.get_widget("attr_details") self.name_details_field = self.get_widget("name_details") self.addr_details_field = self.get_widget("addr_details") self.attr_list = self.get_widget("attr_list") self.attr_type = self.get_widget("attr_type") self.attr_value = self.get_widget("attr_value") self.web_list = self.get_widget("web_list") self.web_url = self.get_widget("web_url") self.web_go = self.get_widget("web_go") self.web_description = self.get_widget("url_des") self.addr_label = self.get_widget("address_label") self.addr_list = self.get_widget("address_list") self.addr_start = self.get_widget("address_start") self.addr_street = self.get_widget("street") self.addr_city = self.get_widget("city") self.addr_state = self.get_widget("state") self.addr_country = self.get_widget("country") self.addr_postal = self.get_widget("postal") self.event_list = self.get_widget("eventList") self.edit_person = self.get_widget("editPerson") self.name_list = self.get_widget("nameList") self.name_frame = self.get_widget("name_frame") self.alt_given_field = self.get_widget("alt_given") self.alt_last_field = self.get_widget("alt_last") self.alt_suffix_field = self.get_widget("alt_suffix") self.surname_field = self.get_widget("surname") self.suffix = self.get_widget("suffix") self.given = self.get_widget("givenName") self.nick = self.get_widget("nickname") self.title = self.get_widget("title") self.bdate = self.get_widget("birthDate") self.bplace = self.get_widget("birthPlace") self.bpcombo = self.get_widget("bpcombo") self.ddate = self.get_widget("deathDate") self.dplace = self.get_widget("deathPlace") self.dpcombo = self.get_widget("dpcombo") self.is_male = self.get_widget("genderMale") self.is_female = self.get_widget("genderFemale") self.is_unknown = self.get_widget("genderUnknown") self.addr_note = self.get_widget("addr_note") self.addr_source = self.get_widget("addr_source") self.attr_note = self.get_widget("attr_note") self.attr_source = self.get_widget("attr_source") self.name_note = self.get_widget("name_note") self.name_source = self.get_widget("name_source") self.gid = self.get_widget("gid") self.elist = person.getEventList()[:] self.nlist = person.getAlternateNames()[:] self.alist = person.getAttributeList()[:] self.ulist = person.getUrlList()[:] self.plist = person.getAddressList()[:] self.death = Event(person.getDeath()) self.birth = Event(person.getBirth()) self.pname = Name(person.getPrimaryName()) # Typing CR selects OK button self.window.editable_enters(self.notes_field); self.window.editable_enters(self.given); self.window.editable_enters(self.surname_field); self.window.editable_enters(self.suffix); self.window.editable_enters(self.title); self.window.editable_enters(self.nick); self.window.editable_enters(self.bdate); self.window.editable_enters(self.bplace); self.window.editable_enters(self.ddate); self.window.editable_enters(self.dplace); utils.attach_surnames(self.get_widget("lastNameList")) self.gid.set_text(person.getId()) self.gid.set_editable(Config.id_edit) self.event_list.set_column_visibility(3,Config.show_detail) self.name_list.set_column_visibility(1,Config.show_detail) self.attr_list.set_column_visibility(2,Config.show_detail) self.addr_list.set_column_visibility(2,Config.show_detail) if Config.display_attr: self.get_widget("user_label").set_text(Config.attr_name) val = "" for attr in self.person.getAttributeList(): if attr.getType() == const.save_pattr(Config.attr_name): val = attr.getValue() break self.get_widget("user_data").set_text(val) self.get_widget("user_colon").show() else: self.get_widget("user_label").hide() self.get_widget("user_colon").hide() self.get_widget("user_data").hide() # initial values self.get_widget("activepersonTitle").set_text(Config.nameof(person)) self.suffix.set_text(self.pname.getSuffix()) self.surname_field.set_text(self.pname.getSurname()) self.given.set_text(self.pname.getFirstName()) if person.getGender() == Person.male: self.is_male.set_active(1) elif person.getGender() == Person.female: self.is_female.set_active(1) else: self.is_unknown.set_active(1) self.nick.set_text(person.getNickName()) self.title.set_text(self.pname.getTitle()) self.update_birth_death() self.load_person_image() # set notes data self.notes_field.set_point(0) self.notes_field.insert_defaults(person.getNote()) self.notes_field.set_word_wrap(1) # draw lists self.redraw_event_list() self.redraw_attr_list() self.redraw_addr_list() self.redraw_name_list() self.redraw_url_list() self.window.show() def get_widget(self,str): """returns the widget related to the passed string""" return self.top.get_widget(str) def redraw_name_list(self): """redraws the name list""" utils.redraw_list(self.nlist,self.name_list,disp_name) def redraw_url_list(self): """redraws the url list, disabling the go button if no url is selected""" length = utils.redraw_list(self.ulist,self.web_list,disp_url) if length > 0: self.web_go.set_sensitive(1) else: self.web_go.set_sensitive(0) self.web_url.set_text("") self.web_description.set_text("") def redraw_attr_list(self): """Redraws the attribute list""" utils.redraw_list(self.alist,self.attr_list,disp_attr) def redraw_addr_list(self): """redraws the address list for the person""" utils.redraw_list(self.plist,self.addr_list,disp_addr) #--------------------------------------------------------------------- # # redraw_event_list - Update both the birth and death place combo # boxes for any changes that occurred in the 'Event Edit' window. # Make sure not to allow the editing of a birth event to change # any values in the death event, and vice versa. Since updating a # combo list resets its present value, this code will have to save # and restore the value for the event *not* being edited. # #--------------------------------------------------------------------- def redraw_event_list(self): """redraws the event list for the person""" utils.redraw_list(self.elist,self.event_list,disp_event) # Remember old combo list input prev_btext = self.bpcombo.entry.get_text() prev_dtext = self.dpcombo.entry.get_text() # Update combo lists to add in any new places plist = self.db.getPlaceMap().values() if len(plist) > 0: utils.attach_places(plist,self.dpcombo,self.death.getPlace()) utils.attach_places(plist,self.bpcombo,self.birth.getPlace()) # Update birth with new values, make sure death values don't change if (self.update_birth): self.update_birth = 0 self.bdate.set_text(self.birth.getDate()) self.bplace.set_text(self.birth.getPlaceName()) self.dplace.set_text(prev_dtext) # Update death with new values, make sure birth values don't change if (self.update_death): self.update_death = 0 self.ddate.set_text(self.death.getDate()) self.dplace.set_text(self.death.getPlaceName()) self.bplace.set_text(prev_btext) def on_add_addr_clicked(self,obj): """Invokes the address editor to add a new address""" import AddrEdit AddrEdit.AddressEditor(self,None) def on_add_aka_clicked(self,obj): """Invokes the name editor to add a new name""" import NameEdit NameEdit.NameEditor(self,None) def on_add_url_clicked(self,obj): """Invokes the url editor to add a new name""" import UrlEdit pname = self.person.getPrimaryName().getName() UrlEdit.UrlEditor(self,pname,None) def on_add_attr_clicked(self,obj): """Brings up the AttributeEditor for a new attribute""" import AttrEdit pname = self.person.getPrimaryName().getName() AttrEdit.AttributeEditor(self,None,pname,const.personalAttributes) def on_event_add_clicked(self,obj): """Brings up the EventEditor for a new event""" import EventEdit pname = self.person.getPrimaryName().getName() EventEdit.EventEditor(self,pname,const.personalEvents,const.save_fevent,None,None,0) def on_edit_birth_clicked(self,obj): """Brings up the EventEditor for the birth record, event name cannot be changed""" import EventEdit self.update_birth = 1 pname = self.person.getPrimaryName().getName() event = self.birth event.setDate(self.bdate.get_text()) p = utils.get_place_from_list(self.bpcombo) if p != None: event.setPlace(p) def_placename = None else: def_placename = self.bpcombo.entry.get_text() EventEdit.EventEditor(self,pname,const.personalEvents,\ const.save_fevent,event,def_placename,1) def on_edit_death_clicked(self,obj): """Brings up the EventEditor for the death record, event name cannot be changed""" import EventEdit self.update_death = 1 pname = self.person.getPrimaryName().getName() event = self.death event.setDate(self.ddate.get_text()) p = utils.get_place_from_list(self.dpcombo) if p != None: event.setPlace(p) def_placename = None else: def_placename = self.dpcombo.entry.get_text() EventEdit.EventEditor(self,pname,const.personalEvents,\ const.save_fevent,event,def_placename,1) def on_aka_delete_clicked(self,obj): """Deletes the selected name from the name list""" if utils.delete_selected(obj,self.nlist): self.lists_changed = 1 self.redraw_name_list() def on_delete_url_clicked(self,obj): """Deletes the selected URL from the URL list""" if utils.delete_selected(obj,self.ulist): self.lists_changed = 1 self.redraw_url_list() def on_delete_attr_clicked(self,obj): """Deletes the selected attribute from the attribute list""" if utils.delete_selected(obj,self.alist): self.lists_changed = 1 self.redraw_attr_list() def on_delete_addr_clicked(self,obj): """Deletes the selected address from the address list""" if utils.delete_selected(obj,self.plist): self.lists_changed = 1 self.redraw_addr_list() def on_web_go_clicked(self,obj): """Attempts to display the selected URL in a web browser""" import gnome.url text = obj.get() if text != "": gnome.url.show(text) def on_cancel_edit(self,obj): """If the data has changed, give the user a chance to cancel the close window""" if self.did_data_change(): q = _("Are you sure you want to abandon your changes?") GnomeQuestionDialog(q,self.cancel_callback) else: utils.destroy_passed_object(obj) def on_delete_event(self,obj,b): """If the data has changed, give the user a chance to cancel the close window""" if self.did_data_change(): q = _("Are you sure you want to abandon your changes?") GnomeQuestionDialog(q,self.cancel_callback) return 1 else: utils.destroy_passed_object(obj) return 0 def cancel_callback(self,a): """If the user answered yes to abandoning changes, close the window""" if a==0: utils.destroy_passed_object(self.window) def did_data_change(self): """Check to see if any of the data has changed from the original record""" surname = self.surname_field.get_text() suffix = self.suffix.get_text() given = self.given.get_text() nick = self.nick.get_text() title = self.title.get_text() male = self.is_male.get_active() female = self.is_female.get_active() unknown = self.is_unknown.get_active() text = self.notes_field.get_chars(0,-1) idval = self.gid.get_text() changed = 0 name = self.person.getPrimaryName() if self.person.getId() != idval: changed = 1 if suffix != name.getSuffix() or surname != name.getSurname(): changed = 1 if given != name.getFirstName() or nick != self.person.getNickName(): changed = 1 if title != name.getTitle(): changed = 1 if self.pname.getNote() != name.getNote(): changed = 1 bplace = string.strip(self.bplace.get_text()) dplace = string.strip(self.dplace.get_text()) p1 = utils.get_place_from_list(self.bpcombo) if p1 == None and bplace != "": changed = 1 self.birth.setPlace(p1) p1 = utils.get_place_from_list(self.dpcombo) if p1 == None and dplace != "": changed = 1 self.death.setPlace(p1) if not self.birth.are_equal(self.person.getBirth()): changed = 1 if not self.death.are_equal(self.person.getDeath()): changed = 1 if male and self.person.getGender() != Person.male: changed = 1 elif female and self.person.getGender() != Person.female: changed = 1 elif unknown and self.person.getGender() != Person.unknown: changed = 1 if text != self.person.getNote() or self.lists_changed: changed = 1 return changed def on_event_delete_clicked(self,obj): """Delete the selected event""" if utils.delete_selected(obj,self.elist): self.lists_changed = 1 self.redraw_event_list() def update_birth_death(self): self.bdate.set_text(self.birth.getDate()) self.bplace.set_text(self.birth.getPlaceName()) self.ddate.set_text(self.death.getDate()) self.dplace.set_text(self.death.getPlaceName()) self.dplace.set_text(self.death.getPlaceName()) self.bdate.set_position(0) self.ddate.set_position(0) self.bplace.set_position(0) self.dplace.set_position(0) def attr_double_click(self,obj,event): if event.button == 1 and event.type == GDK._2BUTTON_PRESS: self.on_update_attr_clicked(obj) def on_update_attr_clicked(self,obj): import AttrEdit if len(obj.selection) <= 0: return attr = obj.get_row_data(obj.selection[0]) pname = self.person.getPrimaryName().getName() AttrEdit.AttributeEditor(self,attr,pname,const.personalAttributes) def addr_double_click(self,obj,event): if event.button == 1 and event.type == GDK._2BUTTON_PRESS: self.on_update_addr_clicked(obj) def on_update_addr_clicked(self,obj): import AddrEdit if len(obj.selection) > 0: AddrEdit.AddressEditor(self,obj.get_row_data(obj.selection[0])) def url_double_click(self,obj,event): if event.button == 1 and event.type == GDK._2BUTTON_PRESS: self.on_update_url_clicked(obj) def on_update_url_clicked(self,obj): import UrlEdit if len(obj.selection) <= 0: return pname = self.person.getPrimaryName().getName() url = obj.get_row_data(obj.selection[0]) UrlEdit.UrlEditor(self,pname,url) def event_double_click(self,obj,event): if event.button == 1 and event.type == GDK._2BUTTON_PRESS: self.on_event_update_clicked(obj) def on_event_update_clicked(self,obj): import EventEdit if len(obj.selection) <= 0: return pname = self.person.getPrimaryName().getName() event = obj.get_row_data(obj.selection[0]) EventEdit.EventEditor(self,pname,const.personalEvents,const.save_fevent,event,None,0) def on_event_select_row(self,obj,row,b,c): event = obj.get_row_data(row) self.event_date_field.set_text(event.getDate()) self.event_place_field.set_text(event.getPlaceName()) self.event_name_field.set_label(const.display_pevent(event.getName())) self.event_cause_field.set_text(event.getCause()) self.event_descr_field.set_text(event.getDescription()) self.event_details_field.set_text(utils.get_detail_text(event)) def on_addr_list_select_row(self,obj,row,b,c): a = obj.get_row_data(row) label = "%s %s %s" % (a.getCity(),a.getState(),a.getCountry()) self.addr_label.set_label(label) self.addr_start.set_text(a.getDate()) self.addr_street.set_text(a.getStreet()) self.addr_city.set_text(a.getCity()) self.addr_state.set_text(a.getState()) self.addr_country.set_text(a.getCountry()) self.addr_postal.set_text(a.getPostal()) self.addr_details_field.set_text(utils.get_detail_text(a)) def on_name_list_select_row(self,obj,row,b,c): name = obj.get_row_data(row) self.name_frame.set_label(name.getName()) self.alt_given_field.set_text(name.getFirstName()) self.alt_last_field.set_text(name.getSurname()) self.alt_suffix_field.set_text(name.getSuffix()) self.name_details_field.set_text(utils.get_detail_text(name)) def on_web_list_select_row(self,obj,row,b,c): url = obj.get_row_data(row) if url == None: self.web_url.set_text("") self.web_go.set_sensitive(0) self.web_description.set_text("") else: path = url.get_path() self.web_url.set_text(path) self.web_go.set_sensitive(1) self.web_description.set_text(url.get_description()) def on_attr_list_select_row(self,obj,row,b,c): attr = obj.get_row_data(row) self.attr_type.set_label(const.display_pattr(attr.getType())) self.attr_value.set_text(attr.getValue()) self.attr_details_field.set_text(utils.get_detail_text(attr)) def aka_double_click(self,obj,event): if event.button == 1 and event.type == GDK._2BUTTON_PRESS: self.on_aka_update_clicked(obj) def on_aka_update_clicked(self,obj): import NameEdit if len(obj.selection) > 0: NameEdit.NameEditor(self,obj.get_row_data(obj.selection[0])) def load_photo(self,photo): """loads, scales, and displays the person's main photo""" self.load_obj = photo if photo == None: self.get_widget("personPix").hide() else: try: i = GdkImlib.Image(photo) scale = float(const.picWidth)/float(max(i.rgb_height,i.rgb_width)) x = int(scale*(i.rgb_width)) y = int(scale*(i.rgb_height)) i = i.clone_scaled_image(x,y) self.get_widget("personPix").load_imlib(i) self.get_widget("personPix").show() except: self.get_widget("personPix").hide() def update_lists(self): """Updates the person's lists if anything has changed""" if self.lists_changed: self.person.setEventList(self.elist) self.person.setAlternateNames(self.nlist) self.person.setUrlList(self.ulist) self.person.setAttributeList(self.alist) self.person.setAddressList(self.plist) utils.modified() def on_apply_person_clicked(self,obj): surname = self.surname_field.get_text() suffix = self.suffix.get_text() given = self.given.get_text() nick = self.nick.get_text() title = self.title.get_text() idval = self.gid.get_text() name = self.pname if idval != self.person.getId(): m = self.db.getPersonMap() if not m.has_key(idval): if m.has_key(self.person.getId()): del m[self.person.getId()] m[idval] = self.person self.person.setId(idval) utils.modified() else: n = Config.nameof(m[idval]) msg1 = _("GRAMPS ID value was not changed.") msg2 = _("%s is already used by %s") % (idval,n) GnomeWarningDialog("%s\n%s" % (msg1,msg2)) if suffix != name.getSuffix(): name.setSuffix(suffix) if surname != name.getSurname(): name.setSurname(surname) if surname not in const.surnames: const.surnames.append(surname) const.surnames.sort() if given != name.getFirstName(): name.setFirstName(given) if title != name.getTitle(): name.setTitle(title) if not name.are_equal(self.person.getPrimaryName()): self.person.setPrimaryName(name) utils.modified() if nick != self.person.getNickName(): self.person.setNickName(nick) utils.modified() self.birth.setDate(self.bdate.get_text()) bplace_obj = utils.get_place_from_list(self.bpcombo) bplace = string.strip(self.bplace.get_text()) if bplace_obj == None and bplace != "": bplace_obj = Place() bplace_obj.set_title(bplace) self.db.addPlace(bplace_obj) utils.modified() self.birth.setPlace(bplace_obj) if not self.person.getBirth().are_equal(self.birth): self.person.setBirth(self.birth) # Update each of the families child lists to reflect any # change in ordering due to the new birth date family = self.person.getMainFamily() if (family): new_order = reorder_child_list(self.person,family.getChildList()) family.setChildList(new_order) for (family, rel1, rel2) in self.person.getAltFamilyList(): new_order = reorder_child_list(self.person,family.getChildList()) family.setChildList(new_order) self.death.setDate(self.ddate.get_text()) dplace_obj = utils.get_place_from_list(self.dpcombo) dplace = string.strip(self.dplace.get_text()) if dplace_obj == None and dplace != "": dplace_obj = Place() dplace_obj.set_title(dplace) self.db.addPlace(dplace_obj) utils.modified() self.death.setPlace(dplace_obj) if not self.person.getDeath().are_equal(self.death): self.person.setDeath(self.death) male = self.is_male.get_active() female = self.is_female.get_active() unknown = self.is_unknown.get_active() error = 0 if male and self.person.getGender() != Person.male: self.person.setGender(Person.male) for temp_family in self.person.getFamilyList(): if self.person == temp_family.getMother(): if temp_family.getFather() != None: error = 1 else: temp_family.setMother(None) temp_family.setFather(self.person) utils.modified() elif female and self.person.getGender() != Person.female: self.person.setGender(Person.female) for temp_family in self.person.getFamilyList(): if self.person == temp_family.getFather(): if temp_family.getMother() != None: error = 1 else: temp_family.setFather(None) temp_family.setMother(self.person) utils.modified() elif unknown and self.person.getGender() != Person.unknown: self.person.setGender(Person.unknown) for temp_family in self.person.getFamilyList(): if self.person == temp_family.getFather(): if temp_family.getMother() != None: error = 1 else: temp_family.setFather(None) temp_family.setMother(self.person) if self.person == temp_family.getMother(): if temp_family.getFather() != None: error = 1 else: temp_family.setMother(None) temp_family.setFather(self.person) utils.modified() if error == 1: msg = _("Changing the gender caused problems with marriage information.") msg2 = _("Please check the person's marriages.") GnomeErrorDialog("%s\n%s" % (msg,msg2)) text = self.notes_field.get_chars(0,-1) if text != self.person.getNote(): self.person.setNote(text) utils.modified() self.update_lists() self.callback(self) utils.destroy_passed_object(obj) def on_primary_name_source_clicked(self,obj): import Sources Sources.SourceSelector(self.pname.getSourceRefList(),self,src_changed) def on_name_note_clicked(self,obj): import NoteEdit NoteEdit.NoteEditor(self.pname) def load_person_image(self): photo_list = self.person.getPhotoList() if len(photo_list) != 0: ph = photo_list[0] object = ph.getReference() if self.load_obj != object.getPath(): if object.getMimeType()[0:5] == "image": self.load_photo(object.getPath()) else: self.load_photo(None) else: self.load_photo(None) def on_switch_page(self,obj,a,page): if page == 0: self.load_person_image() elif page == 6 and self.not_loaded: self.not_loaded = 0 self.gallery.load_images() #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def disp_name(name): return [name.getName(),utils.get_detail_flags(name)] #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def disp_url(url): return [url.get_path(),url.get_description()] #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def disp_attr(attr): detail = utils.get_detail_flags(attr) return [const.display_pattr(attr.getType()),attr.getValue(),detail] #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def disp_addr(addr): location = "%s %s %s" % (addr.getCity(),addr.getState(),addr.getCountry()) return [addr.getDate(),location,utils.get_detail_flags(addr)] #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- def disp_event(event): attr = utils.get_detail_flags(event) return [const.display_pevent(event.getName()), event.getQuoteDate(),event.getPlaceName(),attr] def src_changed(parent): parent.lists_changed = 1 #------------------------------------------------------------------------- # # birth_dates_in_order # # Check any *valid* birthdates in the list to insure that they are in # numerically increasing order. # #------------------------------------------------------------------------- def birth_dates_in_order(list): inorder = 1 prev_date = "00000000" for i in range(len(list)): child = list[i] bday = child.getBirth().getDateObj() child_date = sort.build_sort_birth(bday) if (child_date == "99999999"): continue if (prev_date <= child_date): # <= allows for twins prev_date = child_date else: inorder = 0 return inorder #------------------------------------------------------------------------- # # reorder_child_list # # Reorder the child list to put the specified person in his/her # correct birth orde. Only check *valid* birthdates. Move the person # as short a distance as possible. # #------------------------------------------------------------------------- def reorder_child_list(person, list): if (birth_dates_in_order(list)): return(list) # Build the person's date string once person_bday = sort.build_sort_birth(person.getBirth().getDateObj()) # First, see if the person needs to be moved forward in the list index = list.index(person) target = index for i in range(index-1, -1, -1): other_bday = sort.build_sort_birth(list[i].getBirth().getDateObj()) if (other_bday == "99999999"): continue; if (person_bday < other_bday): target = i # Now try moving to a later position in the list if (target == index): for i in range(index, len(list)): other_bday = sort.build_sort_birth(list[i].getBirth().getDateObj()) if (other_bday == "99999999"): continue; if (person_bday > other_bday): target = i # Actually need to move? Do it now. if (target != index): list.remove(person) list.insert(target,person) return list