From 9310d5c32dff520bd345dc5bf7d539a67f840f1f Mon Sep 17 00:00:00 2001 From: Benny Malengier Date: Sun, 2 Jun 2013 15:20:08 +0000 Subject: [PATCH] GEP 18: * fixes in template handling * add source text to overview tab of source svn: r22471 --- gramps/gen/lib/srctemplate.py | 126 ++++++++++++++++++---- gramps/gui/editors/displaytabs/notetab.py | 5 +- gramps/gui/editors/editsource.py | 51 ++++++++- gramps/gui/glade/editsource.glade | 43 +++++++- gramps/gui/widgets/srctemplatetreeview.py | 4 - 5 files changed, 199 insertions(+), 30 deletions(-) diff --git a/gramps/gen/lib/srctemplate.py b/gramps/gen/lib/srctemplate.py index c3bebfee9..5e392c964 100644 --- a/gramps/gen/lib/srctemplate.py +++ b/gramps/gen/lib/srctemplate.py @@ -101,8 +101,16 @@ class SrcTemplate(object): self.refS = None # attrmap will hold mapping of field to normal value and short value # short value will be None if not given + # map is field -> (normal value for ref L, + # normal value for ref F/S, short value ref S) self.attrmap = {} + def get_template_key(self): + """ + Obtain the current template key used + """ + return self.template_key + def set_template_key(self, template_key): """ Change to the new template key for reference styling @@ -123,17 +131,22 @@ class SrcTemplate(object): print ('SrcTemplate: Keyerror "', template_key, '", custom templates templates not implemented?') raise NotImplementedError + self.template_key = template_key - def set_attr_list(self, attr_list): + def set_attr_list(self, attr_list, attr_list_citation=None): """ - Set the attribute list of this template. Setting once for difference - references saves some time + Set the attribute list of this template. Setting once for different + references saves some time. + attr_list should be the source attribute list + If citation given, citation attributes overrule source attributes for + the Full and Short references """ self.empty() self.attr_list = attr_list or [] + self.attr_list_cite = attr_list_citation or [] # store attributes in a dict last to first. this overwrites data so first # attribute will be the one taken if duplicates are present - for attr in attr_list[::-1]: + for attr in self.attr_list[::-1]: lower = False typ = attr.get_type() key = int(typ) @@ -146,15 +159,50 @@ class SrcTemplate(object): key = str(typ) if key in self.attrmap: if lower: - self.attrmap[key] = (self.attrmap[key][0], attr.get_value()) + self.attrmap[key] = (self.attrmap[key][0], + self.attrmap[key][0], attr.get_value()) else: - self.attrmap[key] = (attr.get_value(), self.attrmap[key][1]) + self.attrmap[key] = (attr.get_value(), + attr.get_value(), self.attrmap[key][1]) else: if lower: #store also in normal already value of short - self.attrmap[key] = (attr.get_value(), attr.get_value()) + self.attrmap[key] = (attr.get_value(), + attr.get_value(), attr.get_value()) else: - self.attrmap[key] = (attr.get_value(), None) + self.attrmap[key] = (attr.get_value(), + attr.get_value(), None) + + for attr in self.attr_list_cite[::-1]: + #we do same for citation information, but only update last two + # values of the attrmap + lower = False + typ = attr.get_type() + key = int(typ) + keystr = typ.xml_str().lower() + if keystr.lower().endswith(' (short)'): + #a shorter version, we store with base type + key = int(SrcAttributeType(keystr[:-8])) + lower = True + if key == SrcAttributeType.CUSTOM: + key = str(typ) + if key in self.attrmap: + if lower: + self.attrmap[key] = (self.attrmap[key][0], + self.attrmap[key][2], attr.get_value()) + else: + self.attrmap[key] = (self.attrmap[key][0], + attr.get_value(), self.attrmap[key][3]) + else: + #field only present in citation. + if lower: + #store also in normal already value of short, keep None + #for source fields + self.attrmap[key] = (None, + attr.get_value(), attr.get_value()) + else: + self.attrmap[key] = (None, + attr.get_value(), None) def reference_L(self, attr_list=None): """ @@ -205,7 +253,16 @@ class SrcTemplate(object): # ('', DATE, ' -', EMPTY, False, False, EMPTY, EMPTY), # ('', PAGE6S9, '.', EMPTY, False, False, EMPTY, EMPTY), # ] + + #set col of attrmap to use: + if reftype == REF_TYPE_L: + COL_NORMAL = 0 + COL_SHORT = 2 + else: + COL_NORMAL = 1 + COL_SHORT = 2 ref = [''] + fieldadded = [False] for (ldel, field, rdel, style, priv, opt, short, gedcom) in reflist: if not gedcomfield is None and gedcom != gedcomfield: continue @@ -213,6 +270,7 @@ class SrcTemplate(object): #left delimiter if ldel in ['(', '[', '{']: ref += [''] + fieldadded += [False] ref[-1] += ldel ldeltodo = '' else: @@ -221,42 +279,67 @@ class SrcTemplate(object): #field field = '' if val is not None: - if reftype == REF_TYPE_S and val[1] is not None: + if reftype == REF_TYPE_S and val[COL_SHORT] is not None: customshort = True - field = val[1] + field = val[COL_SHORT] else: - field = val[0] + field = val[COL_NORMAL] if short and not customshort: #we apply the shortening algorithm ## TODO: not implemented yet pass - if field: - ref[-1] += ldeltodo + field + if field.strip(): + fieldadded[-1] = True + ref[-1] += ldeltodo + if len(ref[-1]) and ref[-1][-1] == '.': + ref[-1] += ' ' + field.capitalize() + elif len(ref[-1]) and ref[-1][-1] in [',', ':', '-']: + ref[-1] += ' ' + field + else: + ref[-1] += field #right delimiter if ')' in rdel: if len(ref[-1] [ref[-1].find('('):]) > 0 : newval = ref[-1] + rdel ref = ref[:-1] + fieldadded = fieldadded[:-1] + fieldadded[-1] = True ref[-1] += newval else: #no data inside of delimiter, we remove it entirely ref = ref[:-1] + fieldadded = fieldadded[:-1] + #if . at end of rdel, add it + if rdel[-1] == '.': + ref[-1] = ref[-1] + '.' elif ']' in rdel: - if len(ref[-1] [ref[-1].find(']'):]) > 0 : + if len(ref[-1] [ref[-1].find('['):]) > 0 : newval = ref[-1] + rdel ref = ref[:-1] + fieldadded = fieldadded[:-1] + fieldadded[-1] = True ref[-1] += newval else: #no data inside of delimiter, we remove it entirely ref = ref[:-1] + fieldadded = fieldadded[:-1] + #if . at end of rdel, add it + if rdel[-1] == '.': + ref[-1] = ref[-1] + '.' elif '}' in rdel: - if len(ref[-1] [ref[-1].find('}'):]) > 0 : + if len(ref[-1] [ref[-1].find('{'):]) > 0 : newval = ref[-1] + rdel ref = ref[:-1] + fieldadded = fieldadded[:-1] + fieldadded[-1] = True ref[-1] += newval else: #no data inside of delimiter, we remove it entirely ref = ref[:-1] + fieldadded = fieldadded[:-1] + #if . at end of rdel, add it + if rdel[-1] == '.': + ref[-1] = ref[-1] + '.' else: # we add rdel if not ref[-1]: @@ -270,19 +353,26 @@ class SrcTemplate(object): ref[-1] = ref[-1][:-1] + rdel else: ref[-1] = ref[-1] + rdel + #we only add delimiters after this if new fields are added + fieldadded[-1] = False elif len(rdel) and rdel[0] == ',': curval = ref[-1] if len(curval) and curval[-1] == '.': pass elif len(curval) and curval[-1] == ',': pass - else: + elif fieldadded[-1]: ref[-1] = ref[-1] + rdel + #we only add delimiters after this if new fields are added + fieldadded[-1] = False else: - ref[-1] = ref[-1] + rdel + if fieldadded[-1]: + ref[-1] = ref[-1] + rdel + #we only add delimiters after this if new fields are added + fieldadded[-1] = False ref = ''.join(ref) - return ref + return ref.capitalize() def author_gedcom(self, attr_list=None): if attr_list: diff --git a/gramps/gui/editors/displaytabs/notetab.py b/gramps/gui/editors/displaytabs/notetab.py index 61e63d8c3..8617716ac 100644 --- a/gramps/gui/editors/displaytabs/notetab.py +++ b/gramps/gui/editors/displaytabs/notetab.py @@ -81,10 +81,11 @@ class NoteTab(EmbeddedList, DbGUIElement): ] def __init__(self, dbstate, uistate, track, data, callertitle=None, - notetype=None): + notetype=None, callback_notebase_changed=None): self.data = data self.callertitle = callertitle self.notetype = notetype + self.callback_notebase_changed = callback_notebase_changed EmbeddedList.__init__(self, dbstate, uistate, track, _("_Notes"), NoteModel, share_button=True, move_buttons=True) @@ -150,6 +151,8 @@ class NoteTab(EmbeddedList, DbGUIElement): self.changed = True self.rebuild() GObject.idle_add(self.tree.scroll_to_cell, len(data) - 1) + if self.callback_notebase_changed: + self.callback_notebase_changed() def edit_button_clicked(self, obj): """ diff --git a/gramps/gui/editors/editsource.py b/gramps/gui/editors/editsource.py index 051944d65..6de9d9dcb 100644 --- a/gramps/gui/editors/editsource.py +++ b/gramps/gui/editors/editsource.py @@ -70,7 +70,8 @@ from ..glade import Glade class EditSource(EditPrimary): def __init__(self, dbstate, uistate, track, source): - + self.srctemp = None + self.citation = None EditPrimary.__init__(self, dbstate, uistate, track, source, dbstate.db.get_source_from_handle, dbstate.db.get_source_from_gramps_id) @@ -162,6 +163,10 @@ class EditSource(EditPrimary): """ self._add_db_signal('source-rebuild', self._do_close) self._add_db_signal('source-delete', self.check_for_close) + self._add_db_signal('note-delete', self.update_notes) + self._add_db_signal('note-update', self.update_notes) + self._add_db_signal('note-add', self.update_notes) + self._add_db_signal('note-rebuild', self.update_notes) def _setup_fields(self): ## self.author = MonitoredEntry(self.glade.get_object("author"), @@ -172,8 +177,13 @@ class EditSource(EditPrimary): ## self.obj.set_publication_info, ## self.obj.get_publication_info, ## self.db.readonly) + #reference info fields + self.refL = self.glade.get_object("refL") + self.refF = self.glade.get_object("refF") + self.refS = self.glade.get_object("refS") self.author = self.glade.get_object("author") self.pubinfo = self.glade.get_object("pubinfo") + self.source_text = self.glade.get_object("source_text") self.gid = MonitoredEntry(self.glade.get_object("gid"), self.obj.set_gramps_id, @@ -200,13 +210,31 @@ class EditSource(EditPrimary): self.db.readonly) self.update_attr() + self.update_notes() def update_attr(self): """ Reaction to update on attributes """ - self.author.set_text(self.obj.get_author()) - self.pubinfo.set_text(self.obj.get_publication_info()) + #we only construct once the template to use to format information + if self.srctemp is None: + self.srctemp = SrcTemplate(self.obj.get_source_template()[0]) + #if source template changed, reinit template + if self.obj.get_source_template()[0] != self.srctemp.get_template_key(): + self.srctemp.set_template_key(self.obj.get_source_template()[0]) + #set new attrlist in template + self.srctemp.set_attr_list(self.obj.get_attribute_list()) + + #set fields with the template + self.refL.set_text(self.srctemp.reference_L()) + if self.citation: + self.refF.set_text(self.srctemp.reference_F()) + self.refS.set_text(self.srctemp.reference_S()) + else: + self.refF.set_text(_("")) + self.refS.set_text(_("")) + self.author.set_text(self.srctemp.author_gedcom()) + self.pubinfo.set_text(self.srctemp.pubinfo_gedcom()) def update_template_data(self): """ @@ -216,6 +244,20 @@ class EditSource(EditPrimary): self.attr_tab.rebuild_callback() self.update_attr() + def update_notes(self, *par): + """ + Change the source text on the overview page when notebase of the source + changed + """ + note_list = [ self.db.get_note_from_handle(h) + for h in self.obj.get_note_list() ] + note_list = [ n for n in note_list + if n.get_type() == NoteType.SOURCE_TEXT] + ref_text = "" + for note in note_list: + ref_text += note_list[0].get() + "\n" + self.source_text.get_buffer().set_text(ref_text) + def _create_tabbed_pages(self): notebook = self.glade.get_object('notebook') gridsrc = self.glade.get_object('gridsrc') @@ -240,7 +282,8 @@ class EditSource(EditPrimary): self.track, self.obj.get_note_list(), self.get_menu_title(), - NoteType.SOURCE) + NoteType.SOURCE, + callback_notebase_changed=self.update_notes) self._add_tab(notebook, self.note_tab) self.track_ref_for_deletion("note_tab") diff --git a/gramps/gui/glade/editsource.glade b/gramps/gui/glade/editsource.glade index c7ddc6240..d1bff1d67 100644 --- a/gramps/gui/glade/editsource.glade +++ b/gramps/gui/glade/editsource.glade @@ -308,7 +308,7 @@ start 0 0 - In List: + Listing: 0 @@ -352,7 +352,7 @@ - + True False start @@ -369,7 +369,7 @@ - + True False start @@ -543,6 +543,43 @@ 1 + + + True + True + True + + + True + True + True + in + + + True + True + False + word + + + + + + + True + False + <b>Source Text</b> + True + + + + + 0 + 7 + 4 + 1 + + diff --git a/gramps/gui/widgets/srctemplatetreeview.py b/gramps/gui/widgets/srctemplatetreeview.py index d549610f7..78d6e9d73 100644 --- a/gramps/gui/widgets/srctemplatetreeview.py +++ b/gramps/gui/widgets/srctemplatetreeview.py @@ -96,9 +96,6 @@ class SrcTemplateTreeView(Gtk.TreeView): lastval = vals[-2] if not lastval: lastval = vals[-3] - if vals[0] == 'All': - print lastval - print vals truevals = ['','',''] if len(vals) < 3 : truevals[:len(vals)] = vals[:] @@ -128,7 +125,6 @@ class SrcTemplateTreeView(Gtk.TreeView): #only new sublevel1 needed parentiterlev1 = self.model.append(None, [-10, '', vals[0]]) parentiter = parentiterlev1 - print 'here', row, alltext iter = self.model.append(parentiter, row) else: #only a top level