Tweaks to graphical tree reports

svn: r16422
This commit is contained in:
Gerald Britton 2011-01-21 14:30:14 +00:00
parent 17bbda50d6
commit e8f9c8422a
3 changed files with 150 additions and 127 deletions

View File

@ -35,11 +35,9 @@ def log2(val):
"""
Calculate the log base 2 of a value.
"""
return int(math.log10(val)/math.log10(2))
return int(math.log(val, 2))
def X_INDEX(level):
""" calculate the row that this person is in """
return log2(level)
X_INDEX = log2
from gen.ggettext import sgettext as _
@ -96,7 +94,7 @@ class AncestorBoxBase(BoxBase):
#Calculate which row in the column of people.
tmp_y = self.level[1] - (2**x_level)
#Calculate which row in the table (yes table) of people.
delta = int((2**max_gen)/(2**(x_level)))
delta = (2**max_gen) // (2**(x_level))
return int((delta/2) + (tmp_y*delta))
class PersonBox(AncestorBoxBase):
@ -117,11 +115,11 @@ class FamilyBox(AncestorBoxBase):
def y_index(self, max_gen):
""" Calculate the column or generation that this person is in. """
x_level = self.level[0] -1
x_level = self.level[0] - 1
#Calculate which row in the column of people.
tmp_y = self.level[1] - (2**x_level)
#Calculate which row in the table (yes table) of people.
delta = int((2**max_gen)/(2**(x_level)))
delta = (2**max_gen) // (2**(x_level))
return int((delta/2) + (tmp_y*delta))
@ -252,8 +250,8 @@ class MakeAncestorTree(object):
myself = PersonBox(index)
myself.text = \
self.calc_items.calc_person(index, indi_handle, fams_handle)
myself.text = self.calc_items.calc_person(
index, indi_handle, fams_handle)
self.canvas.add_box(myself)
@ -266,8 +264,8 @@ class MakeAncestorTree(object):
myself = FamilyBox(index)
#calculate the text.
myself.text = \
self.calc_items.calc_marrage(indi_handle, fams_handle)
myself.text = self.calc_items.calc_marrage(indi_handle, fams_handle)
self.canvas.add_box(myself)
@ -277,9 +275,9 @@ class MakeAncestorTree(object):
return
line = Line(person)
if father is not None:
if father:
line.add_to(father)
if mother is not None:
if mother:
line.add_to(mother)
self.canvas.add_line(line)
@ -295,13 +293,14 @@ class MakeAncestorTree(object):
return None
person = self.database.get_person_from_handle(person_handle)
if person is None:
if not person:
return self.__fill(index, None,
min(self.fill_out, self.max_generations-X_INDEX(index)-1))
min(self.fill_out, self.max_generations-X_INDEX(index)-1)
)
parents_handle = person.get_main_parents_family_handle()
father = marrbox = mother = None
if parents_handle is not None:
if parents_handle:
#note depth first
family = self.database.get_family_from_handle(parents_handle)
father = self.recurse(family.get_father_handle(), parents_handle,
@ -318,7 +317,8 @@ class MakeAncestorTree(object):
self.add_line(mybox, father, mother)
else:
mybox = self.__fill(index, person_handle,
min(self.fill_out, self.max_generations-X_INDEX(index)-1))
min(self.fill_out, self.max_generations-X_INDEX(index)-1)
)
#father = self.__fill(index *2, self.fill_out)
#mybox = self.add_person_box(index, person_handle, family_handle)
#if self.fill_out and self.inlc_marr and (log2(index) + 2) <
@ -368,7 +368,8 @@ class MakeAncestorTree(object):
cur_gen += 1
else:
#found our father. add him
__BOXES[cur_gen] = self.add_person_box(__INDEX[cur_gen], None, None)
__BOXES[cur_gen] = self.add_person_box(
__INDEX[cur_gen], None, None)
###########################
#Step 1.5. Dad has already been made.
@ -376,8 +377,8 @@ class MakeAncestorTree(object):
###########################
#Step 2. add our kid
__BOXES[cur_gen-1] = \
self.add_person_box(__INDEX[cur_gen-1],
__BOXES[cur_gen-1] = self.add_person_box(
__INDEX[cur_gen-1],
person_handle if cur_gen == 1 else None,
None)
@ -402,7 +403,8 @@ class MakeAncestorTree(object):
else:
###########################
#Step 3. Now we can make Mom
__BOXES[cur_gen] = self.add_person_box(__INDEX[cur_gen], None, None)
__BOXES[cur_gen] = self.add_person_box(
__INDEX[cur_gen], None, None)
###########################
#Step 4. Father and Mother are done but only 1/2 line
@ -465,7 +467,7 @@ class RLTransform():
""" put the box in it's correct spot """
#1. cm_x
box.x_cm = self.rept_opts.littleoffset
box.x_cm += (box.level[0] * \
box.x_cm += (box.level[0] *
(self.rept_opts.col_width + self.rept_opts.max_box_width))
#2. cm_y
box.y_cm = self.__next_y(box) * self.rept_opts.max_box_height
@ -490,7 +492,7 @@ class RLTransform():
#------------------------------------------------------------------------
class MakeReport():
def __init__(self, dbase, doc, canvas, \
def __init__(self, dbase, doc, canvas,
font_normal, inlc_marr, compress_tree):
self.database = dbase
@ -579,10 +581,7 @@ class GUIConnect():
""" Return a class that holds the proper title based off of the
GUI options """
title_type = self.get_val('report_title')
if title_type == 0:
return TitleN(doc)
else:
return TitleA(doc)
return TitleA(doc) if title_type else TitleN(doc)
#------------------------------------------------------------------------
#
@ -634,8 +633,8 @@ class AncestorTree2(Report):
#Title
title = self.connect.title_class(self.doc)
center = self.database.get_person_from_gramps_id(
self.connect.get_val('pid')
)
self.connect.get_val('pid')
)
title.calc_title(center)
self.canvas.add_title(title)
@ -687,11 +686,9 @@ class AncestorTree2(Report):
colsperpage = self.doc.get_usable_width()
colsperpage += self.doc.report_opts.col_width
colsperpage = int(colsperpage / (self.doc.report_opts.max_box_width +
self.doc.report_opts.col_width))
if colsperpage == 0: #Is the page really that small?
colsperpage = 1
colsperpage = int(colsperpage / (self.doc.report_opts.max_box_width +
self.doc.report_opts.col_width))
colsperpage = colsperpage or 1
#####################
#Vars
@ -841,8 +838,10 @@ class AncestorTree2Options(MenuReportOptions):
category_name = _("Secondary")
dispMom = TextOption(_("Secondary\nDisplay Format"),
["$n","%s $b" % _BORN,"%s $m" %_MARR,"%s $d" \
%_DIED] )
["$n","%s $b" % _BORN,
"%s $m" %_MARR,
"%s $d" %_DIED]
)
dispMom.set_help(_("Display format for the output box."))
menu.add_option(category_name, "disp_sec", dispMom)
@ -923,9 +922,11 @@ class AncestorTree2Options(MenuReportOptions):
if max_gen > 1:
item_list.append([1, _("One Generation of empty boxes "
"for unknown ancestors") ])
for itr in range(2, max_gen):
item_list.append([itr, str(itr) + _(" Generations of empty boxes "
"for unknown ancestors") ])
item_list.extend([itr, str(itr) +
_(" Generations of empty boxes for unknown ancestors")]
for itr in range(2, max_gen)
)
self.fillout.set_items(item_list)
if old_val+2 > len(item_list):

View File

@ -159,43 +159,46 @@ class DescendantTitleBase(TitleBox):
def descendant_print(self, person_list, person_list2 = []):
""" calculate the Descendant title
Person_list will always be passed
If in the Family reports and there are two familys, person_list2
If in the Family reports and there are two families, person_list2
will be used.
"""
names = self._get_names(person_list)
if person_list2 != []:
names2 = self._get_names(person_list2)
if person_list2:
if len(person_list) + len(person_list2) == 3:
if len(person_list) == 1:
names2 = self._get_names(person_list2)
if len(names) + len(names2) == 3:
if len(names) == 1:
title = _("Descendant Chart for %(person)s and "
"%(father1)s, %(mother1)s") % \
{'person': names[0], \
'father1': names2[0], \
{'person': names[0],
'father1': names2[0],
'mother1': names2[1],
}
else:
}
else: # Should be 2 items in names list
title = _("Descendant Chart for %(person)s, %(father1)s "
"and %(mother1)s") % \
{'father1': names[0], \
'mother1': names[1], \
'person': names2[0] }
else: #if not person_list2:
{'father1': names[0],
'mother1': names[1],
'person': names2[0],
}
else: # Should be 2 items in both names and names2 lists
title = _("Descendant Chart for %(father1)s, %(father2)s "
"and %(mother1)s, %(mother2)s") % \
{'father1': names[0], \
'mother1': names[1], \
'father2': names2[0], \
'mother2': names2[1] }
else:
{'father1': names[0],
'mother1': names[1],
'father2': names2[0],
'mother2': names2[1],
}
else: # No person_list2: Just one family
if len(names) == 1:
title = _("Descendant Chart for %(person)s") % \
{'person': names[0] }
elif len(names) == 2:
{'person': names[0]}
else: # Should be two items in names list
title = _("Descendant Chart for %(father)s and %(mother)s") % \
{'father': names[0], 'mother': names[1] }
{'father': names[0],
'mother': names[1],
}
return title
def get_parents(self, family_id):
@ -373,7 +376,7 @@ class RecurseDown:
self.database = dbase
self.canvas = canvas
self.famalies_seen = []
self.famalies_seen = set()
self.cols = []
self.__last_direct = []
@ -509,7 +512,7 @@ class RecurseDown:
for family_handle in family_handles:
if family_handle not in self.famalies_seen:
self.famalies_seen.append(family_handle)
self.famalies_seen.add(family_handle)
family = self.database.get_family_from_handle(family_handle)
@ -535,17 +538,19 @@ class RecurseDown:
mykids = [kid.ref for kid in family.get_child_ref_list()]
def _child_recurse(who):
self.recurse(child_ref, x_level+1, 0, who)
for child_ref in mykids:
if self.inlc_marr and self.max_spouses > 0:
self.recurse(child_ref, x_level+1, 0, marr)
_child_recurse(marr)
elif spouse:
self.recurse(child_ref, x_level+1, 0, spouse)
_child_recurse(spouse)
else:
self.recurse(child_ref, x_level+1, 0, myself)
_child_recurse(myself)
first = 0
if self.max_spouses > s_level and spouse_handle and \
self.famalies_seen.count(spouse_handle):
if self.max_spouses > s_level and \
spouse_handle in self.famalies_seen:
#spouse_handle = ReportUtils.find_spouse(person,family)
self.recurse(spouse_handle, x_level, s_level+1, spouse)
@ -561,21 +566,23 @@ class RecurseDown:
self.bold_now = 2
if father_h == None:
father_b = self.add_person_box( (level, 0), None, None, father2)
father_b = self.add_person_box(
(level, 0), None, None, father2)
else:
father_b = self.add_person_box( (level, 0), father_h,
family_h, father2)
father_b = self.add_person_box(
(level, 0), father_h, family_h, father2)
if self.inlc_marr:
family_b = self.add_marriage_box( (level, 1), father_h,
family_h, father_b)
self.famalies_seen.append(family_h)
family_b = self.add_marriage_box(
(level, 1), father_h, family_h, father_b)
self.famalies_seen.add(family_h)
if mother_h:
mother_b = self.add_person_box( (level, 0), mother_h,
family_h, father_b)
mother_b = self.add_person_box(
(level, 0), mother_h, family_h, father_b)
else:
mother_b = self.add_person_box( (level, 0), None, None, father_b)
mother_b = self.add_person_box(
(level, 0), None, None, father_b)
#child_refs = []
#for child_ref in family.get_child_ref_list():
@ -633,7 +640,7 @@ class RecurseDown:
show = self.has_children(person_handle)
#if self.max_spouses == 0 and not self.has_children(person_handle):
# self.famalies_seen.append(person_handle)
# self.famalies_seen.add(person_handle)
# show = False
if show:
@ -677,7 +684,7 @@ class MakePersonTree(RecurseDown):
#######################
#don't do center person's parents family.
if family2_h:
self.famalies_seen.append(family2_h)
self.famalies_seen.add(family2_h)
#######################
#Center person's Fathers OTHER wives
@ -763,7 +770,7 @@ class MakeFamilyTree(RecurseDown):
#######################
#don't do my fathers parents family. will be done later
if family2_h:
self.famalies_seen.append(family2_h)
self.famalies_seen.add(family2_h)
#######################
#my father mothers OTHER husbands
@ -781,10 +788,10 @@ class MakeFamilyTree(RecurseDown):
#######################
#don't do my parents family in recurse. will be done later
self.famalies_seen.append(family1_h)
self.famalies_seen.add(family1_h)
##If dad has no other children from other marriages. remove him
if self.max_spouses == 0 and not self.has_children(father1_h):
self.famalies_seen.append(father1_h)
self.famalies_seen.add(father1_h)
#######################
#my fathers parents!
@ -801,7 +808,7 @@ class MakeFamilyTree(RecurseDown):
#this parent again IF s/he has children
show = self.has_children(father1_h)
if not show:
self.famalies_seen.append(father1_h)
self.famalies_seen.add(father1_h)
father2_id = self.add_family( 0, family2, None )
@ -881,17 +888,17 @@ class MakeFamilyTree(RecurseDown):
#######################
#don't do my parents family.
self.famalies_seen = [family1_h]
self.famalies_seen = set([family1_h] )
##If mom has no other children from other marriages. remove her
if self.max_spouses == 0 and not self.has_children(mother1_h):
self.famalies_seen.append(mother1_h)
self.famalies_seen.add(mother1_h)
if mother1_h:
myfams = mother1.get_family_handle_list()
if len(myfams) < 2:
#If mom didn't have any other families, don't even do her
#she is already here with dad and will be added later
self.famalies_seen.append(mother1_h)
self.famalies_seen.add(mother1_h)
#######################
#my mother other spouses (if no parents)
@ -1166,14 +1173,14 @@ class MakeReport(object):
#remove column 0 and move everyone back one level
self.cols.pop(0)
for box in self.canvas.boxes:
box.level = (box.level[0]-1, box.level[1])
box.level = (box.level[0] - 1, box.level[1])
#go ahead and set it now.
width = self.canvas.doc.report_opts.max_box_width
for box in self.canvas.boxes:
box.width = width - box.x_cm
box.x_cm += self.canvas.doc.report_opts.littleoffset
box.x_cm += (box.level[0] * \
box.x_cm += (box.level[0] *
(self.canvas.doc.report_opts.col_width +
self.canvas.doc.report_opts.max_box_width))
@ -1246,8 +1253,7 @@ class GuiConnect():
if box.boxstr == "CG2-fam-box": #(((((
workinglines = display_marr
elif box.level[1] > 0 or (box.level[0] == 0 and
box.father is not None):
elif box.level[1] > 0 or (box.level[0] == 0 and box.father):
workinglines = display_spou
else:
workinglines = display
@ -1345,9 +1351,8 @@ class Descend2Tree(Report):
colsperpage += self.doc.report_opts.col_width
tmp = self.doc.report_opts.max_box_width
tmp += self.doc.report_opts.col_width
colsperpage = int( colsperpage / tmp )
if colsperpage == 0: #Is the page really that small?
colsperpage = 1
colsperpage = int(colsperpage / tmp)
colsperpage = colsperpage or 1
#####################
#Vars
@ -1465,10 +1470,12 @@ class Descend2TreeOptions(MenuReportOptions):
menu.add_option(category_name, "pid", self.__pid)
self.showparents = BooleanOption(
_('Start with the parent(s) of the selected first'), True)
_('Start with the parent(s) of the selected first'),
True)
self.showparents.set_help(
_("Will show the parents, brother and sisters of the "
"selected person."))
"selected person.")
)
menu.add_option(category_name, "show_gparents", self.showparents)
max_gen = NumberOption(_("Generations"), 2, 1, 50)
@ -1492,8 +1499,10 @@ class Descend2TreeOptions(MenuReportOptions):
menu.add_option(category_name, "dispf", disp)
bold = BooleanOption(_('Bold direct descendants'), True)
bold.set_help(_("Whether to bold those people that are direct "
"(not step or half) descendants."))
bold.set_help(
_("Whether to bold those people that are direct "
"(not step or half) descendants.")
)
menu.add_option(category_name, "bolddirect", bold)
#Will add when libsubstkeyword supports it.
@ -1506,8 +1515,9 @@ class Descend2TreeOptions(MenuReportOptions):
category_name = _("Secondary")
diffspouse = BooleanOption(_('Use seperate display format for '
'spouses'), True)
diffspouse = BooleanOption(
_("Use seperate display format for spouses"),
True)
diffspouse.set_help(_("Whether spouses can have a different format."))
menu.add_option(category_name, "diffspouse", diffspouse)
@ -1521,8 +1531,9 @@ class Descend2TreeOptions(MenuReportOptions):
menu.add_option(category_name, "sdispf", sdisp)
incmarr = BooleanOption(_('Include Marriage information'), True)
incmarr.set_help(_("Whether to include marriage information in the "
"report."))
incmarr.set_help(
_("Whether to include marriage information in the report.")
)
menu.add_option(category_name, "incmarr", incmarr)
marrdisp = StringOption(_("Marriage\nDisplay Format"), "%s $m" % _MARR)
@ -1531,8 +1542,9 @@ class Descend2TreeOptions(MenuReportOptions):
category_name = _("Replace")
repldisp = TextOption(_("Replace Display Format:\n'Replace this'/'"
"with this'"), [])
repldisp = TextOption(
_("Replace Display Format:\n'Replace this'/' with this'"),
[])
repldisp.set_help(_("i.e.\nUnited States of America/U.S.A"))
menu.add_option(category_name, "replacelist", repldisp)
@ -1542,14 +1554,17 @@ class Descend2TreeOptions(MenuReportOptions):
self.scale.add_item( 0, "Do not scale report")
self.scale.add_item( 1, "Scale report to fit page width only")
self.scale.add_item( 2, "Scale report to fit the size of the page")
self.scale.set_help(_("Whether to scale the report to fit a "
"specific size"))
self.scale.set_help(
_("Whether to scale the report to fit a specific size")
)
menu.add_option(category_name, "scale_report", self.scale)
self.scale.connect('value-changed', self.__check_blank)
self.__onepage = BooleanOption(_('One page report'), True)
self.__onepage.set_help(_("Whether to scale the size of the page to "
"the size of the report."))
self.__onepage.set_help(
_("Whether to scale the size of the page to "
"the size of the report.")
)
menu.add_option(category_name, "onepage", self.__onepage)
self.__onepage.connect('value-changed', self.__check_blank)
@ -1574,12 +1589,14 @@ class Descend2TreeOptions(MenuReportOptions):
category_name = _("Notes")
self.usenote = BooleanOption(_('Include a personal note'), False)
self.usenote.set_help(_("Whether to include a personalized note on "
"the report."))
self.usenote.set_help(
_("Whether to include a personalized note on the report.")
)
menu.add_option(category_name, "use_note", self.usenote)
self.notedisp = TextOption(_("Note to add\nto the graph\n\n$T "
"inserts today's date"), [])
self.notedisp = TextOption(
_("Note to add\nto the graph\n\n$T inserts today's date"),
[])
self.notedisp.set_help(_("Add a personal note"))
menu.add_option(category_name, "note_disp", self.notedisp)
@ -1596,13 +1613,18 @@ class Descend2TreeOptions(MenuReportOptions):
self.__blank.set_available( off )
def __Title_enum(self):
item_list = []
item_list.append([0, "Do not print a title" ])
item_list.append([1, "Descendant Chart for [selected person(s)]" ])
item_list = [
[0, "Do not print a title" ],
[1, "Descendant Chart for [selected person(s)]" ],
]
if self.name != _RPT_NAME:
item_list.append([2, "Family Chart for [names of chosen family]" ])
item_list.append(
[2, "Family Chart for [names of chosen family]" ]
)
if self.showparents.get_value():
item_list.append([3, "Cousin Chart for [names of children]" ])
item_list.append(
[3, "Cousin Chart for [names of children]" ]
)
self.title.set_items(item_list)
def make_default_style(self, default_style):
@ -1618,8 +1640,9 @@ class Descend2TreeOptions(MenuReportOptions):
para_style = ParagraphStyle()
para_style.set_font(font)
para_style.set_alignment(PARA_ALIGN_CENTER)
para_style.set_description(_('The basic style used for the '
'title display.'))
para_style.set_description(
_("The basic style used for the title display.")
)
default_style.add_paragraph_style("CG2-Title", para_style)
font = FontStyle()
@ -1627,8 +1650,9 @@ class Descend2TreeOptions(MenuReportOptions):
font.set_type_face(FONT_SANS_SERIF)
para_style = ParagraphStyle()
para_style.set_font(font)
para_style.set_description(_('The basic style used for the '
'text display.'))
para_style.set_description(
_('The basic style used for the text display.')
)
default_style.add_paragraph_style("CG2-Normal", para_style)
#Set the size of the shadow based on the font size! Much better
@ -1638,8 +1662,9 @@ class Descend2TreeOptions(MenuReportOptions):
font.set_bold(True)
para_style = ParagraphStyle()
para_style.set_font(font)
para_style.set_description(_('The bold style used for the '
'text display.'))
para_style.set_description(
_('The bold style used for the text display.')
)
default_style.add_paragraph_style("CG2-Bold", para_style)
graph_style = GraphicsStyle()

View File

@ -609,16 +609,13 @@ class TitleBox(BoxBase):
def _get_names(self, persons):
""" A helper function that receives a list of persons and
returns their names in a list """
tmp = []
for person in persons:
tmp.append(name_displayer.display(person))
return tmp
return [name_displayer.display(person) for person in persons]
def display(self):
""" display the title box. """
if self.page.y_page_num != 0 or self.boxstr == "None":
if self.page.y_page_num or self.boxstr == "None":
return
if self.text != "":
if self.text:
self.doc.center_text(self.boxstr, self.text,
self.width/2, self.y_cm)