From 4dfc846191e84bf94ec779267469727719efaf5b Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Tue, 19 Apr 2005 04:20:17 +0000 Subject: [PATCH] * src/edit_person.glade: re-add edit_person.glade * src/EditPerson.py: start of new EditPerson dialog * src/ListModel.py: enhancements for the start of inline editing * src/Makefile.am: add edit_person.glade * src/ReadXML.py: commit transactions properly * src/const.py.in: add edit_person.glade back in svn: r4375 --- gramps2/ChangeLog | 8 + gramps2/src/EditPerson.py | 464 +---- gramps2/src/GrampsDbBase.py | 3 +- gramps2/src/ListModel.py | 55 +- gramps2/src/Makefile.am | 1 + gramps2/src/ReadXML.py | 37 +- gramps2/src/const.py.in | 2 +- gramps2/src/edit_person.glade | 3400 +++++++++++++++++++++++++++++++++ 8 files changed, 3576 insertions(+), 394 deletions(-) create mode 100644 gramps2/src/edit_person.glade diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 5c766ab32..f11d33ca2 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,11 @@ +2005-04-18 Don Allingham + * src/edit_person.glade: re-add edit_person.glade + * src/EditPerson.py: start of new EditPerson dialog + * src/ListModel.py: enhancements for the start of inline editing + * src/Makefile.am: add edit_person.glade + * src/ReadXML.py: commit transactions properly + * src/const.py.in: add edit_person.glade back in + 2005-04-17 Don Allingham * src/GrampsBSDDB.py: actually perform the commits during the transaction_commit task, instead of the commit_* tasks diff --git a/gramps2/src/EditPerson.py b/gramps2/src/EditPerson.py index c78be615e..7b7f184ad 100644 --- a/gramps2/src/EditPerson.py +++ b/gramps2/src/EditPerson.py @@ -77,8 +77,7 @@ _PICTURE_WIDTH = 200.0 _temple_names = const.lds_temple_codes.keys() _temple_names.sort() _temple_names = [""] + _temple_names - - +_select_gender = ((True,False,False),(False,True,False),(False,False,True)) _use_patronymic = [ "ru","RU","ru_RU","koi8r","ru_koi8r","russian","Russian", ] @@ -134,12 +133,14 @@ class EditPerson: self.window.set_title("%s - GRAMPS" % _('Edit Person')) self.icon_list = self.top.get_widget("iconlist") - self.gallery = ImageSelect.Gallery(person, self.db.commit_person, - self.path, self.icon_list, - self.db, self, self.window) + #self.gallery = ImageSelect.Gallery(person, self.db.commit_person, + # self.path, self.icon_list, + # self.db, self, self.window) self.complete = self.get_widget('complete') self.complete.set_sensitive(mod) + self.gender = self.get_widget('gender') + self.gender.set_sensitive(mod) self.private = self.get_widget('private') self.private.set_sensitive(mod) self.name_delete_btn = self.top.get_widget('aka_delete') @@ -147,7 +148,7 @@ class EditPerson: self.web_delete_btn = self.top.get_widget('delete_url') self.web_edit_btn = self.top.get_widget('edit_url') self.event_delete_btn = self.top.get_widget('event_del') - self.event_edit_btn = self.top.get_widget('event_edit_btn') + self.event_edit_btn = self.top.get_widget('event_edit') self.attr_delete_btn = self.top.get_widget('attr_del') self.attr_edit_btn = self.top.get_widget('attr_edit_btn') self.addr_delete_btn = self.top.get_widget('addr_del') @@ -159,13 +160,6 @@ class EditPerson: self.flowed.set_sensitive(mod) self.preform = self.get_widget("preform") self.preform.set_sensitive(mod) - 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_src_field = self.get_widget("event_srcinfo") - self.event_conf_field = self.get_widget("event_conf") self.attr_conf_field = self.get_widget("attr_conf") self.addr_conf_field = self.get_widget("addr_conf") self.name_conf_field = self.get_widget("name_conf") @@ -204,26 +198,10 @@ class EditPerson: self.prefix.set_editable(mod) self.given = self.get_widget("givenName") self.given.set_editable(mod) - self.nick = self.get_widget("nickname") - self.nick.set_editable(mod) self.title = self.get_widget("title") self.title.set_editable(mod) - self.bdate = self.get_widget("birthDate") - self.bdate.set_editable(mod) - self.bplace = self.get_widget("birth_place") - self.bplace.set_editable(mod) self.surname = self.get_widget("surname") self.surname.set_editable(mod) - self.ddate = self.get_widget("deathDate") - self.ddate.set_editable(mod) - self.dplace = self.get_widget("death_place") - self.dplace.set_editable(mod) - self.is_male = self.get_widget("genderMale") - self.is_male.set_sensitive(mod) - self.is_female = self.get_widget("genderFemale") - self.is_female.set_sensitive(mod) - self.is_unknown = self.get_widget("genderUnknown") - self.is_unknown.set_sensitive(mod) self.addr_note = self.get_widget("addr_note") self.addr_source = self.get_widget("addr_source") self.attr_note = self.get_widget("attr_note") @@ -235,7 +213,6 @@ class EditPerson: self.slist = self.get_widget("slist") self.general_label = self.get_widget("general_label") self.names_label = self.get_widget("names_label") - self.events_label = self.get_widget("events_label") self.attr_label = self.get_widget("attr_label") self.addr_label = self.get_widget("addr_label") self.notes_label = self.get_widget("notes_label") @@ -246,9 +223,6 @@ class EditPerson: self.person_photo = self.get_widget("personPix") self.eventbox = self.get_widget("eventbox1") - self.get_widget("birth_stat").set_sensitive(mod) - self.get_widget("death_stat").set_sensitive(mod) - self.prefix_label = self.get_widget('prefix_label') if self.use_patronymic: @@ -273,7 +247,13 @@ class EditPerson: self.birth = RelLib.Event(self.orig_birth) self.pname = RelLib.Name(person.get_primary_name()) - self.elist = person.get_event_list()[:] + self.gender.set_active(person.get_gender()) + + self.elist = [] + for val in [birth_handle, death_handle] + person.get_event_list(): + if val: + self.elist.append(val) + self.nlist = person.get_alternate_names()[:] self.alist = person.get_attribute_list()[:] self.ulist = person.get_url_list()[:] @@ -284,21 +264,19 @@ class EditPerson: else: self.srcreflist = [] - Utils.bold_label(self.general_label) - if self.srcreflist: - Utils.bold_label(self.sources_label) - if self.elist: - Utils.bold_label(self.events_label) - if self.nlist: - Utils.bold_label(self.names_label) - if self.alist: - Utils.bold_label(self.attr_label) - if self.ulist: - Utils.bold_label(self.inet_label) - if self.plist: - Utils.bold_label(self.addr_label) - if self.person.get_media_list(): - Utils.bold_label(self.gallery_label) + #Utils.bold_label(self.general_label) + #if self.srcreflist: + # Utils.bold_label(self.sources_label) + #if self.nlist: + # Utils.bold_label(self.names_label) + #if self.alist: + # Utils.bold_label(self.attr_label) + #if self.ulist: + # Utils.bold_label(self.inet_label) + #if self.plist: + # Utils.bold_label(self.addr_label) + #if self.person.get_media_list(): + # Utils.bold_label(self.gallery_label) # event display @@ -351,8 +329,6 @@ class EditPerson: self.place_list = self.pdmap.keys() self.place_list.sort() - build_dropdown(self.bplace,self.place_list) - build_dropdown(self.dplace,self.place_list) build_dropdown(self.surname,self.db.get_surname_list()) gid = person.get_gramps_id() @@ -370,24 +346,16 @@ class EditPerson: or (not self.lds_sealing.is_empty()): self.get_widget("lds_tab").show() self.get_widget("lds_page").show() - if (not self.lds_baptism.is_empty()) \ - or (not self.lds_endowment.is_empty()) \ - or (not self.lds_sealing.is_empty()): - Utils.bold_label(self.lds_tab) + #if (not self.lds_baptism.is_empty()) \ + # or (not self.lds_endowment.is_empty()) \ + # or (not self.lds_sealing.is_empty()): + # Utils.bold_label(self.lds_tab) types = const.NameTypesMap.get_values() types.sort() AutoComp.fill_combo(self.ntype_field,types) self.write_primary_name() - if person.get_gender() == RelLib.Person.MALE: - self.is_male.set_active(1) - elif person.get_gender() == RelLib.Person.FEMALE: - self.is_female.set_active(1) - else: - self.is_unknown.set_active(1) - - self.nick.set_text(person.get_nick_name()) self.load_person_image() # set notes data @@ -398,7 +366,7 @@ class EditPerson: self.preform.set_active(1) else: self.flowed.set_active(1) - Utils.bold_label(self.notes_label) + #Utils.bold_label(self.notes_label) self.name_list.drag_dest_set(gtk.DEST_DEFAULT_ALL, [DdTargets.NAME.target()], @@ -452,19 +420,6 @@ class EditPerson: self.addr_list.connect('drag_data_received',self.ad_drag_data_received) self.addr_list.connect('drag_begin', self.ad_drag_begin) - self.birth_date_object = self.birth.get_date_object() - self.death_date_object = self.death.get_date_object() - - self.bdate_check = DateEdit.DateEdit( - self.birth_date_object, self.bdate, - self.get_widget("birth_stat"), self.window) - - self.ddate_check = DateEdit.DateEdit( - self.death_date_object, self.ddate, - self.get_widget("death_stat"), self.window) - - self.update_birth_death() - self.top.signal_autoconnect({ "destroy_passed_object" : self.on_cancel_edit, "on_up_clicked" : self.on_up_clicked, @@ -473,8 +428,8 @@ class EditPerson: "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_addphoto_clicked" : self.gallery.on_add_media_clicked, - "on_selectphoto_clicked" : self.gallery.on_select_media_clicked, +# "on_addphoto_clicked" : self.gallery.on_add_media_clicked, +# "on_selectphoto_clicked" : self.gallery.on_select_media_clicked, "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, @@ -484,9 +439,9 @@ class EditPerson: "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_media_clicked, - "on_edit_properties_clicked": self.gallery.popup_change_description, - "on_editphoto_clicked" : self.gallery.on_edit_media_clicked, +# "on_deletephoto_clicked" : self.gallery.on_delete_media_clicked, +# "on_edit_properties_clicked": self.gallery.popup_change_description, +# "on_editphoto_clicked" : self.gallery.on_edit_media_clicked, "on_editperson_switch_page" : self.on_switch_page, "on_event_add_clicked" : self.on_event_add_clicked, "on_event_delete_clicked" : self.on_event_delete_clicked, @@ -523,11 +478,11 @@ class EditPerson: self.redraw_name_list() self.redraw_url_list() self.get_widget("notebook").set_current_page(0) - self.given.grab_focus() + self.surname.grab_focus() self.add_itself_to_winsmenu() - for i in ["ok", "add_aka", "aka_delete", "event_del", - "event_add", "attr_add", "attr_del", "addr_add", + for i in ["ok", "add_aka", "aka_delete", "event_add", "event_del", + "attr_add", "attr_del", "addr_add", "addr_del", "media_add", "media_sel", "media_del", "add_url", "delete_url", "add_src", "del_src" ]: self.get_widget(i).set_sensitive(not self.db.readonly) @@ -609,7 +564,7 @@ class EditPerson: if not self.db.readonly: self.db.metadata['event_order'] = event_list - self.gallery.close() + #self.gallery.close() self.close_child_windows() self.remove_itself_from_winsmenu() self.window.destroy() @@ -645,7 +600,10 @@ class EditPerson: def build_columns(self,tree,list): cnum = 0 for name in list: - renderer = gtk.CellRendererText() + if cnum == 0: + renderer = gtk.CellRendererCombo() + else: + renderer = gtk.CellRendererText() column = gtk.TreeViewColumn(name[0],renderer,text=cnum) column.set_min_width(name[1]) cnum = cnum + 1 @@ -778,14 +736,6 @@ class EditPerson: if not self.should_guess_gender: return - gender = self.db.genderStats.guess_gender(unicode(entry.get_text ())) - if gender == RelLib.Person.UNKNOWN: - self.is_unknown.set_active(True) - elif gender == RelLib.Person.MALE: - self.is_male.set_active(True) - else: - self.is_female.set_active(True) - def build_menu(self,list,task,opt_menu,type): cell = gtk.CellRendererText() opt_menu.pack_start(cell,True) @@ -1022,9 +972,9 @@ class EditPerson: self.nmap[str(name)] = node if self.nlist: self.ntree.select_row(0) - Utils.bold_label(self.names_label) - else: - Utils.unbold_label(self.names_label) +# Utils.bold_label(self.names_label) +# else: +# Utils.unbold_label(self.names_label) def redraw_url_list(self): """redraws the url list, disabling the go button if no url @@ -1038,12 +988,12 @@ class EditPerson: if len(self.ulist) > 0: self.web_go.set_sensitive(False) self.wtree.select_row(0) - Utils.bold_label(self.inet_label) +# Utils.bold_label(self.inet_label) else: self.web_go.set_sensitive(False) - self.web_url.set_text("") - self.web_description.set_text("") - Utils.unbold_label(self.inet_label) +# self.web_url.set_text("") +# self.web_description.set_text("") +# Utils.unbold_label(self.inet_label) def redraw_addr_list(self): """Redraws the address list""" @@ -1056,9 +1006,9 @@ class EditPerson: self.pmap[str(addr)] = node if self.plist: self.ptree.select_row(0) - Utils.bold_label(self.addr_label) - else: - Utils.unbold_label(self.addr_label) +# Utils.bold_label(self.addr_label) +# else: +# Utils.unbold_label(self.addr_label) def redraw_attr_list(self): """redraws the attribute list for the person""" @@ -1069,9 +1019,9 @@ class EditPerson: self.amap[str(attr)] = node if self.alist: self.atree.select_row(0) - Utils.bold_label(self.attr_label) - else: - Utils.unbold_label(self.attr_label) +# Utils.bold_label(self.attr_label) +# else: +# Utils.unbold_label(self.attr_label) def name_edit_callback(self,name): self.redraw_name_list() @@ -1114,31 +1064,7 @@ class EditPerson: event.get_description(), event.get_date(),pname],event) self.emap[str(event)] = node - if self.elist: - self.etree.select_row(0) - Utils.bold_label(self.events_label) - else: - Utils.unbold_label(self.events_label) - - # Remember old combo list input - - bplace_text = unicode(self.bplace.get_text()) - dplace_text = unicode(self.dplace.get_text()) - - prev_btext = self.strip_id(bplace_text) - prev_dtext = self.strip_id(dplace_text) - - # Update birth with new values, make sure death values don't change - if self.update_birth: - self.update_birth = False - self.update_birth_info() - 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 = False - self.update_death_info() - self.bplace.set_text(prev_btext) + node = self.etree.add(["","","",""],None) def strip_id(self,text): index = text.rfind('[') @@ -1197,42 +1123,12 @@ class EditPerson: 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 = True - pname = self.name_display.display(self.person) - event = self.birth - event.set_date_object(Date.Date(self.birth_date_object)) - def_placename = unicode(self.bplace.get_text()) - - p = self.get_place(self.bplace) - if p: - event.set_place_handle(p) - EventEdit.EventEditor( - self,pname, const.personalEvents, - const.personal_events,event,def_placename,1, - self.event_edit_callback, - noedit=self.db.readonly) + pass 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 = True - pname = self.name_display.display(self.person) - event = self.death - event.set_date_object(Date.Date(self.death_date_object)) - def_placename = unicode(self.dplace.get_text()) - - p = self.get_place(self.dplace) - if p: - event.set_place_handle(p) - EventEdit.EventEditor( - self,pname,const.personalEvents, - const.personal_events,event,def_placename,1, - self.event_edit_callback, - noedit=self.db.readonly) + pass def on_aka_delete_clicked(self,obj): """Deletes the selected name from the name list""" @@ -1313,18 +1209,12 @@ class EditPerson: orig record""" surname = unicode(self.surname.get_text()) - self.birth.set_date_object(self.birth_date_object) - self.death.set_date_object(self.death_date_object) ntype = unicode(self.ntype_field.child.get_text()) suffix = unicode(self.suffix.get_text()) prefix = unicode(self.prefix.get_text()) given = unicode(self.given.get_text()) - nick = unicode(self.nick.get_text()) title = unicode(self.title.get_text()) - male = self.is_male.get_active() - female = self.is_female.get_active() - unknown = self.is_unknown.get_active() start = self.notes_buffer.get_start_iter() end = self.notes_buffer.get_end_iter() @@ -1357,8 +1247,6 @@ class EditPerson: changed = True if given != name.get_first_name(): changed = True - if nick != self.person.get_nick_name(): - changed = True if title != name.get_title(): changed = True if self.pname.get_note() != name.get_note(): @@ -1366,27 +1254,8 @@ class EditPerson: if not self.lds_not_loaded and self.check_lds(): changed = True - bplace = unicode(self.bplace.get_text().strip()) - dplace = unicode(self.dplace.get_text().strip()) - - if self.pdmap.has_key(bplace): - self.birth.set_place_handle(self.pdmap[bplace]) - else: - if bplace != "": - changed = True - self.birth.set_place_handle('') - - if self.pdmap.has_key(dplace): - self.death.set_place_handle(self.pdmap[dplace]) - else: - if dplace != "": - changed = True - self.death.set_place_handle('') - - if not self.birth.are_equal(self.orig_birth): - changed = True - if not self.death.are_equal(self.orig_death): - changed = True + (female,male,unknown) = _select_gender[self.gender.get_active()] + if male and self.person.get_gender() != RelLib.Person.MALE: changed = True elif female and self.person.get_gender() != RelLib.Person.FEMALE: @@ -1443,11 +1312,7 @@ class EditPerson: self.redraw_event_list() def update_birth_death(self): - self.bplace.set_text(place_title(self.db,self.birth)) - self.dplace.set_text(place_title(self.db,self.death)) - - self.bdate_check.update_after_editor(self.birth_date_object) - self.ddate_check.update_after_editor(self.death_date_object) + pass def on_update_attr_clicked(self,obj): import AttrEdit @@ -1488,148 +1353,51 @@ class EditPerson: self.event_edit_callback,noedit=self.db.readonly) def on_event_select_row(self,obj): - store,node = obj.get_selected() - if node: - row = store.get_path(node) - event = self.db.get_event_from_handle(self.elist[row[0]]) - self.event_date_field.set_text(event.get_date()) - self.event_place_field.set_text(place_title(self.db,event)) - self.event_name_field.set_text(const.display_pevent(event.get_name())) - self.event_cause_field.set_text(event.get_cause()) - self.event_descr_field.set_text(short(event.get_description())) - if len(event.get_source_references()) > 0: - psrc_ref = event.get_source_references()[0] - psrc_id = psrc_ref.get_base_handle() - psrc = self.db.get_source_from_handle(psrc_id) - self.event_src_field.set_text(short(psrc.get_title())) - self.event_conf_field.set_text(const.confidence[psrc_ref.get_confidence_level()]) - else: - self.event_src_field.set_text('') - self.event_conf_field.set_text('') - if not self.db.readonly: - self.event_delete_btn.set_sensitive(1) - self.event_edit_btn.set_sensitive(1) + store,iter = obj.get_selected() + if iter: + self.event_delete_btn.set_sensitive(True) + self.event_edit_btn.set_sensitive(True) else: - self.event_date_field.set_text('') - self.event_place_field.set_text('') - self.event_name_field.set_text('') - self.event_cause_field.set_text('') - self.event_descr_field.set_text('') - self.event_src_field.set_text('') - self.event_conf_field.set_text('') - self.event_delete_btn.set_sensitive(0) - self.event_edit_btn.set_sensitive(0) + self.event_delete_btn.set_sensitive(True) + self.event_edit_btn.set_sensitive(True) def on_addr_select_row(self,obj): store,node = self.ptree.get_selected() if node: - addr = self.ptree.get_object(node) - self.addr_start.set_text(addr.get_date()) - self.addr_street.set_text(addr.get_street()) - self.addr_city.set_text(addr.get_city()) - self.addr_state.set_text(addr.get_state()) - self.addr_country.set_text(addr.get_country()) - self.addr_postal.set_text(addr.get_postal_code()) - self.addr_phone.set_text(addr.get_phone()) - if len(addr.get_source_references()) > 0: - psrc_ref = addr.get_source_references()[0] - psrc_id = psrc_ref.get_base_handle() - psrc = self.db.get_source_from_handle(psrc_id) - self.addr_conf_field.set_text(const.confidence[psrc_ref.get_confidence_level()]) - self.addr_src_field.set_text(short(psrc.get_title())) - else: - self.addr_src_field.set_text('') - self.addr_conf_field.set_text('') - self.addr_delete_btn.set_sensitive(1) - self.addr_edit_btn.set_sensitive(1) + self.addr_delete_btn.set_sensitive(True) + self.addr_edit_btn.set_sensitive(True) else: - self.addr_start.set_text('') - self.addr_street.set_text('') - self.addr_city.set_text('') - self.addr_state.set_text('') - self.addr_country.set_text('') - self.addr_postal.set_text('') - self.addr_phone.set_text('') - self.addr_conf_field.set_text('') - self.addr_src_field.set_text('') - self.addr_delete_btn.set_sensitive(0) - self.addr_edit_btn.set_sensitive(0) + self.addr_delete_btn.set_sensitive(False) + self.addr_edit_btn.set_sensitive(False) def on_name_select_row(self,obj): store,node = self.ntree.get_selected() if node: - name = self.ntree.get_object(node) - self.alt_given_field.set_text(name.get_first_name()) - self.alt_title_field.set_text(name.get_title()) - self.alt_last_field.set_text(name.get_surname()) - self.alt_suffix_field.set_text(name.get_suffix()) - self.alt_prefix_field.set_text(name.get_surname_prefix()) - self.name_type_field.set_text(const.NameTypesMap.find_value(name.get_type())) - if len(name.get_source_references()) > 0: - psrc_ref = name.get_source_references()[0] - psrc_id = psrc_ref.get_base_handle() - psrc = self.db.get_source_from_handle(psrc_id) - self.name_src_field.set_text(short(psrc.get_title())) - self.name_conf_field.set_text(const.confidence[psrc_ref.get_confidence_level()]) - else: - self.name_src_field.set_text('') - self.name_conf_field.set_text('') - self.name_delete_btn.set_sensitive(1) - self.name_edit_btn.set_sensitive(1) + self.name_delete_btn.set_sensitive(True) + self.name_edit_btn.set_sensitive(True) else: - self.alt_given_field.set_text('') - self.alt_title_field.set_text('') - self.alt_last_field.set_text('') - self.alt_suffix_field.set_text('') - self.alt_prefix_field.set_text('') - self.name_type_field.set_text('') - self.name_src_field.set_text('') - self.name_conf_field.set_text('') - self.name_delete_btn.set_sensitive(0) - self.name_edit_btn.set_sensitive(0) + self.name_delete_btn.set_sensitive(False) + self.name_edit_btn.set_sensitive(False) def on_web_select_row(self,obj): store,node = self.wtree.get_selected() if node: - url = self.wtree.get_object(node) - path = url.get_path() - self.web_url.set_text(path) - self.web_description.set_text(url.get_description()) - self.web_go.set_sensitive(0) - self.web_go.set_sensitive(1) - self.web_delete_btn.set_sensitive(1) - self.web_edit_btn.set_sensitive(1) + self.web_go.set_sensitive(True) + self.web_delete_btn.set_sensitive(True) + self.web_edit_btn.set_sensitive(True) else: - self.web_url.set_text('') - self.web_description.set_text('') - self.web_go.set_sensitive(0) - self.web_delete_btn.set_sensitive(0) - self.web_edit_btn.set_sensitive(0) + self.web_go.set_sensitive(False) + self.web_delete_btn.set_sensitive(False) + self.web_edit_btn.set_sensitive(False) def on_attr_select_row(self,obj): store,node = self.atree.get_selected() if node: - attr = self.atree.get_object(node) - self.attr_type.set_text(const.display_pattr(attr.get_type())) - self.attr_value.set_text(short(attr.get_value())) - if len(attr.get_source_references()) > 0: - psrc_ref = attr.get_source_references()[0] - psrc_id = psrc_ref.get_base_handle() - psrc = self.db.get_source_from_handle(psrc_id) - self.attr_src_field.set_text(short(psrc.get_title())) - self.attr_conf_field.set_text(const.confidence[psrc_ref.get_confidence_level()]) - else: - self.attr_src_field.set_text('') - self.attr_conf_field.set_text('') - self.attr_delete_btn.set_sensitive(1) - self.attr_edit_btn.set_sensitive(1) + self.attr_delete_btn.set_sensitive(True) + self.attr_edit_btn.set_sensitive(True) else: - self.attr_type.set_text('') - self.attr_value.set_text('') - self.attr_src_field.set_text('') - self.attr_conf_field.set_text('') - self.attr_delete_btn.set_sensitive(0) - self.attr_edit_btn.set_sensitive(0) + self.attr_delete_btn.set_sensitive(False) + self.attr_edit_btn.set_sensitive(False) def aka_double_click(self,obj,event): if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: @@ -1660,7 +1428,7 @@ class EditPerson: try: i = pixbuf_new_from_file(photo) ratio = float(max(i.get_height(),i.get_width())) - scale = float(_PICTURE_WIDTH)/ratio + scale = float(100.0)/ratio x = int(scale*(i.get_width())) y = int(scale*(i.get_height())) i = i.scale_simple(x,y,INTERP_BILINEAR) @@ -1702,15 +1470,11 @@ class EditPerson: prefix = unicode(self.prefix.get_text()) ntype = unicode(self.ntype_field.child.get_text()) given = unicode(self.given.get_text()) - nick = unicode(self.nick.get_text()) title = unicode(self.title.get_text()) idval = unicode(self.gid.get_text()) name = self.pname - self.birth.set_date_object(self.birth_date_object) - self.birth.set_place_handle(self.get_place(self.bplace,1)) - if idval != self.person.get_gramps_id(): person = self.db.get_person_from_gramps_id(idval) if not person: @@ -1756,9 +1520,6 @@ class EditPerson: if name != self.person.get_primary_name(): self.person.set_primary_name(name) - if nick != self.person.get_nick_name(): - self.person.set_nick_name(nick) - self.pdmap.clear() for key in self.db.get_place_handles(): p = self.db.get_place_from_handle(key).get_display_info() @@ -1782,19 +1543,8 @@ class EditPerson: new_order = self.reorder_child_list(self.person,f.get_child_handle_list()) f.set_child_handle_list(new_order) - self.death.set_date_object(self.death_date_object) - self.death.set_place_handle(self.get_place(self.dplace,1)) - - if not self.orig_death.are_equal(self.death): - if self.orig_death.is_empty(): - self.db.add_event(self.death,trans) - self.person.set_death_handle(self.death.get_handle()) - self.db.commit_event(self.death,trans) - - male = self.is_male.get_active() - female = self.is_female.get_active() - unknown = self.is_unknown.get_active() error = False + (female,male,unknown) = _select_gender[self.gender.get_active()] if male and self.person.get_gender() != RelLib.Person.MALE: self.person.set_gender(RelLib.Person.MALE) for temp_family in self.person.get_family_handle_list(): @@ -1972,17 +1722,14 @@ class EditPerson: self.load_photo(None) def update_birth_info(self): - self.bdate_check.update_after_editor(self.birth.get_date_object()) - self.bplace.set_text(place_title(self.db,self.birth)) - + pass + def update_death_info(self): - self.ddate_check.update_after_editor(self.death.get_date_object()) - self.dplace.set_text(place_title(self.db,self.death)) + pass def on_switch_page(self,obj,a,page): if page == 0: self.load_person_image() - elif page == 2: self.redraw_event_list() elif page == 7 and self.not_loaded: self.not_loaded = False @@ -1992,19 +1739,19 @@ class EditPerson: note_buf = self.notes_buffer text = unicode(note_buf.get_text(note_buf.get_start_iter(), note_buf.get_end_iter(),False)) - if text: - Utils.bold_label(self.notes_label) - else: - Utils.unbold_label(self.notes_label) +# if text: +# Utils.bold_label(self.notes_label) +# else: +# Utils.unbold_label(self.notes_label) if not self.lds_not_loaded: self.check_lds() - if self.lds_baptism.is_empty() \ - and self.lds_endowment.is_empty() \ - and self.lds_sealing.is_empty(): - Utils.unbold_label(self.lds_tab) - else: - Utils.bold_label(self.lds_tab) +# if self.lds_baptism.is_empty() \ +# and self.lds_endowment.is_empty() \ +# and self.lds_sealing.is_empty(): +# Utils.unbold_label(self.lds_tab) +# else: +# Utils.bold_label(self.lds_tab) def change_name(self,obj): sel_objs = self.ntree.get_selected_objects() @@ -2021,8 +1768,8 @@ class EditPerson: def write_primary_name(self): # initial values name = '%s' % self.name_display.display(self.person) - self.get_widget("activepersonTitle").set_text(name) - self.get_widget("activepersonTitle").set_use_markup(True) +# self.get_widget("activepersonTitle").set_text(name) +# self.get_widget("activepersonTitle").set_use_markup(True) self.suffix.set_text(self.pname.get_suffix()) if self.use_patronymic: self.prefix.set_text(self.pname.get_patronymic()) @@ -2108,7 +1855,6 @@ class EditPerson: list.insert(target,person.get_handle()) return list - def short(val,size=60): if len(val) > size: return "%s..." % val[0:size] diff --git a/gramps2/src/GrampsDbBase.py b/gramps2/src/GrampsDbBase.py index a5369318c..78843cdde 100644 --- a/gramps2/src/GrampsDbBase.py +++ b/gramps2/src/GrampsDbBase.py @@ -992,7 +992,8 @@ class GrampsDbBase(GrampsDBCallback.GrampsDBCallback): def get_default_person(self): """returns the default Person of the database""" if self.metadata: - data = self.person_map.get(self.metadata['default']) + key = self.metadata.get('default') + data = self.person_map.get(key) if data: person = Person() person.unserialize(data) diff --git a/gramps2/src/ListModel.py b/gramps2/src/ListModel.py index b70dff2e1..8e2b5b69e 100644 --- a/gramps2/src/ListModel.py +++ b/gramps2/src/ListModel.py @@ -18,8 +18,11 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # -from gobject import TYPE_STRING, TYPE_PYOBJECT +from gobject import TYPE_STRING, TYPE_PYOBJECT, TYPE_OBJECT import gtk +import const + +gtk26 = gtk.pygtk_version >= (2,6,0) #------------------------------------------------------------------------- # @@ -43,11 +46,30 @@ class ListModel: self.cid = None self.cids = [] self.idmap = {} + + store = gtk.ListStore(str) + + events = const.personalConstantEvents.keys() + events.append('Birth') + events.append('Death') + events.sort() + + model = gtk.ListStore(str,TYPE_OBJECT) + for val in events: + model.append((val,store)) cnum = 0 for name in dlist: - renderer = gtk.CellRendererText() - renderer.set_fixed_height_from_font(1) + if gtk26 and cnum == 0: + renderer = gtk.CellRendererCombo() + renderer.set_property('model',model) + renderer.set_property('text_column',0) + renderer.set_property('editable',True) + else: + renderer = gtk.CellRendererText() + renderer.set_property('editable',True) + renderer.set_fixed_height_from_font(True) + renderer.connect('edited',self.edited_cb, cnum) column = gtk.TreeViewColumn(name[0],renderer,text=cnum) column.set_reorderable(True) column.set_min_width(name[2]) @@ -62,7 +84,7 @@ class ListModel: column.set_clickable(True) column.set_sort_column_id(name[1]) - cnum = cnum + 1 + cnum += 1 self.cids.append(name[1]) if name[0] != '': self.tree.append_column(column) @@ -75,6 +97,9 @@ class ListModel: self.double_click = event_func self.tree.connect('event',self.button_press) + def edited_cb(self, cell, path, new_text, col): + self.model[path][col] = new_text + def unselect(self): self.selection.unselect_all() @@ -168,7 +193,7 @@ class ListModel: def remove(self,node): self.model.remove(node) - self.count = self.count - 1 + self.count -= 1 def get_row(self,node): row = self.model.get_path(node) @@ -184,12 +209,12 @@ class ListModel: return self.model.get_value(node,self.data_index) def insert(self,position,data,info=None,select=0): - self.count = self.count + 1 + self.count += 1 node = self.model.insert(position) col = 0 for obj in data: self.model.set_value(node,col,obj) - col = col + 1 + col += 1 self.model.set_value(node,col,info) if info: self.idmap[str(info)] = node @@ -201,12 +226,12 @@ class ListModel: return [ self.model.get_value(node,c) for c in cols ] def add(self,data,info=None,select=0): - self.count = self.count + 1 + self.count += 1 node = self.model.append() col = 0 for obj in data: self.model.set_value(node,col,obj) - col = col + 1 + col += 1 self.model.set_value(node,col,info) if info: self.idmap[str(info)] = node @@ -219,7 +244,7 @@ class ListModel: col = 0 for obj in data: self.model.set_value(node,col,obj) - col = col + 1 + col += 1 self.model.set_value(node,col,info) if info: self.idmap[str(info)] = node @@ -228,12 +253,12 @@ class ListModel: return node def add_and_select(self,data,info=None): - self.count = self.count + 1 + self.count += 1 node = self.model.append() col = 0 for obj in data: self.model.set_value(node,col,obj) - col = col + 1 + col += 1 if info: self.idmap[str(info)] = node self.model.set_value(node,col,info) @@ -248,13 +273,11 @@ class ListModel: def button_press(self,obj,event): if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1: self.double_click(obj) - return 1 - return 0 + return True + return False def find(self,info): if info in self.idmap.keys(): node = self.idmap[str(info)] self.selection.select_iter(node) - def cleanup(self): - pass diff --git a/gramps2/src/Makefile.am b/gramps2/src/Makefile.am index 3dcee442f..2447e238d 100644 --- a/gramps2/src/Makefile.am +++ b/gramps2/src/Makefile.am @@ -126,6 +126,7 @@ gdir_PYTHON = \ # The latter is more portable and POSIX-friendly :) GLADEFILES = \ gramps.glade\ + edit_person.glade\ mergedata.glade\ gedcomexport.glade\ gedcomimport.glade\ diff --git a/gramps2/src/ReadXML.py b/gramps2/src/ReadXML.py index 72958bc5b..cc9ebbff1 100644 --- a/gramps2/src/ReadXML.py +++ b/gramps2/src/ReadXML.py @@ -436,7 +436,7 @@ class GrampsParser: person = RelLib.Person() person.set_handle(intid) person.set_gramps_id(gramps_id) - self.db.add_person(person,None) + self.db.add_person(person,self.trans) self.gid2id[gramps_id] = intid return person @@ -449,7 +449,7 @@ class GrampsParser: family = RelLib.Family() family.set_handle(intid) family.set_gramps_id(gramps_id) - self.db.add_family(family,None) + self.db.add_family(family,self.trans) self.gid2fid[gramps_id] = intid return family @@ -462,7 +462,7 @@ class GrampsParser: place = RelLib.Place() place.set_handle(intid) place.set_gramps_id(gramps_id) - self.db.add_place(place,None) + self.db.add_place(place,self.trans) self.gid2pid[gramps_id] = intid return place @@ -475,7 +475,7 @@ class GrampsParser: source = RelLib.Source() source.set_handle(intid) source.set_gramps_id(gramps_id) - self.db.add_source(source,None) + self.db.add_source(source,self.trans) self.gid2sid[gramps_id] = intid return source @@ -488,7 +488,7 @@ class GrampsParser: obj = RelLib.MediaObject() obj.set_handle(intid) obj.set_gramps_id(gramps_id) - self.db.add_object(obj,None) + self.db.add_object(obj,self.trans) self.gid2oid[gramps_id] = intid return obj @@ -534,11 +534,8 @@ class GrampsParser: def parse(self,file,use_trans=True): - if use_trans: - self.trans = self.db.transaction_begin() - self.trans.set_batch(True) - else: - self.trans = None + self.trans = self.db.transaction_begin() + self.trans.set_batch(True) self.db.disable_signals() @@ -601,7 +598,8 @@ class GrampsParser: def start_place(self,attrs): try: - self.placeobj = self.db.find_place_from_handle(attrs['hlink'],self.trans) + self.placeobj = self.db.find_place_from_handle(attrs['hlink'], + self.trans) except KeyError: handle = self.map_pid(attrs['ref']) self.placeobj = self.find_place_by_gramps_id(handle) @@ -609,7 +607,8 @@ class GrampsParser: def start_placeobj(self,attrs): handle = self.map_pid(attrs['id']) try: - self.placeobj = self.db.find_place_from_handle(attrs['handle'],self.trans) + self.placeobj = self.db.find_place_from_handle(attrs['handle'], + self.trans) self.placeobj.set_gramps_id(handle) except KeyError: self.placeobj = self.find_place_by_gramps_id(handle) @@ -783,14 +782,16 @@ class GrampsParser: self.count = self.count + 1 handle = self.map_fid(attrs["id"]) try: - self.family = self.db.find_family_from_handle(attrs["handle"],self.trans) + self.family = self.db.find_family_from_handle( + attrs["handle"],self.trans) self.family.set_gramps_id(handle) except KeyError: self.family = self.find_family_by_gramps_id(handle) if attrs.has_key("type"): - self.family.set_relationship(_FAMILY_TRANS.get(attrs["type"], - RelLib.Family.UNKNOWN)) + self.family.set_relationship( + _FAMILY_TRANS.get(attrs["type"], + RelLib.Family.UNKNOWN)) if attrs.has_key("complete"): self.family.set_complete_flag(int(attrs['complete'])) else: @@ -891,7 +892,8 @@ class GrampsParser: def start_source(self,attrs): handle = self.map_sid(attrs["id"]) try: - self.source = self.db.find_source_from_handle(attrs["handle"],self.trans) + self.source = self.db.find_source_from_handle(attrs["handle"], + self.trans) self.source.set_gramps_id(handle) except KeyError: self.source = self.find_source_by_gramps_id(handle) @@ -922,7 +924,8 @@ class GrampsParser: def start_object(self,attrs): handle = self.map_oid(attrs['id']) try: - self.object = self.db.find_object_from_handle(attrs['handle'],self.trans) + self.object = self.db.find_object_from_handle(attrs['handle'], + self.trans) self.object.set_gramps_id(handle) except KeyError: self.object = self.find_object_by_gramps_id(handle) diff --git a/gramps2/src/const.py.in b/gramps2/src/const.py.in index 006a9e92d..c6b45c37c 100644 --- a/gramps2/src/const.py.in +++ b/gramps2/src/const.py.in @@ -106,7 +106,7 @@ gladeFile = "%s/gramps.glade" % rootDir placesFile = "%s/gramps.glade" % rootDir imageselFile = "%s/gramps.glade" % rootDir marriageFile = "%s/gramps.glade" % rootDir -editPersonFile = "%s/gramps.glade" % rootDir +editPersonFile = "%s/edit_person.glade" % rootDir pluginsFile = "%s/plugins.glade" % rootDir prefsFile = "%s/gramps.glade" % rootDir stylesFile = "%s/gramps.glade" % rootDir diff --git a/gramps2/src/edit_person.glade b/gramps2/src/edit_person.glade new file mode 100644 index 000000000..5c4fb7eb4 --- /dev/null +++ b/gramps2/src/edit_person.glade @@ -0,0 +1,3400 @@ + + + + + + + True + + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + gramps.png + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + Abandon changes and close window + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + 0 + + + + + + + True + Accept changes and close window + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + 0 + + + + + + + True + True + True + gtk-help + True + GTK_RELIEF_NORMAL + True + -11 + + + + + + 2 + False + True + GTK_PACK_END + + + + + + 12 + True + 6 + 9 + False + 6 + 12 + + + + True + _Family: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + surname + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 1 + 2 + fill + + + + + + + True + _Given: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + givenName + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 2 + 3 + fill + + + + + + + True + Prefix: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + prefix + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 5 + 6 + 1 + 2 + fill + + + + + + + True + _Title: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + title + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 3 + 4 + fill + + + + + + + True + A title used to refer to the person, such as "Dr." or "Rev." + True + True + True + 0 + + True + * + False + + + 2 + 3 + 3 + 4 + + + + + + + True + Gender: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 5 + 6 + fill + + + + + + + True + Female +Male +Unknown + False + True + + + 2 + 3 + 5 + 6 + fill + fill + + + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + True + False + + + + 120 + 100 + True + 0.5 + 0.5 + 0 + 0 + + + + + + + + True + <b>Image</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 8 + 9 + 0 + 4 + fill + fill + + + + + + True + True + True + True + 0 + + True + * + False + + + 2 + 5 + 1 + 2 + + + + + + + True + S_uffix: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + suffix + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 3 + 4 + fill + + + + + + + True + ID: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 5 + 6 + fill + + + + + + + True + True + Pri_vate + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 8 + 9 + 5 + 6 + fill + + + + + + + True + T_ype: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 5 + 6 + 3 + 4 + fill + + + + + + + True + An optional suffix to the name, such as "Jr." or "III" + True + True + True + 0 + + True + * + False + 6 + + + 4 + 5 + 3 + 4 + + + + + + + True + True + False + True + 0 + + True + * + False + 12 + + + 4 + 5 + 5 + 6 + + + + + + + True + <b>Preferred name</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 8 + 0 + 1 + fill + + + + + + + True + The person's given name + True + True + True + True + 0 + + True + * + False + + + + 2 + 7 + 2 + 3 + + + + + + + True + Edit the preferred name + True + GTK_RELIEF_NORMAL + True + + + + + True + edit_sm.png + 0.5 + 0.5 + 0 + 0 + + + + + 7 + 8 + 2 + 3 + shrink + + + + + + + True + False + True + True + + + 6 + 7 + 3 + 4 + fill + + + + + + + True + An optional prefix for the family name that is not used in sorting, such as "de" or "van" + True + True + True + 0 + + True + * + False + 10 + + + 6 + 7 + 1 + 2 + + + + + + + 6 + True + True + Complete + True + GTK_RELIEF_NORMAL + True + False + False + True + + + 6 + 7 + 5 + 6 + fill + + + + + + + True + <b>General</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 9 + 4 + 5 + fill + + + + + + 10 + False + False + + + + + + True + True + True + True + GTK_POS_TOP + False + False + + + + + 6 + True + False + 6 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + Create an alternate name for this person + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-add + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Edit the selected name + True + GTK_RELIEF_NORMAL + True + + + + + True + edit_sm.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Delete the selected name + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-remove + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + + + + 0 + False + True + + + + + False + True + + + + + + True + False + 0 + + + + True + 4 + gtk-file + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Events + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 6 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + tab + + + + + + 6 + True + False + 6 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + Create an alternate name for this person + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-add + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Edit the selected name + True + GTK_RELIEF_NORMAL + True + + + + + True + edit_sm.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Delete the selected name + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-remove + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + + + + 0 + False + True + + + + + False + True + + + + + + True + False + 0 + + + + True + 4 + gtk-file + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Names + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 6 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + tab + + + + + + True + False + 0 + + + + True + False + 0 + + + + 6 + True + False + 6 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + Create a new attribute + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-add + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Edit the selected attribute + True + GTK_RELIEF_NORMAL + True + + + + + True + edit_sm.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Delete the selected attribute + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-remove + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + + + + 0 + False + True + + + + + 0 + True + True + + + + + 0 + True + True + + + + + False + True + + + + + + True + False + 0 + + + + True + 4 + gtk-file + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Attributes + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 6 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + tab + + + + + + 6 + True + False + 6 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + Create a new address + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-add + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Edit the selected address + True + GTK_RELIEF_NORMAL + True + + + + + True + edit_sm.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Delete the selected address + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-remove + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + + + + 0 + False + True + + + + + False + True + + + + + + True + False + 0 + + + + True + 4 + gtk-file + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Addresses + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 6 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + tab + + + + + + True + False + 0 + + + + 6 + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + Enter miscellaneous relevant data and documentation + True + True + False + True + GTK_JUSTIFY_LEFT + GTK_WRAP_WORD + True + 6 + 0 + 0 + 6 + 6 + 6 + + + + + + 0 + True + True + + + + + + 12 + True + 2 + 3 + False + 12 + 24 + + + + True + <b>Format</b> + True + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + flowed + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 3 + 0 + 1 + fill + + + + + + + True + Multiple spaces, tabs, and single line breaks are replaced with single spaces. Two consecutive line breaks mark a new paragraph. + True + _Flowed + True + GTK_RELIEF_NORMAL + True + True + False + True + + + 1 + 2 + 1 + 2 + + + + + + + + True + Formatting is preserved, except for the leading whitespace. Multiple spaces, tabs, and all line breaks are respected. + True + _Preformatted + True + GTK_RELIEF_NORMAL + True + False + False + True + flowed + + + 2 + 3 + 1 + 2 + + + + + + + 0 + False + True + + + + + False + True + + + + + + True + False + 0 + + + + True + 4 + gtk-file + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Notes + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 6 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + tab + + + + + + 6 + True + False + 6 + + + + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + Add a source + True + GTK_RELIEF_NORMAL + True + + + + True + gtk-add + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + Edit the selected source + True + GTK_RELIEF_NORMAL + True + + + + True + edit_sm.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + Remove the selected source + True + GTK_RELIEF_NORMAL + True + + + + True + gtk-remove + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + + + + 0 + False + True + + + + + False + True + + + + + + True + False + 0 + + + + True + 4 + gtk-file + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Sources + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + tab + + + + + + True + False + 0 + + + + 6 + True + False + 6 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + GTK_SELECTION_SINGLE + GTK_ORIENTATION_VERTICAL + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + Add a new media object to the database and place it in this gallery + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-add + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + Select an existing media object from the database and place it in this gallery + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-index + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + Edit the properties of the selected object + True + GTK_RELIEF_NORMAL + True + + + + + True + edit_sm.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + Remove the selected object from this gallery only + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-remove + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + 0 + False + True + + + + + 0 + True + True + + + + + False + True + + + + + + True + False + 0 + + + + True + 4 + gtk-file + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Gallery + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 6 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + tab + + + + + + True + False + 0 + + + + 6 + True + False + 6 + + + + True + True + GTK_POLICY_AUTOMATIC + GTK_POLICY_AUTOMATIC + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + True + False + False + True + False + False + False + + + + + 0 + True + True + + + + + + True + False + 6 + + + + True + Add an internet reference about this person + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-add + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Edit the selected internet address + True + GTK_RELIEF_NORMAL + True + + + + + True + edit_sm.png + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + Go to this web page + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-jump-to + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + True + False + Delete selected reference + True + GTK_RELIEF_NORMAL + True + + + + + True + gtk-remove + 4 + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + True + + + + + + + + + 0 + False + True + + + + + 0 + True + True + + + + + False + True + + + + + + True + False + 0 + + + + True + 4 + gtk-file + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + True + Internet + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 6 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + tab + + + + + + 12 + True + 10 + 6 + False + 6 + 12 + + + + True + _Date: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + ldsbapdate + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 1 + 2 + fill + + + + + + + True + True + Sources... + True + GTK_RELIEF_NORMAL + True + + + + 5 + 6 + 2 + 3 + fill + + + + + + + True + D_ate: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + endowdate + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + Date: + + + + 1 + 2 + 4 + 5 + fill + + + + + + + True + True + Sources... + True + GTK_RELIEF_NORMAL + True + + + + 5 + 6 + 5 + 6 + fill + + + + + + + True + Dat_e: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + sealdate + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 7 + 8 + fill + + + + + + + True + True + Sources... + True + GTK_RELIEF_NORMAL + True + + + + 5 + 6 + 8 + 9 + fill + + + + + + + True + False + 0 + + + + True + True + True + True + 0 + + True + * + False + + + 0 + True + True + + + + + + True + Invoke date editor + True + GTK_RELIEF_NONE + True + + + + True + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 2 + 3 + 1 + 2 + fill + fill + + + + + + True + False + 0 + + + + True + True + True + True + 0 + + True + * + False + + + 0 + True + True + + + + + + True + Invoke date editor + True + GTK_RELIEF_NONE + True + + + + True + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 2 + 3 + 4 + 5 + fill + fill + + + + + + True + False + 0 + + + + True + True + True + True + 0 + + True + * + False + + + 0 + True + True + + + + + + True + Invoke date editor + True + GTK_RELIEF_NONE + True + + + + True + 0.5 + 0.5 + 0 + 0 + + + + + 0 + False + False + + + + + 2 + 3 + 7 + 8 + fill + fill + + + + + + True + LDS _temple: + True + False + GTK_JUSTIFY_CENTER + False + False + 1 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 1 + 2 + fill + + + + + + + True + False + True + + + 4 + 5 + 1 + 2 + fill + + + + + + True + _Place: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + lds_bap_place + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + 1 + 2 + 2 + 3 + fill + + + + + + + True + True + Note... + True + GTK_RELIEF_NORMAL + True + + + + 5 + 6 + 1 + 2 + fill + + + + + + + True + False + True + + + 4 + 5 + 2 + 3 + fill + fill + + + + + + True + Status: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 2 + 3 + fill + + + + + + + True + False + True + + + 4 + 5 + 4 + 5 + fill + fill + + + + + + True + LDS te_mple: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 4 + 5 + fill + + + + + + + True + P_lace: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + lds_end_place + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + 1 + 2 + 5 + 6 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 2 + 3 + 5 + 6 + + + + + + + True + Status: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 5 + 6 + fill + + + + + + + True + False + True + + + 4 + 5 + 5 + 6 + fill + fill + + + + + + True + True + Note... + True + GTK_RELIEF_NORMAL + True + + + + 5 + 6 + 4 + 5 + fill + + + + + + + True + False + True + + + 4 + 5 + 7 + 8 + fill + fill + + + + + + True + LD_S temple: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 7 + 8 + fill + + + + + + + True + Pla_ce: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + lds_seal_place + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + 1 + 2 + 8 + 9 + fill + + + + + + + True + True + True + True + 0 + + True + * + False + + + 2 + 3 + 8 + 9 + + + + + + + True + Status: + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 3 + 4 + 8 + 9 + fill + + + + + + + True + False + True + + + 4 + 5 + 8 + 9 + fill + fill + + + + + + True + True + Note... + True + GTK_RELIEF_NORMAL + True + + + + 5 + 6 + 7 + 8 + fill + + + + + + + True + <b>LDS baptism</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 6 + 0 + 1 + fill + + + + + + + True + <b>Endowment</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 6 + 3 + 4 + fill + + + + + + + True + <b>Sealed to parents</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 6 + 6 + 7 + fill + + + + + + + True + Pa_rents: + True + False + GTK_JUSTIFY_CENTER + False + False + 0 + 0.5 + 0 + 0 + sealparents + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 9 + 10 + fill + + + + + + + True + False + True + + + 2 + 3 + 9 + 10 + fill + fill + + + + + + True + True + True + True + 0 + + True + * + False + + + 2 + 3 + 2 + 3 + + + + + + False + True + + + + + + True + False + 0 + + + + True + 4 + gtk-file + 0.5 + 0.5 + 0 + 0 + + + 0 + True + True + + + + + + LDS + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 6 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + tab + + + + + 0 + True + True + + + + + + +