From d5ae9743bd8f510d69529cd957e952a8e4908bd4 Mon Sep 17 00:00:00 2001 From: Don Allingham Date: Fri, 29 Mar 2002 00:56:28 +0000 Subject: [PATCH] GraphViz enhancements from Jeff Ollie svn: r871 --- src/ChooseParents.py | 5 +- src/Report.py | 6 +-- src/plugins/GraphViz.py | 103 +++++++++++++++++++++++++++++++++------- 3 files changed, 92 insertions(+), 22 deletions(-) diff --git a/src/ChooseParents.py b/src/ChooseParents.py index d8017a3d9..6eb6cf13a 100644 --- a/src/ChooseParents.py +++ b/src/ChooseParents.py @@ -92,7 +92,10 @@ class ChooseParents: self.mother_rel.set_text(_("Birth")) self.father_rel.set_text(_("Birth")) - self.type = self.family.getRelationship() + if self.family: + self.type = self.family.getRelationship() + else: + self.type = "Married" self.prel.set_text(_(self.type)) self.redraw() diff --git a/src/Report.py b/src/Report.py index 766bb5d8f..e150b8062 100644 --- a/src/Report.py +++ b/src/Report.py @@ -581,9 +581,9 @@ class ReportDialog: self.pagecount_menu = GtkOptionMenu() myMenu = Utils.build_string_optmenu(pagecount_map, start_text) self.pagecount_menu.set_menu(myMenu) - table.attach(GtkLabel(_("Page Count")),2,1,3,2,FILL,FILL,pad,pad) - table.attach(self.pagecount_menu,3,2,4,2,xpadding=pad,ypadding=pad) - + table.attach(GtkLabel(_("Page Count")),0,1,1,2,FILL,FILL,pad,pad) + table.attach(self.pagecount_menu,1,2,1,2,xpadding=pad,ypadding=pad) + def html_file_enable(self,obj): text = obj.get_text() if _template_map.has_key(text): diff --git a/src/plugins/GraphViz.py b/src/plugins/GraphViz.py index b7c904884..a267eede2 100644 --- a/src/plugins/GraphViz.py +++ b/src/plugins/GraphViz.py @@ -21,6 +21,8 @@ "Generate files/Relationship graph" import os +import string + import intl import Utils @@ -146,6 +148,53 @@ class GraphVizDialog(ReportDialog): """Set up the list of possible content filters.""" return filter_map.keys() + def add_user_options(self): + + self.arrowhead_optionmenu = GtkOptionMenu() + menu = GtkMenu() + + menuitem = GtkMenuItem(_("Descendants <- Ancestors")) + menuitem.set_data('i', '[arrowhead=none, arrowtail=normal]') + menuitem.show() + menu.append(menuitem) + + menuitem = GtkMenuItem(_("Descendants -> Ancestors")) + menuitem.set_data('i', '[arrowhead=normal, arrowtail=none]') + menuitem.show() + menu.append(menuitem) + + menuitem = GtkMenuItem(_("Descendants <-> Ancestors")) + menuitem.set_data('i', '[arrowhead=normal, arrowtail=normal]') + menuitem.show() + menu.append(menuitem) + + menu.set_active(0) + self.arrowhead_optionmenu.set_menu(menu) + tip = GtkTooltips() + tip.set_tip(self.arrowhead_optionmenu, _("Choose the direction that the arrows point.")) + self.add_frame_option(_("GraphViz Options"), _("Arrowhead Options"), self.arrowhead_optionmenu) + + self.includedates_checkbutton = GtkCheckButton(_("Include Birth and Death Dates")) + self.includedates_checkbutton.set_active(1) + tip = GtkTooltips() + tip.set_tip(self.includedates_checkbutton, _("Include the years that the individual was born and/or died in the graph node labels.")) + self.add_frame_option(_("GraphViz Options"), ' ', self.includedates_checkbutton) + + self.includeurl_checkbutton = GtkCheckButton(_("Include URLs")) + self.includeurl_checkbutton.set_active(1) + tip = GtkTooltips() + tip.set_tip(self.includeurl_checkbutton, _("Include a URL in each graph node so that PDF and imagemap files can be generated that contain active links to the files generated by the 'Generate Web Site' report.")) + self.add_frame_option(_("GraphViz Options"), ' ', self.includeurl_checkbutton) + + self.tb_margin_adjustment = GtkAdjustment(value=0.5, lower=0.25, upper=100.0, step_incr=0.25) + self.lr_margin_adjustment = GtkAdjustment(value=0.5, lower=0.25, upper=100.0, step_incr=0.25) + + self.tb_margin_spinbutton = GtkSpinButton(adj=self.tb_margin_adjustment, digits=2) + self.lr_margin_spinbutton = GtkSpinButton(adj=self.lr_margin_adjustment, digits=2) + + self.add_frame_option(_("GraphViz Options"), _("Top & Bottom Margins"), self.tb_margin_spinbutton) + self.add_frame_option(_("GraphViz Options"), _("Left & Right Margins"), self.lr_margin_spinbutton) + #------------------------------------------------------------------------ # # Functions related to selecting/changing the current file format @@ -181,6 +230,13 @@ class GraphVizDialog(ReportDialog): """The style frame is not used in this dialog.""" pass + def parse_other_frames(self): + self.arrowhead_option = self.arrowhead_optionmenu.get_menu().get_active().get_data('i') + self.includedates = self.includedates_checkbutton.get_active() + self.includeurl = self.includeurl_checkbutton.get_active() + self.tb_margin = self.tb_margin_spinbutton.get_value_as_float() + self.lr_margin = self.lr_margin_spinbutton.get_value_as_float() + #------------------------------------------------------------------------ # # Functions related to creating the actual report document. @@ -204,22 +260,20 @@ class GraphVizDialog(ReportDialog): file.write("center=1;\n") if self.pagecount == _scaled: - file.write("size=\"%3.1fin,%3.1fin\";\n" % (width-0.5,height-0.5)) file.write("ratio=compress;\n") + file.write("size=\"%3.1f,%3.1f\";\n" % (width-(self.lr_margin * 2), + height-(self.tb_margin * 2))) else: file.write("ratio=auto;\n") - if self.pagecount == _multiple: - file.write("page=\"%3.1f,%3.1f\";\n" % (width,height)) + file.write("page=\"%3.1f,%3.1f\";\n" % (width,height)) - if self.orien == PAPER_PORTRAIT: - file.write("orientation=portrait;\n") - else: - file.write("orientation=landscape;\n") + if self.orien == PAPER_LANDSCAPE: + file.write("rotate=90;\n") if len(ind_list) > 1: - dump_index(ind_list,file) - dump_person(ind_list,file) + dump_index(ind_list,file,self.includedates,self.includeurl) + dump_person(ind_list,file,self.arrowhead_option) file.write("}\n") file.close() @@ -237,31 +291,44 @@ def report(database,person): # # #------------------------------------------------------------------------ -def dump_person(person_list,file): +def dump_person(person_list,file,arrowhead_option): for person in person_list: + pid = string.replace(person.getId(),'-','_') family = person.getMainParents() if family == None: continue father = family.getFather() if father and father in person_list: - file.write('p%s -> p%s;\n' % (person.getId(), father.getId())) + fid = string.replace(father.getId(),'-','_') + file.write('p%s -> p%s %s;\n' % (pid, fid, arrowhead_option)) mother = family.getMother() if mother and mother in person_list: - file.write('p%s -> p%s;\n' % (person.getId(), mother.getId())) - + mid = string.replace(mother.getId(),'-','_') + file.write('p%s -> p%s %s;\n' % (pid, mid, arrowhead_option)) #------------------------------------------------------------------------ # # # #------------------------------------------------------------------------ -def dump_index(person_list,file): - +def dump_index(person_list,file,includedates,includeurl): for person in person_list: - name = person.getPrimaryName().getName() - id = person.getId() + label = person.getPrimaryName().getName() + id = string.replace(person.getId(),'-','_') + if includedates: + if person.getBirth().getDateObj().getYearValid(): + birth = '%i' % person.getBirth().getDateObj().getYear() + else: + birth = '' + if person.getDeath().getDateObj().getYearValid(): + death = '%i' % person.getDeath().getDateObj().getYear() + else: + death = '' + label = label + '\\n(%s - %s)' % (birth, death) file.write('p%s [shape=box, ' % id) - file.write('fontname="Arial", label="%s"];\n' % name) + if includeurl: + file.write('URL="%s.html", ' % id) + file.write('fontname="Arial", label="%s"];\n' % label) #------------------------------------------------------------------------ #