diff --git a/src/plugins/DefaultGramplets.py b/src/plugins/DefaultGramplets.py
index 41c5f0cda..f558014e2 100644
--- a/src/plugins/DefaultGramplets.py
+++ b/src/plugins/DefaultGramplets.py
@@ -20,6 +20,7 @@ import sys
import re
import urllib
import posixpath
+import cgi
from BasicUtils import name_displayer
from DataViews import register, Gramplet
@@ -467,9 +468,22 @@ class PedigreeGramplet(Gramplet):
_("Right-click name to edit person")
self.set_use_markup(True)
self.max_generations = 100
- #self.set_option("max_generations",
- # NumberOption(_("Maximum generations"),
- # 100, -1, 500))
+ self.show_dates = 1
+ self.box_mode = "ASCII"
+
+ def on_load(self):
+ if len(self.gui.data) > 0:
+ self.max_generations = int(self.gui.data[0])
+ if len(self.gui.data) > 1:
+ self.show_dates = int(self.gui.data[1])
+ if len(self.gui.data) > 2:
+ self.box_mode = self.gui.data[2] # ASCII or UTF
+ # in case we need it:
+ tag = self.gui.buffer.create_tag("fixed")
+ tag.set_property("font", "Courier 9")
+
+ def on_save(self):
+ self.gui.data = [self.max_generations, self.show_dates, self.box_mode]
def db_changed(self):
"""
@@ -487,20 +501,33 @@ class PedigreeGramplet(Gramplet):
self.update()
def get_boxes(self, generation, what):
- retval = ""
+ retval = u""
+ if self.box_mode == "UTF":
+ space = u" "
+ elif self.box_mode == "ASCII":
+ space = u" "
+ space_len = len(space) + 2
for i in range(generation+1):
if self._boxes[i]:
- retval += " |"
+ retval += space + u"|"
else:
- retval += " "
- if retval[-1] == ' ':
+ retval += space + u" "
+ if retval[-1] == u' ':
if what == 'sf':
- retval = retval[:-6] + " /"
+ retval = retval[:-space_len] + u"/"
elif what == 'sm':
- retval = retval[:-6] + " \\"
- elif retval.endswith("| |"):
- retval = retval[:-6] + "+"
- return retval + "---"
+ retval = retval[:-space_len] + u"\\"
+ elif retval.endswith(u"|" + space + u"|"):
+ retval = retval[:-space_len] + u"+"
+ if self.box_mode == "UTF":
+ retval += u"-"
+ retval = retval.replace(u"\\", u"\u2514")
+ retval = retval.replace(u"-", u"\u2500")
+ retval = retval.replace(u"|", u"\u2502")
+ retval = retval.replace(u"/", u"\u250c")
+ elif self.box_mode == "ASCII":
+ retval += u"--"
+ return retval
def set_box(self, pos, value):
self._boxes[pos] = value
@@ -525,19 +552,35 @@ class PedigreeGramplet(Gramplet):
elif what[0] == "s":
boxes = self.get_boxes(generation, what)
if what[-1] == 'f':
- boxes = boxes.replace("+", "/")
+ if self.box_mode == "UTF":
+ boxes = boxes.replace("+", u"\u250c")
+ else:
+ boxes = boxes.replace("+", u"/")
else:
- boxes = boxes.replace("+", "\\")
+ if self.box_mode == "UTF":
+ boxes = boxes.replace("+", u"\u2514")
+ else:
+ boxes = boxes.replace("+", u"\\")
self.append_text(boxes)
self.link(name_displayer.display_name(person.get_primary_name()),
- 'Person', person.handle)
+ 'Person', person.handle,
+ tooltip=_("Click to make active\n") + \
+ _("Right-click to edit"))
+ if self.show_dates:
+ self.append_text(" ")
+ self.render_text(self.info_string(person))
self.append_text("\n")
if generation not in self._generations:
self._generations[generation] = []
self._generations[generation].append(handle)
elif what == "a":
- self.append_text("o------")
- self.render_text("%s" % name_displayer.display_name(person.get_primary_name()))
+ if self.box_mode == "UTF":
+ self.append_text(u"o" + (u"\u2500" * 3))
+ elif self.box_mode == "ASCII":
+ self.append_text(u"o---")
+ self.append_text("%s " % name_displayer.display_name(person.get_primary_name()))
+ if self.show_dates:
+ self.render_text(self.info_string(person))
self.append_text("\n")
if generation not in self._generations:
self._generations[generation] = []
@@ -553,11 +596,49 @@ class PedigreeGramplet(Gramplet):
self.process_person(mother, generation + 1, "m")
self.set_box(generation, 0) # regardless, turn off line if on
+ def info_string(self, person):
+ birth = ReportUtils.get_birth_or_fallback(self.dbstate.db, person)
+ if birth and birth.get_type != gen.lib.EventType.BIRTH:
+ sdate = DateHandler.get_date(birth)
+ if sdate:
+ bdate = "%s" % cgi.escape(sdate)
+ else:
+ bdate = ""
+ elif birth:
+ bdate = cgi.escape(DateHandler.get_date(birth))
+ else:
+ bdate = ""
+
+ death = ReportUtils.get_death_or_fallback(self.dbstate.db, person)
+ if death and death.get_type != gen.lib.EventType.DEATH:
+ sdate = DateHandler.get_date(death)
+ if sdate:
+ ddate = "%s" % cgi.escape(sdate)
+ else:
+ ddate = ""
+ elif death:
+ ddate = cgi.escape(DateHandler.get_date(death))
+ else:
+ ddate = ""
+
+ if bdate and ddate:
+ value = _("(b. %(birthdate)s, d. %(deathdate)s)") % {
+ 'birthdate' : bdate,
+ 'deathdate' : ddate
+ }
+ elif bdate:
+ value = _("(b. %s)") % (bdate)
+ elif ddate:
+ value = _("(d. %s)") % (ddate)
+ else:
+ value = ""
+ return value
+
def main(self): # return false finishes
"""
Generator which will be run in the background.
"""
- self._boxes = [0] * self.max_generations
+ self._boxes = [0] * (self.max_generations + 1)
self._generations = {}
self.gui.buffer.set_text("")
active_person = self.dbstate.get_active_person()
@@ -577,15 +658,22 @@ class PedigreeGramplet(Gramplet):
handles = self._generations[g]
self.append_text(" ")
if g == 0:
- self.link(_("Generation 1"), 'PersonList', handles)
+ self.link(_("Generation 1"), 'PersonList', handles,
+ tooltip=_("Double-click to see people in generation"))
self.append_text(_(" has 1 of 1 individual (100.00% complete)\n"))
else:
all.extend(handles)
- self.link(_("Generation %d") % g, 'PersonList', handles)
+ self.link(_("Generation %d") % g, 'PersonList', handles,
+ tooltip=_("Double-click to see people in generation"))
self.append_text(_(" has %d of %d individuals (%.2f%% complete)\n") %
(count, 2**(g-1), float(count)/2**(g-1) * 100))
- self.link(_("All generations"), 'PersonList', all)
+ self.link(_("All generations"), 'PersonList', all,
+ tooltip=_("Double-click to see all generations"))
self.append_text(_(" have %d individuals\n") % len(all))
+ # Set to a fixed font
+ if self.box_mode == "UTF":
+ start, end = self.gui.buffer.get_bounds()
+ self.gui.buffer.apply_tag_by_name("fixed", start, end)
self.append_text("", scroll_to="begin")
class StatsGramplet(Gramplet):