GEP 18: * fixes in template handling

* add source text to overview tab of source


svn: r22471
This commit is contained in:
Benny Malengier 2013-06-02 15:20:08 +00:00
parent 6e2272bb78
commit 9310d5c32d
5 changed files with 199 additions and 30 deletions

View File

@ -101,8 +101,16 @@ class SrcTemplate(object):
self.refS = None self.refS = None
# attrmap will hold mapping of field to normal value and short value # attrmap will hold mapping of field to normal value and short value
# short value will be None if not given # 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 = {} self.attrmap = {}
def get_template_key(self):
"""
Obtain the current template key used
"""
return self.template_key
def set_template_key(self, template_key): def set_template_key(self, template_key):
""" """
Change to the new template key for reference styling Change to the new template key for reference styling
@ -123,17 +131,22 @@ class SrcTemplate(object):
print ('SrcTemplate: Keyerror "', template_key, print ('SrcTemplate: Keyerror "', template_key,
'", custom templates templates not implemented?') '", custom templates templates not implemented?')
raise NotImplementedError 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 Set the attribute list of this template. Setting once for different
references saves some time 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.empty()
self.attr_list = attr_list or [] 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 # store attributes in a dict last to first. this overwrites data so first
# attribute will be the one taken if duplicates are present # 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 lower = False
typ = attr.get_type() typ = attr.get_type()
key = int(typ) key = int(typ)
@ -146,15 +159,50 @@ class SrcTemplate(object):
key = str(typ) key = str(typ)
if key in self.attrmap: if key in self.attrmap:
if lower: 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: 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: else:
if lower: if lower:
#store also in normal already value of short #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: 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): def reference_L(self, attr_list=None):
""" """
@ -205,7 +253,16 @@ class SrcTemplate(object):
# ('', DATE, ' -', EMPTY, False, False, EMPTY, EMPTY), # ('', DATE, ' -', EMPTY, False, False, EMPTY, EMPTY),
# ('', PAGE6S9, '.', 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 = [''] ref = ['']
fieldadded = [False]
for (ldel, field, rdel, style, priv, opt, short, gedcom) in reflist: for (ldel, field, rdel, style, priv, opt, short, gedcom) in reflist:
if not gedcomfield is None and gedcom != gedcomfield: if not gedcomfield is None and gedcom != gedcomfield:
continue continue
@ -213,6 +270,7 @@ class SrcTemplate(object):
#left delimiter #left delimiter
if ldel in ['(', '[', '{']: if ldel in ['(', '[', '{']:
ref += [''] ref += ['']
fieldadded += [False]
ref[-1] += ldel ref[-1] += ldel
ldeltodo = '' ldeltodo = ''
else: else:
@ -221,42 +279,67 @@ class SrcTemplate(object):
#field #field
field = '' field = ''
if val is not None: 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 customshort = True
field = val[1] field = val[COL_SHORT]
else: else:
field = val[0] field = val[COL_NORMAL]
if short and not customshort: if short and not customshort:
#we apply the shortening algorithm #we apply the shortening algorithm
## TODO: not implemented yet ## TODO: not implemented yet
pass pass
if field: if field.strip():
ref[-1] += ldeltodo + field 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 #right delimiter
if ')' in rdel: if ')' in rdel:
if len(ref[-1] [ref[-1].find('('):]) > 0 : if len(ref[-1] [ref[-1].find('('):]) > 0 :
newval = ref[-1] + rdel newval = ref[-1] + rdel
ref = ref[:-1] ref = ref[:-1]
fieldadded = fieldadded[:-1]
fieldadded[-1] = True
ref[-1] += newval ref[-1] += newval
else: else:
#no data inside of delimiter, we remove it entirely #no data inside of delimiter, we remove it entirely
ref = ref[:-1] ref = ref[:-1]
fieldadded = fieldadded[:-1]
#if . at end of rdel, add it
if rdel[-1] == '.':
ref[-1] = ref[-1] + '.'
elif ']' in rdel: elif ']' in rdel:
if len(ref[-1] [ref[-1].find(']'):]) > 0 : if len(ref[-1] [ref[-1].find('['):]) > 0 :
newval = ref[-1] + rdel newval = ref[-1] + rdel
ref = ref[:-1] ref = ref[:-1]
fieldadded = fieldadded[:-1]
fieldadded[-1] = True
ref[-1] += newval ref[-1] += newval
else: else:
#no data inside of delimiter, we remove it entirely #no data inside of delimiter, we remove it entirely
ref = ref[:-1] ref = ref[:-1]
fieldadded = fieldadded[:-1]
#if . at end of rdel, add it
if rdel[-1] == '.':
ref[-1] = ref[-1] + '.'
elif '}' in rdel: elif '}' in rdel:
if len(ref[-1] [ref[-1].find('}'):]) > 0 : if len(ref[-1] [ref[-1].find('{'):]) > 0 :
newval = ref[-1] + rdel newval = ref[-1] + rdel
ref = ref[:-1] ref = ref[:-1]
fieldadded = fieldadded[:-1]
fieldadded[-1] = True
ref[-1] += newval ref[-1] += newval
else: else:
#no data inside of delimiter, we remove it entirely #no data inside of delimiter, we remove it entirely
ref = ref[:-1] ref = ref[:-1]
fieldadded = fieldadded[:-1]
#if . at end of rdel, add it
if rdel[-1] == '.':
ref[-1] = ref[-1] + '.'
else: else:
# we add rdel # we add rdel
if not ref[-1]: if not ref[-1]:
@ -270,19 +353,26 @@ class SrcTemplate(object):
ref[-1] = ref[-1][:-1] + rdel ref[-1] = ref[-1][:-1] + rdel
else: else:
ref[-1] = ref[-1] + rdel 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] == ',': elif len(rdel) and rdel[0] == ',':
curval = ref[-1] curval = ref[-1]
if len(curval) and curval[-1] == '.': if len(curval) and curval[-1] == '.':
pass pass
elif len(curval) and curval[-1] == ',': elif len(curval) and curval[-1] == ',':
pass pass
else: elif fieldadded[-1]:
ref[-1] = ref[-1] + rdel ref[-1] = ref[-1] + rdel
#we only add delimiters after this if new fields are added
fieldadded[-1] = False
else: 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) ref = ''.join(ref)
return ref return ref.capitalize()
def author_gedcom(self, attr_list=None): def author_gedcom(self, attr_list=None):
if attr_list: if attr_list:

View File

@ -81,10 +81,11 @@ class NoteTab(EmbeddedList, DbGUIElement):
] ]
def __init__(self, dbstate, uistate, track, data, callertitle=None, def __init__(self, dbstate, uistate, track, data, callertitle=None,
notetype=None): notetype=None, callback_notebase_changed=None):
self.data = data self.data = data
self.callertitle = callertitle self.callertitle = callertitle
self.notetype = notetype self.notetype = notetype
self.callback_notebase_changed = callback_notebase_changed
EmbeddedList.__init__(self, dbstate, uistate, track, EmbeddedList.__init__(self, dbstate, uistate, track,
_("_Notes"), NoteModel, share_button=True, _("_Notes"), NoteModel, share_button=True,
move_buttons=True) move_buttons=True)
@ -150,6 +151,8 @@ class NoteTab(EmbeddedList, DbGUIElement):
self.changed = True self.changed = True
self.rebuild() self.rebuild()
GObject.idle_add(self.tree.scroll_to_cell, len(data) - 1) 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): def edit_button_clicked(self, obj):
""" """

View File

@ -70,7 +70,8 @@ from ..glade import Glade
class EditSource(EditPrimary): class EditSource(EditPrimary):
def __init__(self, dbstate, uistate, track, source): def __init__(self, dbstate, uistate, track, source):
self.srctemp = None
self.citation = None
EditPrimary.__init__(self, dbstate, uistate, track, source, EditPrimary.__init__(self, dbstate, uistate, track, source,
dbstate.db.get_source_from_handle, dbstate.db.get_source_from_handle,
dbstate.db.get_source_from_gramps_id) 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-rebuild', self._do_close)
self._add_db_signal('source-delete', self.check_for_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): def _setup_fields(self):
## self.author = MonitoredEntry(self.glade.get_object("author"), ## self.author = MonitoredEntry(self.glade.get_object("author"),
@ -172,8 +177,13 @@ class EditSource(EditPrimary):
## self.obj.set_publication_info, ## self.obj.set_publication_info,
## self.obj.get_publication_info, ## self.obj.get_publication_info,
## self.db.readonly) ## 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.author = self.glade.get_object("author")
self.pubinfo = self.glade.get_object("pubinfo") 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.gid = MonitoredEntry(self.glade.get_object("gid"),
self.obj.set_gramps_id, self.obj.set_gramps_id,
@ -200,13 +210,31 @@ class EditSource(EditPrimary):
self.db.readonly) self.db.readonly)
self.update_attr() self.update_attr()
self.update_notes()
def update_attr(self): def update_attr(self):
""" """
Reaction to update on attributes Reaction to update on attributes
""" """
self.author.set_text(self.obj.get_author()) #we only construct once the template to use to format information
self.pubinfo.set_text(self.obj.get_publication_info()) 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(_("<no citation loaded>"))
self.refS.set_text(_("<no citation loaded>"))
self.author.set_text(self.srctemp.author_gedcom())
self.pubinfo.set_text(self.srctemp.pubinfo_gedcom())
def update_template_data(self): def update_template_data(self):
""" """
@ -216,6 +244,20 @@ class EditSource(EditPrimary):
self.attr_tab.rebuild_callback() self.attr_tab.rebuild_callback()
self.update_attr() 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): def _create_tabbed_pages(self):
notebook = self.glade.get_object('notebook') notebook = self.glade.get_object('notebook')
gridsrc = self.glade.get_object('gridsrc') gridsrc = self.glade.get_object('gridsrc')
@ -240,7 +282,8 @@ class EditSource(EditPrimary):
self.track, self.track,
self.obj.get_note_list(), self.obj.get_note_list(),
self.get_menu_title(), self.get_menu_title(),
NoteType.SOURCE) NoteType.SOURCE,
callback_notebase_changed=self.update_notes)
self._add_tab(notebook, self.note_tab) self._add_tab(notebook, self.note_tab)
self.track_ref_for_deletion("note_tab") self.track_ref_for_deletion("note_tab")

View File

@ -308,7 +308,7 @@
<property name="valign">start</property> <property name="valign">start</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="yalign">0</property> <property name="yalign">0</property>
<property name="label" translatable="yes">In List:</property> <property name="label" translatable="yes">Listing:</property>
</object> </object>
<packing> <packing>
<property name="left_attach">0</property> <property name="left_attach">0</property>
@ -352,7 +352,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="RefF"> <object class="GtkLabel" id="refF">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="valign">start</property> <property name="valign">start</property>
@ -369,7 +369,7 @@
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkLabel" id="RefS"> <object class="GtkLabel" id="refS">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="valign">start</property> <property name="valign">start</property>
@ -543,6 +543,43 @@
<property name="height">1</property> <property name="height">1</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkExpander" id="expander3">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="expanded">True</property>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="vexpand">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTextView" id="source_text">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="wrap_mode">word</property>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label13">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Source Text&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">7</property>
<property name="width">4</property>
<property name="height">1</property>
</packing>
</child>
<child> <child>
<placeholder/> <placeholder/>
</child> </child>

View File

@ -96,9 +96,6 @@ class SrcTemplateTreeView(Gtk.TreeView):
lastval = vals[-2] lastval = vals[-2]
if not lastval: if not lastval:
lastval = vals[-3] lastval = vals[-3]
if vals[0] == 'All':
print lastval
print vals
truevals = ['','',''] truevals = ['','','']
if len(vals) < 3 : if len(vals) < 3 :
truevals[:len(vals)] = vals[:] truevals[:len(vals)] = vals[:]
@ -128,7 +125,6 @@ class SrcTemplateTreeView(Gtk.TreeView):
#only new sublevel1 needed #only new sublevel1 needed
parentiterlev1 = self.model.append(None, [-10, '', vals[0]]) parentiterlev1 = self.model.append(None, [-10, '', vals[0]])
parentiter = parentiterlev1 parentiter = parentiterlev1
print 'here', row, alltext
iter = self.model.append(parentiter, row) iter = self.model.append(parentiter, row)
else: else:
#only a top level #only a top level