From 7e9ed2e31fa2ea4e374f2dc41c3dcfb4e1651cc6 Mon Sep 17 00:00:00 2001 From: "Craig J. Anderson" Date: Mon, 17 Jan 2011 20:52:25 +0000 Subject: [PATCH] added back copyright notices added great updates given to me by Gerald Britton svn: r16402 --- src/plugins/drawreport/DescendTree.py | 228 ++++++++++++-------------- 1 file changed, 101 insertions(+), 127 deletions(-) diff --git a/src/plugins/drawreport/DescendTree.py b/src/plugins/drawreport/DescendTree.py index ecebdba3e..76b904879 100644 --- a/src/plugins/drawreport/DescendTree.py +++ b/src/plugins/drawreport/DescendTree.py @@ -1,7 +1,10 @@ # # Gramps - a GTK+/GNOME based genealogy program # -# Copyright (C) 2008-2010 Craig J. Anderson ander882@hotmail.com +# Copyright (C) 2000-2007 Donald N. Allingham +# Copyright (C) 2007-2008 Brian G. Matherly +# Copyright (C) 2010 Jakim Friant +# Copyright (C) 2009-2010 Craig J. Anderson # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -74,6 +77,7 @@ from libtreebase import * class DescendantBoxBase(BoxBase): """ Base for all descendant boxes. Set the boxstr and some new attributes that are needed """ + def __init__(self, boxstr): BoxBase.__init__(self) self.boxstr = boxstr @@ -83,6 +87,7 @@ class DescendantBoxBase(BoxBase): def calc_text(self, database, person, family): """ A sinble place to calculate box text """ + gui = GuiConnect() calc = gui.calc_lines(database) self.text = calc.calc_lines(person, family, @@ -92,6 +97,7 @@ class PersonBox(DescendantBoxBase): """ Calculates information about the box that will print on a page """ + def __init__(self, level, boldable = 0): DescendantBoxBase.__init__(self, "CG2-box") self.level = level @@ -104,6 +110,7 @@ class FamilyBox(DescendantBoxBase): """ Calculates information about the box that will print on a page """ + def __init__(self, level): DescendantBoxBase.__init__(self, "CG2-fam-box") self.level = level @@ -111,6 +118,7 @@ class FamilyBox(DescendantBoxBase): class PlaceHolderBox(BoxBase): """ I am a box that does not print. I am used to make sure information does not run over areas that we don't wnat information (boxes) """ + def __init__(self, level): BoxBase.__init__(self) self.boxstr = "None" @@ -128,6 +136,7 @@ class PlaceHolderBox(BoxBase): #------------------------------------------------------------------------ class Line(LineBase): """ Our line class.""" + def __init__(self, start): LineBase.__init__(self, start) self.linestr = "CG2-line" @@ -144,19 +153,18 @@ class DescendantTitleBase(TitleBox): self.database = dbase 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 + will be used. + """ + names = self._get_names(person_list) if person_list2 != []: names2 = self._get_names(person_list2) - if person_list2 == []: - if len(names) == 1: - title = _("Descendant Chart for %(person)s") % \ - {'person': names[0] } - elif len(names) == 2: - title = _("Descendant Chart for %(father)s and %(mother)s") % \ - {'father': names[0], 'mother': names[1] } - else: - if len(person_list + person_list2) == 3: + if person_list2: + if len(person_list) + len(person_list2) == 3: if len(person_list) == 1: title = _("Descendant Chart for %(person)s and " "%(father1)s, %(mother1)s") % \ @@ -170,31 +178,37 @@ class DescendantTitleBase(TitleBox): {'father1': names[0], \ 'mother1': names[1], \ 'person': names2[0] } - else: #if len(person_list + person_list2) == 4: + else: #if not person_list2: 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: + if len(names) == 1: + title = _("Descendant Chart for %(person)s") % \ + {'person': names[0] } + elif len(names) == 2: + title = _("Descendant Chart for %(father)s and %(mother)s") % \ + {'father': names[0], 'mother': names[1] } return title def get_parents(self, family_id): + """ For a family_id, return the father and mother """ + family1 = self.database.get_family_from_gramps_id(family_id) father_h = family1.get_father_handle() mother_h = family1.get_mother_handle() - parents = [] - - if father_h: - parents.append(self.database.get_person_from_handle(father_h)) - if mother_h: - parents.append(self.database.get_person_from_handle(mother_h)) + parents = [self.database.get_person_from_handle(handle) + for handle in [father_h, mother_h] if handle] return parents class TitleNone(TitleBox): """Family Chart Title class for the report """ + def __init__(self, dbase, doc): TitleBox.__init__(self, doc, "None") @@ -205,6 +219,7 @@ class TitleNone(TitleBox): class TitleDPY(DescendantTitleBase): """Descendant (Person yes start with parents) Chart Title class for the report """ + def __init__(self, dbase, doc): DescendantTitleBase.__init__(self, dbase, doc) @@ -215,29 +230,23 @@ class TitleDPY(DescendantTitleBase): family2_h = center.get_main_parents_family_handle() family2 = self.database.get_family_from_handle(family2_h) - person_list = [] - mother2_h = father2_h = None + person_list = None if family2: father2_h = family2.get_father_handle() - if father2_h: - person_list.append( - self.database.get_person_from_handle(father2_h)) mother2_h = family2.get_mother_handle() - if mother2_h: - person_list.append( - self.database.get_person_from_handle(mother2_h)) + person_list = [self.database.get_person_from_handle(handle) + for handle in [father2_h, mother2_h] if handle] + + if not person_list: + person_list = [center] - if person_list == []: - person_list.append(center) - - #else: - # title = str(tmp) + " " + str(len(tmp)) self.text = self.descendant_print(person_list) self.set_box_height_width() class TitleDPN(DescendantTitleBase): """Descendant (Person no start with parents) Chart Title class for the report """ + def __init__(self, dbase, doc): DescendantTitleBase.__init__(self, dbase, doc) @@ -253,32 +262,25 @@ class TitleDPN(DescendantTitleBase): class TitleDFY(DescendantTitleBase): """Descendant (Family yes start with parents) Chart Title class for the report """ + def __init__(self, dbase, doc): DescendantTitleBase.__init__(self, dbase, doc) def get_parent_list(self, person): """ return a list of my parents. If none, return me """ - if person is None: + if not person: return None - parent_list = [] + + parent_list = None family_h = person.get_main_parents_family_handle() family = self.database.get_family_from_handle(family_h) - if family is not None: #family = fathers parents + if family: #family = fathers parents father_h = family.get_father_handle() - if father_h is not None: - parent_list.append( - self.database.get_person_from_handle(father_h)) mother_h = family.get_mother_handle() - if mother_h is not None: - parent_list.append( - self.database.get_person_from_handle(mother_h)) - else: - return [person] + parent_list = [self.database.get_person_from_handle(handle) + for handle in [father_h, mother_h] if handle] - if parent_list == []: - return [person] - else: - return parent_list + return parent_list or [person] def calc_title(self, family_id): """Calculate the title of the report""" @@ -289,7 +291,7 @@ class TitleDFY(DescendantTitleBase): mom_parents = [] if len(my_parents) > 1: - if dad_parents is None: + if not dad_parents: dad_parents = self.get_parent_list(my_parents[1]) else: mom_parents = self.get_parent_list(my_parents[1]) @@ -300,6 +302,7 @@ class TitleDFY(DescendantTitleBase): class TitleDFN(DescendantTitleBase): """Descendant (Family no start with parents) Chart Title class for the report """ + def __init__(self, dbase, doc): DescendantTitleBase.__init__(self, dbase, doc) @@ -307,8 +310,7 @@ class TitleDFN(DescendantTitleBase): """Calculate the title of the report""" self.text = self.descendant_print( - self.get_parents(family_id) - ) + self.get_parents(family_id) ) self.set_box_height_width() class TitleF(DescendantTitleBase): @@ -342,22 +344,14 @@ class TitleC(DescendantTitleBase): family = self.database.get_family_from_gramps_id(family_id) - kids = [] - for kid in family.get_child_ref_list(): - kids.append(self.database.get_person_from_handle(kid.ref)) + kids = [self.database.get_person_from_handle(kid.ref) + for kid in family.get_child_ref_list()] #ok we have the children. Make a title off of them tmp = self._get_names(kids) - title = "" - while tmp != []: - if title != "": - title += ", " - title += tmp.pop(0) + self.text = _("Cousin Chart for " + ", ".join(self._get_names(kids))) - title = "Cousin Chart for " + title - - self.text = title self.set_box_height_width() @@ -384,7 +378,7 @@ class RecurseDown: self.max_generations = gui.get_val('maxgen') self.max_spouses = gui.get_val('maxspouse') self.inlc_marr = gui.get_val('incmarr') - if self.max_spouses == 0: + if not self.max_spouses: self.inlc_marr = False #is the option even available? @@ -412,7 +406,7 @@ class RecurseDown: self.cols.append(None) self.__last_direct.append(None) - if self.cols[level] is not None: + if self.cols[level]: last_box = self.cols[level] last_box.next = box @@ -444,15 +438,14 @@ class RecurseDown: """ Makes a person box and add that person into the Canvas. """ myself = PersonBox(level) - if myself.level[1] == 0 and self.bold_direct and self.bold_now != 0: + if myself.level[1] == 0 and self.bold_direct and self.bold_now: if self.bold_now == 1: self.bold_now = 0 myself.set_bold() - if level[1] == 0 and father is not None and \ - myself.level[0] != father.level[0]: + if level[1] == 0 and father and myself.level[0] != father.level[0]: #I am a child - if father.line_to is None: + if not father.line_to: line = Line(father) father.line_to = line self.canvas.add_line(father.line_to) @@ -493,19 +486,16 @@ class RecurseDown: or we reach the max number of spouses that we want to deal with""" + if not person_handle: return if x_level > self.max_generations: return if s_level > 0 and s_level == self.max_spouses: return - if person_handle == None: return if person_handle in self.famalies_seen: return myself = None person = self.database.get_person_from_handle(person_handle) family_handles = person.get_family_handle_list() if s_level == 0: - if family_handles == []: - val = None - else: - val = family_handles[0] + val = family_handles[0] if family_handles else None myself = self.add_person_box( (x_level, s_level), person_handle, val, father) @@ -520,50 +510,38 @@ class RecurseDown: family = self.database.get_family_from_handle(family_handle) if self.inlc_marr and self.max_spouses > 0: - if s_level == 0: - marr = self.add_marriage_box((x_level, s_level+1), - person_handle, family_handle, - myself) - else: - marr = self.add_marriage_box((x_level, s_level+1), - person_handle, family_handle, - father) + marr = self.add_marriage_box((x_level, s_level+1), + person_handle, family_handle, + father if s_level else myself) spouse_handle = ReportUtils.find_spouse(person, family) if self.max_spouses > s_level and \ spouse_handle not in self.famalies_seen: + def _spouse_box(who): + self.add_person_box((x_level, s_level+1), + spouse_handle, family_handle, who) if s_level > 0: - spouse = self.add_person_box((x_level, s_level+1), - spouse_handle, family_handle, - father) + spouse = _spouse_box(father) elif first == 1: - spouse = self.add_person_box((x_level, s_level+1), - spouse_handle, family_handle, - myself) + spouse = _spouse_box(myself) elif self.inlc_marr: - spouse = self.add_person_box((x_level, s_level+1), - spouse_handle, family_handle, - marr) + spouse = _spouse_box(marr) else: - spouse = self.add_person_box((x_level, s_level+1), - spouse_handle, family_handle, - myself) + spouse = _spouse_box(myself) - mykids = [] - for kid in family.get_child_ref_list(): - mykids.append(kid.ref) + mykids = [kid.ref for kid in family.get_child_ref_list()] for child_ref in mykids: if self.inlc_marr and self.max_spouses > 0: self.recurse(child_ref, x_level+1, 0, marr) - elif spouse is not None: + elif spouse: self.recurse(child_ref, x_level+1, 0, spouse) else: self.recurse(child_ref, x_level+1, 0, myself) first = 0 - if self.max_spouses > s_level and spouse_handle != None and \ - self.famalies_seen.count(spouse_handle) == 0: + if self.max_spouses > s_level and spouse_handle and \ + self.famalies_seen.count(spouse_handle): #spouse_handle = ReportUtils.find_spouse(person,family) self.recurse(spouse_handle, x_level, s_level+1, spouse) @@ -572,6 +550,7 @@ class RecurseDown: Adds a family into the canvas. only will be used for my direct grandparents, and my parents only. """ + family_h = family.get_handle() father_h = family.get_father_handle() mother_h = family.get_mother_handle() @@ -599,10 +578,8 @@ class RecurseDown: # child_refs.append(child_ref) for child_ref in family.get_child_ref_list(): - if self.inlc_marr: - self.recurse(child_ref.ref, level+1, 0, family_b) - else: - self.recurse(child_ref.ref, level+1, 0, father_b) + self.recurse(child_ref.ref, level+1, 0, + family_b if self.inlc_marr else father_b) #Future code. #if self.inlc_marr: @@ -620,9 +597,7 @@ class RecurseDown: still we want to respect the FamaliesSeen list """ - if person_handle == None: - return False - if person_handle in self.famalies_seen: + if not person_handle or person_handle in self.famalies_seen: return False person = self.database.get_person_from_handle(person_handle) @@ -632,7 +607,7 @@ class RecurseDown: family = self.database.get_family_from_handle(family_handle) - if family.get_child_ref_list() != []: + if family.get_child_ref_list(): return True return False @@ -641,6 +616,7 @@ class RecurseDown: Quickly check to see if we want to continue recursion still we want to respect the FamaliesSeen list """ + person = self.database.get_person_from_handle(person_handle) show = False @@ -656,7 +632,7 @@ class RecurseDown: # self.famalies_seen.append(person_handle) # show = False - if show == True: + if show: self.bold_now = 1 self.recurse(person_handle, level, 0, None) @@ -742,6 +718,7 @@ class MakeFamilyTree(RecurseDown): order of people inserted into Persons is important. makes sure that order is done correctly. """ + def __init__(self, dbase, canvas): RecurseDown.__init__(self, dbase, canvas) @@ -819,7 +796,7 @@ class MakeFamilyTree(RecurseDown): #if the condition is true, we only want to show #this parent again IF s/he has children show = self.has_children(father1_h) - if show == False: + if not show: self.famalies_seen.append(father1_h) father2_id = self.add_family( 0, family2, None ) @@ -833,7 +810,7 @@ class MakeFamilyTree(RecurseDown): #if my father does not have parents (he is the highest) ####################### #do his OTHER wives first. - if family2 == None and father1: + if not family2 and father1: self.recurse_if(father1_h, 1) @@ -842,10 +819,7 @@ class MakeFamilyTree(RecurseDown): ####################### if family2: #We need to add dad to the family - if self.inlc_marr: - parent = family2_id - else: - parent = father2_id + parent = family2_id if self.inlc_marr else father2_id else: parent = None @@ -869,10 +843,10 @@ class MakeFamilyTree(RecurseDown): #make sure there is at least one child in this family. #if not put in a placeholder - if line.end == []: + if not line.end: box = PlaceHolderBox((father1_b[0]+1, 0)) self.add_to_col(box) - line.end.append(box) + line.end = [box] ####################### ####################### @@ -920,7 +894,7 @@ class MakeFamilyTree(RecurseDown): ####################### #if my mother does not have parents (she is the highest) #Then do her OTHER spouses. - if family2 == None and mother1: + if not family2 and mother1: self.recurse_if(mother1_h, 1) ####################### @@ -1006,7 +980,7 @@ class MakeReport(object): def __move_col_from_here_down(self, box, amount): """Move me and everyone below me in this column only down""" - while box is not None: + while box: box.y_cm += amount box = box.next @@ -1014,8 +988,8 @@ class MakeReport(object): """Move me, everyone below me in this column, and all of our children (and childrens children) down.""" col = [box] - while len(col) > 0: - if len(col) == 1 and col[0].line_to is not None: + while col: + if len(col) == 1 and col[0].line_to: col.append(col[0].line_to.end[0]) col[0].y_cm += amount @@ -1027,7 +1001,7 @@ class MakeReport(object): def __next_family_group(self, box): """ a helper function. Assume box is at the start of a family block. get this family block. """ - while box is not None: + while box: left_group = [] #Form the parental (left) group. @@ -1037,12 +1011,12 @@ class MakeReport(object): left_group.append(box) box = box.next - if box is not None and box.level[1] != 0 and self.inlc_marr: + if box and box.level[1] != 0 and self.inlc_marr: #add/start with the marriage box left_group.append(box) box = box.next - if box is not None and box.level[1] != 0 and self.max_spouses > 0: + if box and box.level[1] != 0 and self.max_spouses > 0: #add/start with the spousal box left_group.append(box) box = box.next @@ -1050,14 +1024,14 @@ class MakeReport(object): right_group = [] #Form the children (right) group. for spouses in left_group: - if spouses.line_to is not None: + if spouses.line_to: right_group += spouses.line_to.end #will only be one. but in the family report, #Dad and mom point to the same line break #we now have everyone we want - if right_group != []: + if right_group: return left_group, right_group #else # no children, so no family. go again until we find one to return. @@ -1069,9 +1043,9 @@ class MakeReport(object): (parents with children) that may need to be moved. """ for x_col in range(len(self.cols)-2, -1, -1): box = self.cols[x_col][0] #The first person in this col - while box is not None: + while box: left_group, right_group = self.__next_family_group(box) - if left_group is None: + if not left_group: box = None #we found the end of this col else: yield left_group, right_group @@ -1093,7 +1067,7 @@ class MakeReport(object): if self.compress_tree: #calculate a new left and right move points for left_line in left_group: - if left_line.line_to is not None: + if left_line.line_to: break left_center = left_line.y_cm + (left_line.height /2) @@ -1143,7 +1117,7 @@ class MakeReport(object): #if so we need to move down mariage information #and mom! left_line = left_group[0].line_to - if left_line is None: + if not left_line: left_line = left_group[1].line_to left_group = left_line.start @@ -1182,7 +1156,7 @@ class MakeReport(object): #Width of each column of people - self.rept_opt.box_width #width of each column (or row) of lines - self.rept_opt.col_width - if len(self.cols[0]) == 0: + if not self.cols[0]: #We wanted to print parents of starting person/family but #there were none! #remove column 0 and move everyone back one level