From a091d97677b28f405f10172b3bcd193679aa4f4a Mon Sep 17 00:00:00 2001 From: Benny Malengier Date: Wed, 29 May 2013 18:58:23 +0000 Subject: [PATCH] GEP 18: automatic setting of fields, and updating attribute list svn: r22454 --- .../gui/editors/displaytabs/srctemplatetab.py | 46 ++++++++++++++++++- gramps/gui/widgets/monitoredwidgets.py | 36 ++++++++++----- 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/gramps/gui/editors/displaytabs/srctemplatetab.py b/gramps/gui/editors/displaytabs/srctemplatetab.py index 0c334539a..e4f078c12 100644 --- a/gramps/gui/editors/displaytabs/srctemplatetab.py +++ b/gramps/gui/editors/displaytabs/srctemplatetab.py @@ -42,9 +42,10 @@ from gi.repository import Gtk # #------------------------------------------------------------------------- from gramps.gen.lib.srcattrtype import SrcAttributeType +from gramps.gen.lib.srcattribute import SrcAttribute from ...autocomp import StandardCustomSelector from ...widgets.srctemplatetreeview import SrcTemplateTreeView -from ...widgets import UndoableEntry +from ...widgets import UndoableEntry, MonitoredEntry from .grampstab import GrampsTab #------------------------------------------------------------------------- @@ -141,19 +142,62 @@ class SrcTemplateTab(GrampsTab): self.gridfields.insert_row(row) row += 1 field = fielddef[1] + #setup label srcattr = SrcAttributeType(field) lbl = Gtk.Label(_("%s:") %str(srcattr)) lbl.set_halign(Gtk.Align.START) self.gridfields.attach(lbl, 0, row-1, 1, 1) self.lbls.append(lbl) + #setup entry inpt = UndoableEntry() inpt.set_halign(Gtk.Align.FILL) + inpt.set_hexpand(True) self.gridfields.attach(inpt, 1, row-1, 1, 1) self.inpts.append(inpt) + MonitoredEntry(inpt, self.set_field, self.get_field, + read_only=self.dbstate.db.readonly, + parameter=field) self.show_all() + def get_field(self, srcattrtype): + """ + Obtain srcattribute with type srcattrtype, where srcattrtype is an + integer key! + """ + print 'get field called' + src = self.src + val = '' + for attr in src.attribute_list: + if int(attr.get_type()) == srcattrtype: + val = attr.get_value() + break + return val + def set_field(self, value, srcattrtype): + """ + Set attribute of source of type srcattrtype (which is integer!) to + value. If not present, create attribute. If value == '', remove + """ + print 'set field called', value, srcattrtype + src = self.src + value = value.strip() + foundattr = None + for attr in src.attribute_list: + if int(attr.get_type()) == srcattrtype: + attr.set_value(value) + foundattr = attr + break + if foundattr and value == '': + src.remove_attribute(foundattr) + if foundattr is None and value != '': + foundattr = SrcAttribute() + foundattr.set_type(srcattrtype) + foundattr.set_value(value) + src.add_attribute(foundattr) + #indicate source object changed + self.callback_src_changed() + ## def setup_autocomp_combobox(self): ## """ diff --git a/gramps/gui/widgets/monitoredwidgets.py b/gramps/gui/widgets/monitoredwidgets.py index 059db661a..8a470dc29 100644 --- a/gramps/gui/widgets/monitoredwidgets.py +++ b/gramps/gui/widgets/monitoredwidgets.py @@ -107,20 +107,35 @@ class MonitoredCheckbox(object): class MonitoredEntry(object): def __init__(self, obj, set_val, get_val, read_only=False, - autolist=None, changed=None): + autolist=None, changed=None, parameter=None): + """ + A monitored entry field. On changes, set_val will be called. get_val is + used to obtain the data. set and get_val are passed parameter if it is + not None. + Use autolist to use autocompletion. + """ self.obj = obj - self.set_val = set_val - self.get_val = get_val + self.__set_func(set_val, get_val, parameter) self.changed = changed - if get_val(): - self.obj.set_text(get_val()) + gval = self.get_val(self.parameter) + if gval: + self.obj.set_text(gval) self.obj.connect('changed', self._on_change) self.obj.set_editable(not read_only) if autolist: fill_entry(obj, autolist) + def __set_func(self, set_val, get_val, parameter): + if parameter is not None: + self.set_val = lambda x: set_val(x, parameter) + self.get_val = lambda x: get_val(parameter) + else: + self.set_val = set_val + self.get_val = lambda x: get_val() + self.parameter = parameter + ## def destroy(self): ## """ ## Unset all elements that can prevent garbage collection @@ -129,9 +144,8 @@ class MonitoredEntry(object): ## self.get_val = None ## self.obj = None - def reinit(self, set_val, get_val): - self.set_val = set_val - self.get_val = get_val + def reinit(self, set_val, get_val, parameter=None): + self.__set_func(set_val, get_val, parameter) self.update() def set_text(self, text): @@ -163,8 +177,8 @@ class MonitoredEntry(object): self.obj.grab_focus() def update(self): - if self.get_val() is not None: - self.obj.set_text(self.get_val()) + if self.get_val(None) is not None: + self.obj.set_text(self.get_val(None)) #------------------------------------------------------------------------- # @@ -180,7 +194,7 @@ class MonitoredEntryIndicator(MonitoredEntry): autolist=None, changed=None): MonitoredEntry.__init__(self, obj, set_val, get_val, read_only, autolist, changed) - if get_val(): + if get_val(None): self.indicatorshown = False else: self.indicatorshown = True