From c1485695966a993d516e2dfdf3b22f320c0f2cab Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Sat, 15 Oct 2005 04:29:19 +0000 Subject: [PATCH] * src/EditPerson.py: remove signal_autoconnect to fix glade memory leak * src/EditPlace.py: remove signal_autoconnect to fix glade memory leak * src/GenericFilter.py: use TransUtils.py * src/Makefile.am: add TransUtils.py and WindowUtils.py * src/Marriage.py: remove signal_autoconnect to fix glade memory leak * src/Sources.py: remove signal_autoconnect to fix glade memory leak * src/Spell.py: import gettext * src/Relationship.py: use TransUtils.py * src/TransUtils.py: added to remove cyclic import * src/WindowUtils.py: glade/signal interface class svn: r5323 --- gramps2/ChangeLog | 16 ++ gramps2/src/EditPerson.py | 388 +++++++++++++++-------------------- gramps2/src/EditPlace.py | 42 ++-- gramps2/src/GenericFilter.py | 2 +- gramps2/src/Makefile.am | 4 +- gramps2/src/Marriage.py | 38 ---- gramps2/src/Relationship.py | 2 +- gramps2/src/Sources.py | 23 ++- gramps2/src/Spell.py | 2 + gramps2/src/TransUtils.py | 42 ++++ gramps2/src/Utils.py | 23 --- gramps2/src/WindowUtils.py | 36 ++++ gramps2/src/gramps.glade | 62 ------ 13 files changed, 306 insertions(+), 374 deletions(-) create mode 100644 gramps2/src/TransUtils.py create mode 100644 gramps2/src/WindowUtils.py diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index d064542be..28adcaef6 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,19 @@ +2005-10-14 Don Allingham + * src/EditPerson.py: remove signal_autoconnect to fix glade + memory leak + * src/EditPlace.py: remove signal_autoconnect to fix glade + memory leak + * src/GenericFilter.py: use TransUtils.py + * src/Makefile.am: add TransUtils.py and WindowUtils.py + * src/Marriage.py: remove signal_autoconnect to fix glade + memory leak + * src/Sources.py: remove signal_autoconnect to fix glade + memory leak + * src/Spell.py: import gettext + * src/Relationship.py: use TransUtils.py + * src/TransUtils.py: added to remove cyclic import + * src/WindowUtils.py: glade/signal interface class + 2005-10-14 Alex Roitman * src/Date.py (is_empty): Consider non-text-only date with empty numerical fields an empty date. diff --git a/gramps2/src/EditPerson.py b/gramps2/src/EditPerson.py index 62f8bc0d4..ab8255db4 100644 --- a/gramps2/src/EditPerson.py +++ b/gramps2/src/EditPerson.py @@ -63,11 +63,10 @@ import NameDisplay import Spell import GrampsDisplay +from WindowUtils import GladeIf from QuestionDialog import WarningDialog, ErrorDialog, SaveDialog, QuestionDialog2 - from DdTargets import DdTargets - #------------------------------------------------------------------------- # # Constants @@ -84,7 +83,7 @@ _temple_names = [""] + _temple_names _use_patronymic = [ "ru","RU","ru_RU","koi8r","ru_koi8r","russian","Russian", ] - + #------------------------------------------------------------------------- # # EditPerson class @@ -135,7 +134,9 @@ class EditPerson: self.load_obj = None self.top = gtk.glade.XML(const.editPersonFile, "editPerson","gramps") - self.window = self.get_widget("editPerson") + self.gladeif = GladeIf(self.top) + + self.window = self.top.get_widget("editPerson") self.window.set_title("%s - GRAMPS" % _('Edit Person')) self.icon_list = self.top.get_widget("iconlist") @@ -143,9 +144,9 @@ class EditPerson: self.path, self.icon_list, self.db, self, self.window) - self.complete = self.get_widget('complete') + self.complete = self.top.get_widget('complete') self.complete.set_sensitive(mod) - self.private = self.get_widget('private') + self.private = self.top.get_widget('private') self.private.set_sensitive(mod) self.name_delete_btn = self.top.get_widget('aka_delete') self.name_edit_btn = self.top.get_widget('aka_edit') @@ -158,104 +159,104 @@ class EditPerson: self.addr_delete_btn = self.top.get_widget('addr_del') self.addr_edit_btn = self.top.get_widget('addr_edit_btn') - self.notes_field = self.get_widget("personNotes") + self.notes_field = self.top.get_widget("personNotes") self.notes_field.set_editable(mod) self.spell_notes = Spell.Spell(self.notes_field) - self.flowed = self.get_widget("flowed") + self.flowed = self.top.get_widget("flowed") self.flowed.set_sensitive(mod) - self.preform = self.get_widget("preform") + self.preform = self.top.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") - self.attr_src_field = self.get_widget("attr_srcinfo") - self.name_src_field = self.get_widget("name_srcinfo") - self.addr_src_field = self.get_widget("addr_srcinfo") - 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_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.addr_phone = self.get_widget("phone") - self.event_list = self.get_widget("eventList") - self.edit_person = self.get_widget("editPerson") - self.name_list = self.get_widget("nameList") - self.alt_given_field = self.get_widget("alt_given") - self.alt_last_field = self.get_widget("alt_last") - self.alt_title_field = self.get_widget("alt_title") - self.alt_suffix_field = self.get_widget("alt_suffix") - self.alt_prefix_field = self.get_widget("alt_prefix") - self.name_type_field = self.get_widget("name_type") - self.ntype_field = self.get_widget("ntype") + self.event_name_field = self.top.get_widget("eventName") + self.event_place_field = self.top.get_widget("eventPlace") + self.event_cause_field = self.top.get_widget("eventCause") + self.event_date_field = self.top.get_widget("eventDate") + self.event_descr_field = self.top.get_widget("eventDescription") + self.event_src_field = self.top.get_widget("event_srcinfo") + self.event_conf_field = self.top.get_widget("event_conf") + self.attr_conf_field = self.top.get_widget("attr_conf") + self.addr_conf_field = self.top.get_widget("addr_conf") + self.name_conf_field = self.top.get_widget("name_conf") + self.attr_src_field = self.top.get_widget("attr_srcinfo") + self.name_src_field = self.top.get_widget("name_srcinfo") + self.addr_src_field = self.top.get_widget("addr_srcinfo") + self.attr_list = self.top.get_widget("attr_list") + self.attr_type = self.top.get_widget("attr_type") + self.attr_value = self.top.get_widget("attr_value") + self.web_list = self.top.get_widget("web_list") + self.web_url = self.top.get_widget("web_url") + self.web_go = self.top.get_widget("web_go") + self.web_description = self.top.get_widget("url_des") + self.addr_list = self.top.get_widget("address_list") + self.addr_start = self.top.get_widget("address_start") + self.addr_street = self.top.get_widget("street") + self.addr_city = self.top.get_widget("city") + self.addr_state = self.top.get_widget("state") + self.addr_country = self.top.get_widget("country") + self.addr_postal = self.top.get_widget("postal") + self.addr_phone = self.top.get_widget("phone") + self.event_list = self.top.get_widget("eventList") + self.edit_person = self.top.get_widget("editPerson") + self.name_list = self.top.get_widget("nameList") + self.alt_given_field = self.top.get_widget("alt_given") + self.alt_last_field = self.top.get_widget("alt_last") + self.alt_title_field = self.top.get_widget("alt_title") + self.alt_suffix_field = self.top.get_widget("alt_suffix") + self.alt_prefix_field = self.top.get_widget("alt_prefix") + self.name_type_field = self.top.get_widget("name_type") + self.ntype_field = self.top.get_widget("ntype") self.ntype_field.set_sensitive(mod) - self.suffix = self.get_widget("suffix") + self.suffix = self.top.get_widget("suffix") self.suffix.set_editable(mod) - self.prefix = self.get_widget("prefix") + self.prefix = self.top.get_widget("prefix") self.prefix.set_editable(mod) - self.given = self.get_widget("givenName") + self.given = self.top.get_widget("givenName") self.given.set_editable(mod) - self.nick = self.get_widget("nickname") + self.nick = self.top.get_widget("nickname") self.nick.set_editable(mod) - self.title = self.get_widget("title") + self.title = self.top.get_widget("title") self.title.set_editable(mod) - self.bdate = self.get_widget("birthDate") + self.bdate = self.top.get_widget("birthDate") self.bdate.set_editable(mod) - self.bplace = self.get_widget("birth_place") + self.bplace = self.top.get_widget("birth_place") self.bplace.set_editable(mod) - self.surname = self.get_widget("surname") + self.surname = self.top.get_widget("surname") self.surname.set_editable(mod) - self.ddate = self.get_widget("deathDate") + self.ddate = self.top.get_widget("deathDate") self.ddate.set_editable(mod) - self.dplace = self.get_widget("death_place") + self.dplace = self.top.get_widget("death_place") self.dplace.set_editable(mod) - self.is_male = self.get_widget("genderMale") + self.is_male = self.top.get_widget("genderMale") self.is_male.set_sensitive(mod) - self.is_female = self.get_widget("genderFemale") + self.is_female = self.top.get_widget("genderFemale") self.is_female.set_sensitive(mod) - self.is_unknown = self.get_widget("genderUnknown") + self.is_unknown = self.top.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") - 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.addr_note = self.top.get_widget("addr_note") + self.addr_source = self.top.get_widget("addr_source") + self.attr_note = self.top.get_widget("attr_note") + self.attr_source = self.top.get_widget("attr_source") + self.name_note = self.top.get_widget("name_note") + self.name_source = self.top.get_widget("name_source") + self.gid = self.top.get_widget("gid") self.gid.set_editable(mod) - 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") - self.sources_label = self.get_widget("sources_label") - self.inet_label = self.get_widget("inet_label") - self.gallery_label = self.get_widget("gallery_label") - self.lds_tab = self.get_widget("lds_tab") - self.person_photo = self.get_widget("personPix") - self.eventbox = self.get_widget("eventbox1") + self.slist = self.top.get_widget("slist") + self.general_label = self.top.get_widget("general_label") + self.names_label = self.top.get_widget("names_label") + self.events_label = self.top.get_widget("events_label") + self.attr_label = self.top.get_widget("attr_label") + self.addr_label = self.top.get_widget("addr_label") + self.notes_label = self.top.get_widget("notes_label") + self.sources_label = self.top.get_widget("sources_label") + self.inet_label = self.top.get_widget("inet_label") + self.gallery_label = self.top.get_widget("gallery_label") + self.lds_tab = self.top.get_widget("lds_tab") + self.person_photo = self.top.get_widget("personPix") + self.eventbox = self.top.get_widget("eventbox1") - self.get_widget("birth_stat").set_sensitive(mod) - self.get_widget("death_stat").set_sensitive(mod) + self.top.get_widget("birth_stat").set_sensitive(mod) + self.top.get_widget("death_stat").set_sensitive(mod) - self.prefix_label = self.get_widget('prefix_label') + self.prefix_label = self.top.get_widget('prefix_label') if self.use_patronymic: self.prefix_label.set_text(_('Patronymic:')) @@ -375,15 +376,15 @@ class EditPerson: or (not self.lds_baptism.is_empty()) \ or (not self.lds_endowment.is_empty()) \ or (not self.lds_sealing.is_empty()): - self.get_widget("lds_tab").show() - self.get_widget("lds_page").show() + self.top.get_widget("lds_tab").show() + self.top.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) else: - self.get_widget("lds_tab").hide() - self.get_widget("lds_page").hide() + self.top.get_widget("lds_tab").hide() + self.top.get_widget("lds_page").hide() types = const.NameTypesMap.get_values() types.sort() @@ -410,113 +411,73 @@ class EditPerson: self.flowed.set_active(1) Utils.bold_label(self.notes_label) - self.name_list.drag_dest_set(gtk.DEST_DEFAULT_ALL, - [DdTargets.NAME.target()], - ACTION_COPY) - self.name_list.drag_source_set(BUTTON1_MASK, - [DdTargets.NAME.target()], - ACTION_COPY) - self.name_list.connect('drag_data_get', self.name_drag_data_get) - self.name_list.connect('drag_begin', self.name_drag_begin) - self.name_list.connect('drag_data_received', - self.name_drag_data_received) + self.set_list_dnd(self.name_list, self.name_drag_data_get, + self.name_drag_begin, self.name_drag_data_received) - self.event_list.drag_dest_set(gtk.DEST_DEFAULT_ALL, - [DdTargets.EVENT.target()], - ACTION_COPY) - self.event_list.drag_source_set(BUTTON1_MASK, - [DdTargets.EVENT.target()], - ACTION_COPY) - self.event_list.connect('drag_data_get', self.ev_drag_data_get) - self.event_list.connect('drag_begin', self.ev_drag_begin) - self.event_list.connect('drag_data_received', - self.ev_drag_data_received) + self.set_list_dnd(self.event_list, self.ev_drag_data_get, + self.ev_drag_begin, self.ev_drag_data_received) - self.web_list.drag_dest_set(gtk.DEST_DEFAULT_ALL, - [DdTargets.URL.target()], - ACTION_COPY) - self.web_list.drag_source_set(BUTTON1_MASK, - [DdTargets.URL.target()], - ACTION_COPY) - self.web_list.connect('drag_data_get', self.url_drag_data_get) - self.web_list.connect('drag_begin', self.url_drag_begin) - self.web_list.connect('drag_data_received',self.url_drag_data_received) - - self.attr_list.drag_dest_set(gtk.DEST_DEFAULT_ALL, - [DdTargets.ATTRIBUTE.target()], - ACTION_COPY) - self.attr_list.drag_source_set(BUTTON1_MASK, - [DdTargets.ATTRIBUTE.target()], - ACTION_COPY) - self.attr_list.connect('drag_data_get', self.at_drag_data_get) - self.attr_list.connect('drag_data_received',self.at_drag_data_received) - self.attr_list.connect('drag_begin', self.at_drag_begin) + self.set_list_dnd(self.web_list,self.url_drag_data_get, + self.url_drag_begin, self.url_drag_data_received) - self.addr_list.drag_dest_set(gtk.DEST_DEFAULT_ALL, - [DdTargets.ADDRESS.target()], - ACTION_COPY) - self.addr_list.drag_source_set(BUTTON1_MASK, - [DdTargets.ADDRESS.target()], - ACTION_COPY) - self.addr_list.connect('drag_data_get', self.ad_drag_data_get) - self.addr_list.connect('drag_data_received',self.ad_drag_data_received) - self.addr_list.connect('drag_begin', self.ad_drag_begin) + self.set_list_dnd(self.attr_list, self.at_drag_data_get, + self.at_drag_begin, self.at_drag_data_received) + + self.set_list_dnd(self.addr_list, self.ad_drag_data_get, + self.ad_drag_begin, self.ad_drag_data_received) 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.top.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.top.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, - "on_down_clicked" : self.on_down_clicked, - "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_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, - "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_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, - "on_event_update_clicked" : self.on_event_update_clicked, - "on_edit_name_clicked" : self.on_edit_name_clicked, - "on_ldsbap_note_clicked" : self.on_ldsbap_note_clicked, - "on_ldsendow_note_clicked" : self.on_ldsendow_note_clicked, - "on_ldsseal_note_clicked" : self.on_ldsseal_note_clicked, - "on_ldsbap_src_clicked" : self.on_ldsbap_source_clicked, - "on_ldsendow_src_clicked" : self.on_ldsendow_source_clicked, - "on_ldsseal_src_clicked" : self.on_ldsseal_source_clicked, - "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_gender_activate" : self.on_gender_activate, - "on_given_focus_out" : self.on_given_focus_out_event, - "on_help_person_clicked" : self.on_help_clicked, - }) - + self.gladeif.connect("editPerson", "delete_event", self.on_delete_event) + self.gladeif.connect("button15", "clicked", self.on_cancel_edit) + self.gladeif.connect("ok", "clicked", self.on_apply_person_clicked) + self.gladeif.connect("button134", "clicked", self.on_help_clicked) + self.gladeif.connect("notebook", "switch_page", self.on_switch_page) + self.gladeif.connect("genderMale", "toggled", self.on_gender_activate) + self.gladeif.connect("genderFemale", "toggled", self.on_gender_activate) + self.gladeif.connect("genderUnknown", "toggled", self.on_gender_activate) + self.gladeif.connect("givenName", "focus_out_event", self.on_given_focus_out_event) + self.gladeif.connect("button177", "clicked", self.on_edit_name_clicked) + self.gladeif.connect("button99", "clicked", self.on_edit_birth_clicked) + self.gladeif.connect("button126", "clicked", self.on_edit_death_clicked) + self.gladeif.connect("add_aka", "clicked", self.on_add_aka_clicked) + self.gladeif.connect("aka_edit", "clicked", self.on_aka_update_clicked) + self.gladeif.connect("aka_delete", "clicked", self.on_aka_delete_clicked) + self.gladeif.connect("event_add", "clicked" , self.on_event_add_clicked) + self.gladeif.connect("event_edit_btn", "clicked" ,self.on_event_update_clicked) + self.gladeif.connect("event_del", "clicked", self.on_event_delete_clicked) + self.gladeif.connect("attr_add", "clicked" , self.on_add_attr_clicked) + self.gladeif.connect("attr_edit_btn", "clicked", self.on_update_attr_clicked) + self.gladeif.connect("attr_del", "clicked", self.on_delete_attr_clicked) + self.gladeif.connect("addr_add", "clicked", self.on_add_addr_clicked) + self.gladeif.connect("addr_edit_btn", "clicked", self.on_update_addr_clicked) + self.gladeif.connect("addr_del", "clicked", self.on_delete_addr_clicked) + self.gladeif.connect("media_add", "clicked", self.gallery.on_add_media_clicked) + self.gladeif.connect("media_sel", "clicked", self.gallery.on_select_media_clicked) + self.gladeif.connect("image_edit_btn", "clicked", self.gallery.on_edit_media_clicked) + self.gladeif.connect("media_del", "clicked", self.gallery.on_delete_media_clicked) + self.gladeif.connect("add_url", "clicked", self.on_add_url_clicked) + self.gladeif.connect("edit_url", "clicked", self.on_update_url_clicked,) + self.gladeif.connect("web_go", "clicked", self.on_web_go_clicked) + self.gladeif.connect("delete_url", "clicked", self.on_delete_url_clicked) + self.gladeif.connect("button131", "clicked", self.on_ldsbap_source_clicked,) + self.gladeif.connect("button128", "clicked", self.on_ldsbap_note_clicked) + self.gladeif.connect("button132", "clicked", self.on_ldsendow_source_clicked) + self.gladeif.connect("button129", "clicked", self.on_ldsendow_note_clicked) + self.gladeif.connect("button133", "clicked", self.on_ldsseal_source_clicked) + self.gladeif.connect("button130", "clicked", self.on_ldsseal_note_clicked) + self.sourcetab = Sources.SourceTab( self.srcreflist, self, self.top, self.window, self.slist, self.top.get_widget('add_src'), self.top.get_widget('edit_src'), @@ -532,7 +493,7 @@ class EditPerson: self.redraw_addr_list() self.redraw_name_list() self.redraw_url_list() - self.get_widget("notebook").set_current_page(0) + self.top.get_widget("notebook").set_current_page(0) self.given.grab_focus() self.add_itself_to_winsmenu() @@ -540,10 +501,19 @@ class EditPerson: "event_add", "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) + self.top.get_widget(i).set_sensitive(not self.db.readonly) self.window.show() + def set_list_dnd(self,obj, get, begin, receive): + obj.drag_dest_set(gtk.DEST_DEFAULT_ALL, [DdTargets.NAME.target()], + ACTION_COPY) + obj.drag_source_set(BUTTON1_MASK,[DdTargets.NAME.target()], + ACTION_COPY) + obj.connect('drag_data_get', get) + obj.connect('drag_begin', begin) + obj.connect('drag_data_received', receive) + def build_pdmap(self): self.pdmap.clear() cursor = self.db.get_place_cursor() @@ -633,6 +603,7 @@ class EditPerson: self.gallery.close() self.close_child_windows() self.remove_itself_from_winsmenu() + self.gladeif.close() self.window.destroy() gc.collect() @@ -695,51 +666,51 @@ class EditPerson: """Draws the LDS window. This window is not always drawn, and in may cases is hidden.""" - self.ldsbap_date = self.get_widget("ldsbapdate") + self.ldsbap_date = self.top.get_widget("ldsbapdate") self.ldsbap_date.set_editable(not self.db.readonly) - self.ldsbap_temple = self.get_widget("ldsbaptemple") + self.ldsbap_temple = self.top.get_widget("ldsbaptemple") self.ldsbap_temple.set_sensitive(not self.db.readonly) - self.ldsbapplace = self.get_widget("lds_bap_place") + self.ldsbapplace = self.top.get_widget("lds_bap_place") self.ldsbapplace.set_editable(not self.db.readonly) - self.ldsbap_date_led = self.get_widget("ldsbap_stat") + self.ldsbap_date_led = self.top.get_widget("ldsbap_stat") self.ldsbap_date_led.set_sensitive(not self.db.readonly) self.ldsbap_date_check = DateEdit.DateEdit( self.lds_baptism.get_date_object(), self.ldsbap_date, self.ldsbap_date_led, self.window) - self.ldsend_date = self.get_widget("endowdate") + self.ldsend_date = self.top.get_widget("endowdate") self.ldsend_date.set_editable(not self.db.readonly) - self.ldsend_temple = self.get_widget("endowtemple") + self.ldsend_temple = self.top.get_widget("endowtemple") self.ldsend_temple.set_sensitive(not self.db.readonly) - self.ldsendowplace = self.get_widget("lds_end_place") + self.ldsendowplace = self.top.get_widget("lds_end_place") self.ldsendowplace.set_editable(not self.db.readonly) - self.ldsendowstat = self.get_widget("endowstat") + self.ldsendowstat = self.top.get_widget("endowstat") self.ldsendowstat.set_sensitive(not self.db.readonly) - self.ldsend_date_led = self.get_widget("endow_stat") + self.ldsend_date_led = self.top.get_widget("endow_stat") self.ldsend_date_led.set_sensitive(not self.db.readonly) self.ldsend_date_check = DateEdit.DateEdit( self.lds_endowment.get_date_object(), self.ldsend_date, self.ldsend_date_led, self.window) - self.ldsseal_date = self.get_widget("sealdate") - self.ldsseal_temple = self.get_widget("sealtemple") - self.ldssealplace = self.get_widget("lds_seal_place") + self.ldsseal_date = self.top.get_widget("sealdate") + self.ldsseal_temple = self.top.get_widget("sealtemple") + self.ldssealplace = self.top.get_widget("lds_seal_place") self.ldsseal_date.set_editable(not self.db.readonly) self.ldsseal_temple.set_sensitive(not self.db.readonly) self.ldssealplace.set_editable(not self.db.readonly) - self.ldsseal_date_led = self.get_widget("seal_stat") + self.ldsseal_date_led = self.top.get_widget("seal_stat") self.ldsseal_date_led.set_sensitive(not self.db.readonly) self.ldsseal_date_check = DateEdit.DateEdit( self.lds_sealing.get_date_object(), self.ldsseal_date, self.ldsseal_date_led, self.window) - self.ldsseal_fam = self.get_widget("sealparents") + self.ldsseal_fam = self.top.get_widget("sealparents") self.ldsseal_fam.set_sensitive(not self.db.readonly) - self.ldsbapstat = self.get_widget("ldsbapstat") + self.ldsbapstat = self.top.get_widget("ldsbapstat") self.ldsbapstat.set_sensitive(not self.db.readonly) - self.ldssealstat = self.get_widget("sealstat") + self.ldssealstat = self.top.get_widget("sealstat") self.ldssealstat.set_sensitive(not self.db.readonly) @@ -1033,10 +1004,6 @@ class EditPerson: def menu_changed(self,obj): self.ldsfam = self.lds_fam_list[obj.get_active()] - 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""" self.ntree.clear() @@ -1195,20 +1162,6 @@ class EditPerson: AttrEdit.AttributeEditor( self,None,pname, attr_list, self.attr_edit_callback,self.window) - def on_up_clicked(self,obj): - sel = obj.get_selection() - store,node = sel.get_selected() - if node: - row = store.get_path(node) - sel.select_path((row[0]-1)) - - def on_down_clicked(self,obj): - sel = obj.get_selection() - store,node = sel.get_selected() - if node: - row = store.get_path(node) - sel.select_path((row[0]+1)) - def on_event_add_clicked(self,obj): """Brings up the EventEditor for a new event""" import EventEdit @@ -1287,7 +1240,6 @@ class EditPerson: """Attempts to display the selected URL in a web browser""" text = obj.get() if text: - import GrampsDisplay GrampsDisplay.url(text) def on_cancel_edit(self,obj): @@ -2049,8 +2001,8 @@ class EditPerson: def write_primary_name(self): # initial values name = '%s' % self.nd.display(self.person) - self.get_widget("activepersonTitle").set_text(name) - self.get_widget("activepersonTitle").set_use_markup(True) + self.top.get_widget("activepersonTitle").set_text(name) + self.top.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()) diff --git a/gramps2/src/EditPlace.py b/gramps2/src/EditPlace.py index 3d2c800e4..eb512c78b 100644 --- a/gramps2/src/EditPlace.py +++ b/gramps2/src/EditPlace.py @@ -52,6 +52,7 @@ import Spell import GrampsDisplay from DdTargets import DdTargets +from WindowUtils import GladeIf #------------------------------------------------------------------------- # @@ -85,6 +86,8 @@ class EditPlace: self.srcreflist = [] self.top_window = gtk.glade.XML(const.placesFile,"placeEditor","gramps") + self.gladeif = GladeIf(self.top_window) + self.top = self.top_window.get_widget("placeEditor") self.iconlist = self.top_window.get_widget('iconlist') title_label = self.top_window.get_widget('title') @@ -192,26 +195,23 @@ class EditPlace: if self.place.get_media_list(): Utils.bold_label(self.gallery_label) - self.top_window.signal_autoconnect({ - "on_switch_page" : self.on_switch_page, - "on_addphoto_clicked" : self.glry.on_add_media_clicked, - "on_selectphoto_clicked" : self.glry.on_select_media_clicked, - "on_deletephoto_clicked" : self.glry.on_delete_media_clicked, - "on_edit_photo_clicked" : self.glry.on_edit_media_clicked, - "on_edit_properties_clicked": self.glry.popup_change_description, - "on_add_url_clicked" : self.on_add_url_clicked, - "on_delete_url_clicked" : self.on_delete_url_clicked, - "on_update_url_clicked" : self.on_update_url_clicked, - "on_add_loc_clicked" : self.on_add_loc_clicked, - "on_delete_loc_clicked" : self.on_delete_loc_clicked, - "on_update_loc_clicked" : self.on_update_loc_clicked, - "on_web_go_clicked" : self.on_web_go_clicked, - "on_help_clicked" : self.on_help_clicked, - "on_delete_event" : self.on_delete_event, - "on_cancel_clicked" : self.close, - "on_apply_clicked" : self.on_place_apply_clicked, - }) - + self.gladeif.connect('placeEditor', 'delete_event', self.on_delete_event) + self.gladeif.connect('button127', 'clicked', self.close) + self.gladeif.connect('ok', 'clicked', self.on_place_apply_clicked) + self.gladeif.connect('button135', 'clicked', self.on_help_clicked) + self.gladeif.connect('notebook3', 'switch_page', self.on_switch_page) + self.gladeif.connect('add_name', 'clicked', self.on_add_loc_clicked) + self.gladeif.connect('loc_edit', 'clicked', self.on_update_loc_clicked) + self.gladeif.connect('del_name', 'clicked', self.on_delete_loc_clicked) + self.gladeif.connect('add_photo', 'clicked', self.glry.on_add_media_clicked) + self.gladeif.connect('sel_photo', 'clicked', self.glry.on_select_media_clicked) + self.gladeif.connect('button134', 'clicked', self.glry.on_edit_media_clicked) + self.gladeif.connect('delete_photo', 'clicked', self.glry.on_delete_media_clicked) + self.gladeif.connect('add_url', 'clicked', self.on_add_url_clicked) + self.gladeif.connect('web_edit', 'clicked', self.on_update_url_clicked) + self.gladeif.connect('web_go', 'clicked', self.on_web_go_clicked) + self.gladeif.connect('del_url', 'clicked', self.on_delete_url_clicked) + self.sourcetab = Sources.SourceTab( self.srcreflist,self, self.top_window,self.top,self.slist, @@ -265,6 +265,7 @@ class EditPlace: cursor.close() def on_delete_event(self,obj,b): + self.gladeif.close() self.glry.close() self.close_child_windows() self.remove_itself_from_menu() @@ -274,6 +275,7 @@ class EditPlace: self.glry.close() self.close_child_windows() self.remove_itself_from_menu() + self.gladeif.close() self.top.destroy() gc.collect() diff --git a/gramps2/src/GenericFilter.py b/gramps2/src/GenericFilter.py index a793fd8a2..95ed6515b 100644 --- a/gramps2/src/GenericFilter.py +++ b/gramps2/src/GenericFilter.py @@ -39,7 +39,7 @@ from xml.sax import make_parser,handler,SAXParseException import os import sets from gettext import gettext as _ -from Utils import strip_context as __ +from TransUtils import strip_context as __ #------------------------------------------------------------------------- # diff --git a/gramps2/src/Makefile.am b/gramps2/src/Makefile.am index dae12349e..1bc315b3c 100644 --- a/gramps2/src/Makefile.am +++ b/gramps2/src/Makefile.am @@ -125,7 +125,9 @@ gdir_PYTHON = \ WriteGrdb.py\ Options.py\ Tool.py\ - Spell.py + TransUtils.py\ + Spell.py\ + WindowUtils.py # Could use GNU make's ':=' syntax for nice wildcard use. # If not using GNU make, then list all files individually diff --git a/gramps2/src/Marriage.py b/gramps2/src/Marriage.py index 53bcd657d..d305ecec5 100644 --- a/gramps2/src/Marriage.py +++ b/gramps2/src/Marriage.py @@ -120,10 +120,6 @@ class Marriage: self.top.signal_autoconnect({ "destroy_passed_object" : self.on_cancel_edit, "on_help_marriage_editor" : self.on_help_clicked, - "on_up_clicked" : self.on_up_clicked, - "on_down_clicked" : self.on_down_clicked, - "on_attr_up_clicked" : self.on_attr_up_clicked, - "on_attr_down_clicked" : self.on_attr_down_clicked, "on_add_attr_clicked" : self.on_add_attr_clicked, "on_delete_attr_clicked" : self.on_delete_attr_clicked, "on_addphoto_clicked" : self.gallery.on_add_media_clicked, @@ -427,40 +423,6 @@ class Marriage: self.family.set_lds_sealing(lds_ord) NoteEdit.NoteEditor(lds_ord,self,self.window,readonly=self.db.readonly) - def on_up_clicked(self,obj): - model,node = self.etree.get_selected() - if not node: - return - - row = self.etree.get_row(node) - if row != 0: - self.etree.select_row(row-1) - - def on_down_clicked(self,obj): - model,node = self.etree.get_selected() - if not node: - return - - row = self.etree.get_row(node) - self.etree.select_row(row+1) - - def on_attr_up_clicked(self,obj): - model,node = self.atree.get_selected() - if not node: - return - - row = self.atree.get_row(node) - if row != 0: - self.atree.select_row(row-1) - - def on_attr_down_clicked(self,obj): - model,node = self.atree.get_selected() - if not node: - return - - row = self.atree.get_row(node) - self.atree.select_row(row+1) - def ev_dest_drag_data_received(self,widget,context,x,y,selection_data,info,time): row = self.etree.get_row_at(x,y) if selection_data and selection_data.data: diff --git a/gramps2/src/Relationship.py b/gramps2/src/Relationship.py index 779568a35..570a487e8 100644 --- a/gramps2/src/Relationship.py +++ b/gramps2/src/Relationship.py @@ -29,7 +29,7 @@ import RelLib import types from gettext import gettext as _ -from Utils import strip_context as __ +from TransUtils import strip_context as __ #------------------------------------------------------------------------- # diff --git a/gramps2/src/Sources.py b/gramps2/src/Sources.py index ff4366ec3..6e3ad9b19 100644 --- a/gramps2/src/Sources.py +++ b/gramps2/src/Sources.py @@ -55,6 +55,7 @@ import GrampsDisplay import Spell from DdTargets import DdTargets +from WindowUtils import GladeIf #------------------------------------------------------------------------- # @@ -81,21 +82,21 @@ class SourceSelector: self.list.append(RelLib.SourceRef(s)) self.update=update self.top = gtk.glade.XML(const.srcselFile,"sourcesel","gramps") + self.gladeif = GladeIf(self.top) + self.window = self.top.get_widget("sourcesel") Utils.set_titles(self.window, self.top.get_widget('title'), _('Source Reference Selection')) - - self.top.signal_autoconnect({ - "on_add_src_clicked" : self.add_src_clicked, - "on_del_src_clicked" : self.del_src_clicked, - "on_edit_src_clicked" : self.edit_src_clicked, - "on_help_srcsel_clicked" : self.on_help_clicked, - "on_cancel_srcsel_clicked" : self.close, - "on_ok_srcsel_clicked" : self.src_ok_clicked, - "on_srcsel_delete_event" : self.on_delete_event, - }) + self.gladeif.connect('sourcesel', 'delete_event', self.on_delete_event) + self.gladeif.connect('button138','clicked', self.close) + self.gladeif.connect('ok', 'clicked', self.src_ok_clicked) + self.gladeif.connect('button145', 'clicked', self.on_help_clicked) + self.gladeif.connect('add', 'clicked', self.add_src_clicked) + self.gladeif.clicked('edit', 'clicked', self.edit_src_clicked) + self.gladeif.clicked('delete', 'clicked', self.del_src_clicked) + self.slist = self.top.get_widget("slist") self.edit = self.top.get_widget('edit') self.delete = self.top.get_widget('delete') @@ -129,6 +130,7 @@ class SourceSelector: self.window.show() def on_delete_event(self,obj,b): + self.gladeif.close() self.close_child_windows() self.remove_itself_from_menu() gc.collect() @@ -136,6 +138,7 @@ class SourceSelector: def close(self,obj): self.close_child_windows() self.remove_itself_from_menu() + self.gladeif.close() self.window.destroy() gc.collect() diff --git a/gramps2/src/Spell.py b/gramps2/src/Spell.py index 44bb9530c..56a201d9e 100644 --- a/gramps2/src/Spell.py +++ b/gramps2/src/Spell.py @@ -29,6 +29,8 @@ present, we default to no spell checking. import GrampsKeys +from gettext import gettext as _ + #----------------------------------------------------------- # # Attempt to instantiate a gtkspell instance to check for diff --git a/gramps2/src/TransUtils.py b/gramps2/src/TransUtils.py new file mode 100644 index 000000000..4aba616d0 --- /dev/null +++ b/gramps2/src/TransUtils.py @@ -0,0 +1,42 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2000-2005 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 +# + +def strip_context(msgid,sep='|'): + """ + Strip the context used for resolving translation ambiguities. + + The translation of msgid is returned unless the translation is + not available and the msgid contains the separator. In that case, + the returned value is the portion of msgid following the last + separator. Default separator is '|'. + + @param msgid: The string to translated. + @type msgid: unicode + @param sep: The separator marking the context. + @type sep: unicode + @return: Translation or the original with context stripped. + @rtype: unicode + + """ + msgval = _(msgid) + sep_idx = msgid.rfind(sep) + if msgval == msgid and sep_idx != -1: + msgval = msgid[sep_idx+1:] + return msgval diff --git a/gramps2/src/Utils.py b/gramps2/src/Utils.py index a41d82103..1d4fa5ce2 100644 --- a/gramps2/src/Utils.py +++ b/gramps2/src/Utils.py @@ -778,29 +778,6 @@ def get_type_converter_by_name(val_str): return unicode return unicode -def strip_context(msgid,sep='|'): - """ - Strip the context used for resolving translation ambiguities. - - The translation of msgid is returned unless the translation is - not available and the msgid contains the separator. In that case, - the returned value is the portion of msgid following the last - separator. Default separator is '|'. - - @param msgid: The string to translated. - @type msgid: unicode - @param sep: The separator marking the context. - @type sep: unicode - @return: Translation or the original with context stripped. - @rtype: unicode - - """ - msgval = _(msgid) - sep_idx = msgid.rfind(sep) - if msgval == msgid and sep_idx != -1: - msgval = msgid[sep_idx+1:] - return msgval - class ProgressMeter: """ Progress meter class for GRAMPS. diff --git a/gramps2/src/WindowUtils.py b/gramps2/src/WindowUtils.py new file mode 100644 index 000000000..b39156ee7 --- /dev/null +++ b/gramps2/src/WindowUtils.py @@ -0,0 +1,36 @@ +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2000-2005 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 +# + +class GladeIf: + def __init__(self,top): + self.top = top + self.sigs = [] + + def connect(self,wname,sname,func): + w = self.top.get_widget(wname) + sig = w.connect(sname, func) + self.sigs.append((sig,w)) + + def close(self): + for s,w in self.sigs: + w.disconnect(s) + + def get_widget(self,name): + return self.top.get_widget(name) diff --git a/gramps2/src/gramps.glade b/gramps2/src/gramps.glade index 88a1f0e82..cdd6d9ced 100644 --- a/gramps2/src/gramps.glade +++ b/gramps2/src/gramps.glade @@ -6530,7 +6530,6 @@ Other GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST False - @@ -6554,7 +6553,6 @@ Other GTK_RELIEF_NORMAL True 0 - @@ -6570,7 +6568,6 @@ Other GTK_RELIEF_NORMAL True 0 - @@ -6584,7 +6581,6 @@ Other GTK_RELIEF_NORMAL True -11 - @@ -6626,7 +6622,6 @@ Other GTK_POS_TOP False False - @@ -6934,7 +6929,6 @@ Other False False True - 0 @@ -6955,7 +6949,6 @@ Other False True genderMale - 0 @@ -6976,7 +6969,6 @@ Other False True genderMale - 0 @@ -7138,7 +7130,6 @@ Other True * False - 2 @@ -7177,7 +7168,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -7432,7 +7422,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -7590,7 +7579,6 @@ Other True GTK_RELIEF_NONE True - @@ -7626,7 +7614,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -8267,7 +8254,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -8296,7 +8282,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -8324,7 +8309,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -8846,7 +8830,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -8875,7 +8858,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -8903,7 +8885,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -9288,7 +9269,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -9317,7 +9297,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -9345,7 +9324,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -9996,7 +9974,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10025,7 +10002,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10053,7 +10029,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10491,7 +10466,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10519,7 +10493,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10547,7 +10520,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10574,7 +10546,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10823,7 +10794,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10852,7 +10822,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10879,7 +10848,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -10908,7 +10876,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -11066,7 +11033,6 @@ Other True GTK_RELIEF_NORMAL True - 3 @@ -11135,7 +11101,6 @@ Other True GTK_RELIEF_NORMAL True - 3 @@ -11280,7 +11245,6 @@ Other True GTK_RELIEF_NORMAL True - 3 @@ -11300,7 +11264,6 @@ Other True GTK_RELIEF_NORMAL True - 3 @@ -11369,7 +11332,6 @@ Other True GTK_RELIEF_NORMAL True - 3 @@ -11438,7 +11400,6 @@ Other True GTK_RELIEF_NORMAL True - 3 @@ -13941,7 +13902,6 @@ Other GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST False - @@ -13964,7 +13924,6 @@ Other GTK_RELIEF_NORMAL True -6 - @@ -13979,7 +13938,6 @@ Other GTK_RELIEF_NORMAL True -5 - @@ -13993,7 +13951,6 @@ Other GTK_RELIEF_NORMAL True -11 - @@ -14041,7 +13998,6 @@ Other GTK_POS_TOP False False - @@ -15071,7 +15027,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -15098,7 +15053,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -15124,7 +15078,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -15588,7 +15541,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -15616,7 +15568,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -15644,7 +15595,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -15671,7 +15621,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -15931,7 +15880,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -15958,7 +15906,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -15984,7 +15931,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -16011,7 +15957,6 @@ Other True GTK_RELIEF_NORMAL True - @@ -18579,7 +18524,6 @@ Very High GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST False - @@ -18602,7 +18546,6 @@ Very High GTK_RELIEF_NORMAL True -6 - @@ -18616,7 +18559,6 @@ Very High GTK_RELIEF_NORMAL True -5 - @@ -18630,7 +18572,6 @@ Very High GTK_RELIEF_NORMAL True -11 - @@ -18715,7 +18656,6 @@ Very High True GTK_RELIEF_NORMAL True - @@ -18742,7 +18682,6 @@ Very High True GTK_RELIEF_NORMAL True - @@ -18768,7 +18707,6 @@ Very High True GTK_RELIEF_NORMAL True -