def add_menu_options(self, menu): """ Create all the menu options for this report. """ category_name = _("Report Options") pid = PersonOption(_("Center Person")) pid.set_help(_("The Center person for the graph")) menu.add_option(category_name, "pid", pid) stdoptions.add_name_format_option(menu, category_name) stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) max_gen = NumberOption(_('Max Descendant Generations'), 10, 1, 15) max_gen.set_help( _("The number of generations of descendants to " "include in the graph")) menu.add_option(category_name, "maxdescend", max_gen) max_gen = NumberOption(_('Max Ancestor Generations'), 10, 1, 15) max_gen.set_help( _("The number of generations of ancestors to " "include in the graph")) menu.add_option(category_name, "maxascend", max_gen) include_id = EnumeratedListOption(_('Include GID'), 0) include_id.add_item(0, _('Do not include')) include_id.add_item(1, _('Share an existing line')) include_id.add_item(2, _('On a line of its own')) include_id.set_help(_("Whether (and where) to include GIDs")) menu.add_option(category_name, "incid", include_id) stdoptions.add_localization_option(menu, category_name) ################################ category_name = _("Graph Style") ################################ color = EnumeratedListOption(_("Graph coloring"), "filled") for i in range(0, len(_COLORS)): color.add_item(_COLORS[i]["value"], _COLORS[i]["name"]) color.set_help( _("Males will be shown with blue, females " "with red. If the sex of an individual " "is unknown it will be shown with gray.")) menu.add_option(category_name, "color", color) roundedcorners = BooleanOption(_("Use rounded corners"), False) # 2180 roundedcorners.set_help( _("Use rounded corners to differentiate between women and men.")) menu.add_option(category_name, "roundcorners", roundedcorners)
class NumberOfAncestorsOptions(MenuReportOptions): """ Defines options for the NumberOfAncestorsReport. """ def __init__(self, name, dbase): self.__db = dbase self.__pid = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) return _nd.display(person) def add_menu_options(self, menu): """ Add options to the menu for the Number of Ancestors report. """ category_name = _("Report Options") self.__pid = PersonOption(_("Center Person")) self.__pid.set_help(_("The center person for the report")) menu.add_option(category_name, "pid", self.__pid) stdoptions.add_name_format_option(menu, category_name) stdoptions.add_private_data_option(menu, category_name) stdoptions.add_localization_option(menu, category_name) def make_default_style(self, default_style): """Make the default output style for the Number of Ancestors Report.""" font = FontStyle() font.set_size(16) font.set_type_face(FONT_SANS_SERIF) font.set_bold(1) para = ParagraphStyle() para.set_header_level(1) para.set_bottom_border(1) para.set_bottom_margin(utils.pt2cm(8)) para.set_font(font) para.set_alignment(PARA_ALIGN_CENTER) para.set_description(_("The style used for the title of the page.")) default_style.add_paragraph_style("NOA-Title", para) font = FontStyle() font.set_size(12) para = ParagraphStyle() para.set_font(font) para.set_description(_('The basic style used for the text display.')) default_style.add_paragraph_style("NOA-Normal", para)
class BirthdayOptions(MenuReportOptions): """ Options for the Birthday/Anniversary Report """ def __init__(self, name, dbase): self.__db = dbase self.__pid = None self.__filter = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ return self.__filter.get_filter().get_name() def add_menu_options(self, menu): """ Add the options for the text birthday report """ category_name = _("Report Options") year = NumberOption(_("Year of report"), time.localtime()[0], 1000, 3000) year.set_help(_("Year of report")) menu.add_option(category_name, "year", year) self.__filter = FilterOption(_("Filter"), 0) self.__filter.set_help( _("Select filter to restrict people that appear on report")) menu.add_option(category_name, "filter", self.__filter) self.__pid = PersonOption(_("Center Person")) self.__pid.set_help(_("The center person for the report")) menu.add_option(category_name, "pid", self.__pid) self.__pid.connect('value-changed', self.__update_filters) self._nf = stdoptions.add_name_format_option(menu, category_name) self._nf.connect('value-changed', self.__update_filters) self.__update_filters() stdoptions.add_private_data_option(menu, category_name) alive = BooleanOption(_("Include only living people"), True) alive.set_help(_("Include only living people in the report")) menu.add_option(category_name, "alive", alive) country = EnumeratedListOption(_("Country for holidays"), 0) holiday_table = libholiday.HolidayTable() countries = holiday_table.get_countries() countries.sort() if (len(countries) == 0 or (len(countries) > 0 and countries[0] != '')): countries.insert(0, '') count = 0 for c in holiday_table.get_countries(): country.add_item(count, c) count += 1 country.set_help(_("Select the country to see associated holidays")) menu.add_option(category_name, "country", country) start_dow = EnumeratedListOption(_("First day of week"), 1) long_days = date_displayer.long_days for count in range(1, 8): # conversion between gramps numbering (sun=1) and iso numbering (mon=1) of weekdays below start_dow.add_item((count + 5) % 7 + 1, long_days[count].capitalize()) start_dow.set_help( _("Select the first day of the week for the report")) menu.add_option(category_name, "start_dow", start_dow) maiden_name = EnumeratedListOption(_("Birthday surname"), "own") maiden_name.add_item( "spouse_first", _("Wives use husband's surname (from first family listed)")) maiden_name.add_item( "spouse_last", _("Wives use husband's surname (from last family listed)")) maiden_name.add_item("own", _("Wives use their own surname")) maiden_name.set_help(_("Select married women's displayed surname")) menu.add_option(category_name, "maiden_name", maiden_name) birthdays = BooleanOption(_("Include birthdays"), True) birthdays.set_help(_("Include birthdays in the report")) menu.add_option(category_name, "birthdays", birthdays) anniversaries = BooleanOption(_("Include anniversaries"), True) anniversaries.set_help(_("Include anniversaries in the report")) menu.add_option(category_name, "anniversaries", anniversaries) option = BooleanOption(_("Include relationships to center person"), False) option.set_help(_("Include relationships to center person (slower)")) menu.add_option(category_name, "relationships", option) stdoptions.add_localization_option(menu, category_name) category_name = _("Text Options") titletext = StringOption(_("Title text"), _(_TITLE0)) titletext.set_help(_("Title of report")) menu.add_option(category_name, "titletext", titletext) text1 = StringOption(_("Text Area 1"), _(_TITLE1)) text1.set_help(_("First line of text at bottom of report")) menu.add_option(category_name, "text1", text1) text2 = StringOption(_("Text Area 2"), _(_TITLE2)) text2.set_help(_("Second line of text at bottom of report")) menu.add_option(category_name, "text2", text2) text3 = StringOption( _("Text Area 3"), URL_HOMEPAGE, ) text3.set_help(_("Third line of text at bottom of report")) menu.add_option(category_name, "text3", text3) def __update_filters(self): """ Update the filter list based on the selected person """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) nfv = self._nf.get_value() filter_list = utils.get_person_filters(person, include_single=False, name_format=nfv) self.__filter.set_filters(filter_list) def make_my_style(self, default_style, name, description, size=9, font=FONT_SERIF, justified="left", color=None, align=PARA_ALIGN_CENTER, shadow=None, italic=0, bold=0, borders=0, indent=None): """ Create paragraph and graphic styles of the same name """ # Paragraph: f = FontStyle() f.set_size(size) f.set_type_face(font) f.set_italic(italic) f.set_bold(bold) p = ParagraphStyle() p.set_font(f) p.set_alignment(align) p.set_description(description) p.set_top_border(borders) p.set_left_border(borders) p.set_bottom_border(borders) p.set_right_border(borders) if indent: p.set(first_indent=indent) if justified == "left": p.set_alignment(PARA_ALIGN_LEFT) elif justified == "right": p.set_alignment(PARA_ALIGN_RIGHT) elif justified == "center": p.set_alignment(PARA_ALIGN_CENTER) default_style.add_paragraph_style(name, p) # Graphics: g = GraphicsStyle() g.set_paragraph_style(name) if shadow: g.set_shadow(*shadow) if color is not None: g.set_fill_color(color) if not borders: g.set_line_width(0) default_style.add_draw_style(name, g) def make_default_style(self, default_style): """ Add the styles used in this report """ self.make_my_style(default_style, "BIR-Title", _('Title text style'), 14, bold=1, justified="center") self.make_my_style(default_style, "BIR-Datastyle", _('Data text display'), 12, indent=1.0) self.make_my_style(default_style, "BIR-Daystyle", _('Day text style'), 12, indent=.5, italic=1, bold=1) self.make_my_style(default_style, "BIR-Monthstyle", _('Month text style'), 14, bold=1) self.make_my_style(default_style, "BIR-Text1style", _('Text at bottom, line 1'), 12, justified="center") self.make_my_style(default_style, "BIR-Text2style", _('Text at bottom, line 2'), 12, justified="center") self.make_my_style(default_style, "BIR-Text3style", _('Text at bottom, line 3'), 12, justified="center")
class RecordsReportOptions(MenuReportOptions): """ Defines options and provides handling interface. """ def __init__(self, name, dbase): self.__pid = None self.__filter = None self.__db = dbase self._nf = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ return self.__filter.get_filter().get_name() def add_menu_options(self, menu): category_name = _("Report Options") self.__filter = FilterOption(_("Filter"), 0) self.__filter.set_help( _("Determines what people are included in the report.")) menu.add_option(category_name, "filter", self.__filter) self.__filter.connect('value-changed', self.__filter_changed) self.__pid = PersonOption(_("Filter Person")) self.__pid.set_help(_("The center person for the filter")) menu.add_option(category_name, "pid", self.__pid) self.__pid.connect('value-changed', self.__update_filters) self._nf = stdoptions.add_name_format_option(menu, category_name) self._nf.connect('value-changed', self.__update_filters) self.__update_filters() stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) top_size = NumberOption(_("Number of ranks to display"), 3, 1, 100) menu.add_option(category_name, "top_size", top_size) callname = EnumeratedListOption(_("Use call name"), CALLNAME_DONTUSE) callname.set_items([(CALLNAME_DONTUSE, _("Don't use call name")), (CALLNAME_REPLACE, _("Replace first names with call name")), (CALLNAME_UNDERLINE_ADD, _("Underline call name in first names / " "add call name to first name"))]) menu.add_option(category_name, "callname", callname) footer = StringOption(_("Footer text"), "") menu.add_option(category_name, "footer", footer) stdoptions.add_localization_option(menu, category_name) for (text, varname, default) in RECORDS: option = BooleanOption(_(text), default) if varname.startswith('person'): category_name = _("Person Records") elif varname.startswith('family'): category_name = _("Family Records") menu.add_option(category_name, varname, option) def __update_filters(self): """ Update the filter list based on the selected person """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) nfv = self._nf.get_value() filter_list = utils.get_person_filters(person, include_single=False, name_format=nfv) self.__filter.set_filters(filter_list) def __filter_changed(self): """ Handle filter change. If the filter is not specific to a person, disable the person option """ filter_value = self.__filter.get_value() if filter_value in [1, 2, 3, 4]: # Filters 1, 2, 3 and 4 rely on the center person self.__pid.set_available(True) else: # The rest don't self.__pid.set_available(False) def make_default_style(self, default_style): #Paragraph Styles font = FontStyle() font.set_type_face(FONT_SANS_SERIF) font.set_size(16) font.set_bold(True) para = ParagraphStyle() para.set_font(font) para.set_alignment(PARA_ALIGN_CENTER) para.set_description(_("The style used for the title.")) default_style.add_paragraph_style('REC-Title', para) font = FontStyle() font.set_type_face(FONT_SANS_SERIF) font.set_size(12) font.set_bold(True) para = ParagraphStyle() para.set_font(font) para.set_alignment(PARA_ALIGN_CENTER) para.set_description(_("The style used for the subtitle.")) default_style.add_paragraph_style('REC-Subtitle', para) font = FontStyle() font.set_size(12) font.set_bold(True) para = ParagraphStyle() para.set_font(font) para.set_top_margin(utils.pt2cm(6)) para.set_description(_('The style used for headings.')) default_style.add_paragraph_style('REC-Heading', para) font = FontStyle() font.set_size(10) para = ParagraphStyle() para.set_font(font) para.set_left_margin(0.5) para.set_description(_('The basic style used for the text display.')) default_style.add_paragraph_style('REC-Normal', para) font = FontStyle() font.set_size(8) para = ParagraphStyle() para.set_font(font) para.set_alignment(PARA_ALIGN_CENTER) para.set_top_border(True) para.set_top_margin(utils.pt2cm(8)) para.set_description(_('The style used for the footer.')) default_style.add_paragraph_style('REC-Footer', para)
class EndOfLineOptions(MenuReportOptions): """ Defines options and provides handling interface. """ def __init__(self, name, dbase): self.__db = dbase self.__pid = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) return _nd.display(person) def add_menu_options(self, menu): """ Add options to the menu for the End of Line report. """ category_name = _("Report Options") self.__pid = PersonOption(_("Center Person")) self.__pid.set_help(_("The center person for the report")) menu.add_option(category_name, "pid", self.__pid) stdoptions.add_name_format_option(menu, category_name) stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) stdoptions.add_localization_option(menu, category_name) def make_default_style(self, default_style): """Make the default output style for the End of Line Report.""" # Paragraph Styles font = FontStyle() font.set_size(16) font.set_type_face(FONT_SANS_SERIF) font.set_bold(1) para = ParagraphStyle() para.set_header_level(1) para.set_bottom_border(1) para.set_bottom_margin(utils.pt2cm(8)) para.set_font(font) para.set_alignment(PARA_ALIGN_CENTER) para.set_description(_("The style used for the title of the page.")) default_style.add_paragraph_style("EOL-Title", para) font = FontStyle() font.set(face=FONT_SANS_SERIF, size=12, italic=1) para = ParagraphStyle() para.set_bottom_margin(utils.pt2cm(6)) para.set_font(font) para.set_alignment(PARA_ALIGN_CENTER) para.set_description(_('The style used for the section headers.')) default_style.add_paragraph_style("EOL-Subtitle", para) font = FontStyle() font.set_size(10) para = ParagraphStyle() para.set_font(font) para.set_top_margin(utils.pt2cm(6)) para.set_bottom_margin(utils.pt2cm(6)) para.set_description(_('The basic style used for the text display.')) default_style.add_paragraph_style("EOL-Normal", para) font = FontStyle() font.set_size(12) font.set_italic(True) para = ParagraphStyle() para.set_font(font) para.set_top_margin(utils.pt2cm(6)) para.set_description( _('The basic style used for generation headings.')) default_style.add_paragraph_style("EOL-Generation", para) font = FontStyle() font.set_size(8) para = ParagraphStyle() para.set_font(font) para.set_top_margin(0) para.set_bottom_margin(utils.pt2cm(6)) para.set_description(_('The basic style used for the text display.')) default_style.add_paragraph_style("EOL-Pedigree", para) #Table Styles cell = TableCellStyle() default_style.add_cell_style('EOL-TableCell', cell) cell = TableCellStyle() cell.set_bottom_border(1) default_style.add_cell_style('EOL_GenerationCell', cell) table = TableStyle() table.set_width(100) table.set_columns(2) table.set_column_width(0, 10) table.set_column_width(1, 90) default_style.add_table_style('EOL-Table', table)
class DescendantOptions(MenuReportOptions): """ Defines options and provides handling interface. """ def __init__(self, name, dbase): self.__db = dbase self.__pid = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) return _nd.display(person) def add_menu_options(self, menu): category_name = _("Report Options") self.__pid = PersonOption(_("Center Person")) self.__pid.set_help(_("The center person for the report")) menu.add_option(category_name, "pid", self.__pid) stdoptions.add_name_format_option(menu, category_name) stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) numbering = EnumeratedListOption(_("Numbering system"), "Simple") numbering.set_items([ ("Simple", _("Simple numbering")), ("d'Aboville", _("d'Aboville numbering")), ("Henry", _("Henry numbering")), ("Modified Henry", _("Modified Henry numbering")), ("de Villiers/Pama", _("de Villiers/Pama numbering")), ("Meurgey de Tupigny", _("Meurgey de Tupigny numbering")) ]) numbering.set_help(_("The numbering system to be used")) menu.add_option(category_name, "numbering", numbering) gen = NumberOption(_("Generations"), 10, 1, 15) gen.set_help(_("The number of generations to include in the report")) menu.add_option(category_name, "gen", gen) marrs = BooleanOption(_('Show marriage info'), False) marrs.set_help( _("Whether to show marriage information in the report.")) menu.add_option(category_name, "marrs", marrs) divs = BooleanOption(_('Show divorce info'), False) divs.set_help(_("Whether to show divorce information in the report.")) menu.add_option(category_name, "divs", divs) dups = BooleanOption(_('Show duplicate trees'), True) dups.set_help( _("Whether to show duplicate Family Trees in the report.")) menu.add_option(category_name, "dups", dups) stdoptions.add_localization_option(menu, category_name) def make_default_style(self, default_style): """Make the default output style for the Descendant Report.""" fstyle = FontStyle() fstyle.set_size(12) fstyle.set_type_face(FONT_SANS_SERIF) fstyle.set_bold(1) pstyle = ParagraphStyle() pstyle.set_header_level(1) pstyle.set_bottom_border(1) pstyle.set_top_margin(utils.pt2cm(3)) pstyle.set_bottom_margin(utils.pt2cm(3)) pstyle.set_font(fstyle) pstyle.set_alignment(PARA_ALIGN_CENTER) pstyle.set_description(_("The style used for the title of the page.")) default_style.add_paragraph_style("DR-Title", pstyle) fstyle = FontStyle() fstyle.set_size(10) for i in range(1, 33): pstyle = ParagraphStyle() pstyle.set_font(fstyle) pstyle.set_top_margin(utils.pt2cm(fstyle.get_size() * 0.125)) pstyle.set_bottom_margin(utils.pt2cm(fstyle.get_size() * 0.125)) pstyle.set_first_indent(-0.5) pstyle.set_left_margin(min(10.0, float(i - 0.5))) pstyle.set_description( _("The style used for the level %d display.") % i) default_style.add_paragraph_style("DR-Level%d" % min(i, 32), pstyle) pstyle = ParagraphStyle() pstyle.set_font(fstyle) pstyle.set_top_margin(utils.pt2cm(fstyle.get_size() * 0.125)) pstyle.set_bottom_margin(utils.pt2cm(fstyle.get_size() * 0.125)) pstyle.set_left_margin(min(10.0, float(i - 0.5))) pstyle.set_description( _("The style used for the spouse level %d display.") % i) default_style.add_paragraph_style("DR-Spouse%d" % min(i, 32), pstyle)
class KinshipOptions(MenuReportOptions): """ Defines options and provides handling interface. """ def __init__(self, name, dbase): self.__db = dbase self.__pid = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) return _nd.display(person) def add_menu_options(self, menu): """ Add options to the menu for the kinship report. """ category_name = _("Report Options") self.__pid = PersonOption(_("Center Person")) self.__pid.set_help(_("The center person for the report")) menu.add_option(category_name, "pid", self.__pid) stdoptions.add_name_format_option(menu, category_name) stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) maxdescend = NumberOption(_("Max Descendant Generations"), 2, 1, 20) maxdescend.set_help(_("The maximum number of descendant generations")) menu.add_option(category_name, "maxdescend", maxdescend) maxascend = NumberOption(_("Max Ancestor Generations"), 2, 1, 20) maxascend.set_help(_("The maximum number of ancestor generations")) menu.add_option(category_name, "maxascend", maxascend) incspouses = BooleanOption(_("Include spouses"), True) incspouses.set_help(_("Whether to include spouses")) menu.add_option(category_name, "incspouses", incspouses) inccousins = BooleanOption(_("Include cousins"), True) inccousins.set_help(_("Whether to include cousins")) menu.add_option(category_name, "inccousins", inccousins) incaunts = BooleanOption(_("Include aunts/uncles/nephews/nieces"), True) incaunts.set_help(_("Whether to include aunts/uncles/nephews/nieces")) menu.add_option(category_name, "incaunts", incaunts) stdoptions.add_localization_option(menu, category_name) def make_default_style(self, default_style): """Make the default output style for the Kinship Report.""" font = FontStyle() font.set_size(16) font.set_type_face(FONT_SANS_SERIF) font.set_bold(1) para = ParagraphStyle() para.set_header_level(1) para.set_bottom_border(1) para.set_bottom_margin(utils.pt2cm(8)) para.set_font(font) para.set_alignment(PARA_ALIGN_CENTER) para.set_description(_("The style used for the title of the page.")) default_style.add_paragraph_style("KIN-Title", para) font = FontStyle() font.set_size(12) font.set_bold(True) para = ParagraphStyle() para.set_header_level(3) para.set_font(font) para.set_top_margin(utils.pt2cm(6)) para.set_description(_('The basic style used for sub-headings.')) default_style.add_paragraph_style("KIN-Subtitle", para) font = FontStyle() font.set_size(10) para = ParagraphStyle() para.set_font(font) para.set_left_margin(0.5) para.set_description(_('The basic style used for the text display.')) default_style.add_paragraph_style("KIN-Normal", para)
class RelGraphOptions(MenuReportOptions): """ Defines options and provides handling interface. """ def __init__(self, name, dbase): self.__pid = None self.__filter = None self.__show_relships = None self.__show_ga_gb = None self.__include_images = None self.__image_on_side = None self.__db = dbase self._nf = None self.event_choice = None MenuReportOptions.__init__(self, name, dbase) def add_menu_options(self, menu): ################################ category_name = _("Report Options") add_option = partial(menu.add_option, category_name) ################################ self.__filter = FilterOption(_("Filter"), 0) self.__filter.set_help( _("Determines what people are included in the graph")) add_option("filter", self.__filter) self.__filter.connect('value-changed', self.__filter_changed) self.__pid = PersonOption(_("Center Person")) self.__pid.set_help(_("The center person for the report")) menu.add_option(category_name, "pid", self.__pid) self.__pid.connect('value-changed', self.__update_filters) self._nf = stdoptions.add_name_format_option(menu, category_name) self._nf.connect('value-changed', self.__update_filters) self.__update_filters() stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) stdoptions.add_localization_option(menu, category_name) ################################ add_option = partial(menu.add_option, _("Include")) ################################ self.event_choice = EnumeratedListOption(_('Dates and/or Places'), 0) self.event_choice.add_item(0, _('Do not include any dates or places')) self.event_choice.add_item( 1, _('Include (birth, marriage, death) ' 'dates, but no places')) self.event_choice.add_item( 2, _('Include (birth, marriage, death) ' 'dates, and places')) self.event_choice.add_item( 3, _('Include (birth, marriage, death) ' 'dates, and places if no dates')) self.event_choice.add_item( 4, _('Include (birth, marriage, death) ' 'years, but no places')) self.event_choice.add_item( 5, _('Include (birth, marriage, death) ' 'years, and places')) self.event_choice.add_item( 6, _('Include (birth, marriage, death) ' 'places, but no dates')) self.event_choice.add_item( 7, _('Include (birth, marriage, death) ' 'dates and places on same line')) self.event_choice.set_help(_("Whether to include dates and/or places")) add_option("event_choice", self.event_choice) url = BooleanOption(_("Include URLs"), False) url.set_help( _("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 'Narrated " "Web Site' report.")) add_option("url", url) include_id = EnumeratedListOption(_('Include GID'), 0) include_id.add_item(0, _('Do not include')) include_id.add_item(1, _('Share an existing line')) include_id.add_item(2, _('On a line of its own')) include_id.set_help(_("Whether (and where) to include GIDs")) add_option("incid", include_id) self.__show_relships = BooleanOption( _("Include relationship to center person"), False) self.__show_relships.set_help( _("Whether to show every person's " "relationship to the center person")) add_option("increlname", self.__show_relships) self.__show_relships.connect('value-changed', self.__show_relships_changed) self.__include_images = BooleanOption( _('Include thumbnail images of people'), False) self.__include_images.set_help( _("Whether to include thumbnails of people.")) add_option("includeImages", self.__include_images) self.__include_images.connect('value-changed', self.__image_changed) self.__image_on_side = EnumeratedListOption(_("Thumbnail Location"), 0) self.__image_on_side.add_item(0, _('Above the name')) self.__image_on_side.add_item(1, _('Beside the name')) self.__image_on_side.set_help( _("Where the thumbnail image should appear relative to the name")) add_option("imageOnTheSide", self.__image_on_side) #occupation = BooleanOption(_("Include occupation"), False) occupation = EnumeratedListOption(_('Include occupation'), 0) occupation.add_item(0, _('Do not include any occupation')) occupation.add_item( 1, _('Include description ' 'of most recent occupation')) occupation.add_item( 2, _('Include date, description and place ' 'of all occupations')) occupation.set_help(_("Whether to include the last occupation")) add_option("occupation", occupation) if __debug__: self.__show_ga_gb = BooleanOption( _("Include relationship " "debugging numbers also"), False) self.__show_ga_gb.set_help( _("Whether to include 'Ga' and 'Gb' " "also, to debug the relationship " "calculator")) add_option("advrelinfo", self.__show_ga_gb) ################################ add_option = partial(menu.add_option, _("Graph Style")) ################################ color = EnumeratedListOption(_("Graph coloring"), 'filled') for i in range(0, len(_COLORS)): color.add_item(_COLORS[i]["value"], _COLORS[i]["name"]) color.set_help( _("Males will be shown with blue, females " "with red. If the sex of an individual " "is unknown it will be shown with gray.")) add_option("color", color) color_males = ColorOption(_('Males'), '#e0e0ff') color_males.set_help(_('The color to use to display men.')) add_option('colormales', color_males) color_females = ColorOption(_('Females'), '#ffe0e0') color_females.set_help(_('The color to use to display women.')) add_option('colorfemales', color_females) color_unknown = ColorOption(_('Unknown'), '#e0e0e0') color_unknown.set_help( _('The color to use when the gender is unknown.')) add_option('colorunknown', color_unknown) color_family = ColorOption(_('Families'), '#ffffe0') color_family.set_help(_('The color to use to display families.')) add_option('colorfamilies', color_family) arrow = EnumeratedListOption(_("Arrowhead direction"), 'd') for i in range(0, len(_ARROWS)): arrow.add_item(_ARROWS[i]["value"], _ARROWS[i]["name"]) arrow.set_help(_("Choose the direction that the arrows point.")) add_option("arrow", arrow) # see bug report #2180 roundedcorners = BooleanOption(_("Use rounded corners"), False) roundedcorners.set_help( _("Use rounded corners to differentiate " "between women and men.")) add_option("useroundedcorners", roundedcorners) dashed = BooleanOption( _("Indicate non-birth relationships with dotted lines"), True) dashed.set_help( _("Non-birth relationships will show up " "as dotted lines in the graph.")) add_option("dashed", dashed) showfamily = BooleanOption(_("Show family nodes"), True) showfamily.set_help( _("Families will show up as ellipses, linked " "to parents and children.")) add_option("showfamily", showfamily) def __update_filters(self): """ Update the filter list based on the selected person """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) nfv = self._nf.get_value() filter_list = utils.get_person_filters(person, include_single=False, name_format=nfv) self.__filter.set_filters(filter_list) def __filter_changed(self): """ Handle filter change. If the filter is not specific to a person, disable the person option """ filter_value = self.__filter.get_value() if filter_value in [1, 2, 3, 4]: # Filters 1, 2, 3 and 4 rely on the center person self.__pid.set_available(True) elif self.__show_relships and self.__show_relships.get_value(): self.__pid.set_available(True) else: # The rest don't self.__pid.set_available(False) def __image_changed(self): """ Handle thumbnail change. If the image is not to be included, make the image location option unavailable. """ self.__image_on_side.set_available(self.__include_images.get_value()) def __show_relships_changed(self): """ Enable/disable menu items if relationships are required """ if self.__show_ga_gb: self.__show_ga_gb.set_available(self.__show_relships.get_value()) self.__filter_changed()
class IndivCompleteOptions(MenuReportOptions): """ Defines options and provides handling interface. """ def __init__(self, name, dbase): self.__db = dbase self.__pid = None self.__filter = None self.__cites = None self.__incsrcnotes = None self._nf = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ return self.__filter.get_filter().get_name() def add_menu_options(self, menu): ################################ category_name = _("Report Options") ################################ self.__filter = FilterOption(_("Filter"), 0) self.__filter.set_help( _("Select the filter to be applied to the report.")) menu.add_option(category_name, "filter", self.__filter) self.__filter.connect('value-changed', self.__filter_changed) self.__pid = PersonOption(_("Filter Person")) self.__pid.set_help(_("The center person for the filter.")) menu.add_option(category_name, "pid", self.__pid) self.__pid.connect('value-changed', self.__update_filters) self._nf = stdoptions.add_name_format_option(menu, category_name) self._nf.connect('value-changed', self.__update_filters) self.__update_filters() stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) sort = BooleanOption(_("List events chronologically"), True) sort.set_help(_("Whether to sort events into chronological order.")) menu.add_option(category_name, "sort", sort) pageben = BooleanOption(_("Page break before end notes"), False) pageben.set_help( _("Whether to start a new page before the end notes.")) menu.add_option(category_name, "pageben", pageben) stdoptions.add_localization_option(menu, category_name) ################################ category_name = _("Include") ################################ self.__cites = BooleanOption(_("Include Source Information"), True) self.__cites.set_help(_("Whether to cite sources.")) menu.add_option(category_name, "cites", self.__cites) self.__cites.connect('value-changed', self.__sources_changed) self.__incsrcnotes = BooleanOption(_("Include sources notes"), False) self.__incsrcnotes.set_help( _("Whether to include source notes in the Endnotes section. " "Only works if Include sources is selected.")) menu.add_option(category_name, "incsrcnotes", self.__incsrcnotes) self.__incsrcnotes.connect('value-changed', self.__sources_changed) self.__sources_changed() images = BooleanOption(_("Include Photo/Images from Gallery"), True) images.set_help(_("Whether to include images.")) menu.add_option(category_name, "images", images) attributes = BooleanOption(_("Include Attributes"), True) attributes.set_help(_("Whether to include attributes.")) menu.add_option(category_name, "incl_attrs", attributes) census = BooleanOption(_("Include Census Events"), True) census.set_help(_("Whether to include Census Events.")) menu.add_option(category_name, "incl_census", census) grampsid = BooleanOption(_("Include GID"), False) grampsid.set_help(_("Whether to include GID next to names.")) menu.add_option(category_name, "grampsid", grampsid) incl_notes = BooleanOption(_("Include Notes"), True) incl_notes.set_help(_("Whether to include Person and Family Notes.")) menu.add_option(category_name, "incl_notes", incl_notes) tags = BooleanOption(_("Include Tags"), True) tags.set_help(_("Whether to include tags.")) menu.add_option(category_name, "incl_tags", tags) ################################ category_name = _("Sections") ################################ opt = BooleanListOption(_("Event groups")) opt.set_help(_("Check if a separate section is required.")) for section in SECTION_LIST: if section != SECTION_LIST[0]: opt.add_button(_(section), True) menu.add_option(category_name, "sections", opt) def __update_filters(self): """ Update the filter list based on the selected person """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) nfv = self._nf.get_value() filter_list = utils.get_person_filters(person, include_single=True, name_format=nfv) self.__filter.set_filters(filter_list) def __filter_changed(self): """ Handle filter change. If the filter is not specific to a person, disable the person option """ filter_value = self.__filter.get_value() if filter_value in [0, 2, 3, 4, 5]: # Filters 0, 2, 3, 4 and 5 rely on the center person self.__pid.set_available(True) else: # The rest don't self.__pid.set_available(False) def __sources_changed(self): """ If Endnotes are not enabled, disable sources in the Endnotes. """ cites_value = self.__cites.get_value() if cites_value: self.__incsrcnotes.set_available(True) else: self.__incsrcnotes.set_available(False) def make_default_style(self, default_style): """Make the default output style for the Individual Complete Report.""" # Paragraph Styles font = FontStyle() font.set_bold(1) font.set_type_face(FONT_SANS_SERIF) font.set_size(16) para = ParagraphStyle() para.set_alignment(PARA_ALIGN_CENTER) para.set_top_margin(utils.pt2cm(8)) para.set_bottom_margin(utils.pt2cm(8)) para.set_font(font) para.set_description(_("The style used for the title of the page.")) default_style.add_paragraph_style("IDS-Title", para) font = FontStyle() font.set_bold(1) font.set_type_face(FONT_SANS_SERIF) font.set_size(12) font.set_italic(1) para = ParagraphStyle() para.set_font(font) para.set_top_margin(utils.pt2cm(3)) para.set_bottom_margin(utils.pt2cm(3)) para.set_description(_("The style used for category labels.")) default_style.add_paragraph_style("IDS-TableTitle", para) font = FontStyle() font.set_bold(1) font.set_type_face(FONT_SANS_SERIF) font.set_size(12) para = ParagraphStyle() para.set_font(font) para.set_top_margin(utils.pt2cm(3)) para.set_bottom_margin(utils.pt2cm(3)) para.set_description(_("The style used for the spouse's name.")) default_style.add_paragraph_style("IDS-Spouse", para) font = FontStyle() font.set_size(12) para = ParagraphStyle() para.set_font(font) para.set_top_margin(utils.pt2cm(3)) para.set_bottom_margin(utils.pt2cm(3)) para.set_description(_('The basic style used for the text display.')) default_style.add_paragraph_style("IDS-Normal", para) font = FontStyle() font.set_size(12) font.set_italic(1) para = ParagraphStyle() para.set_font(font) para.set_top_margin(utils.pt2cm(3)) para.set_bottom_margin(utils.pt2cm(3)) para.set_description(_('The style used for the section headers.')) default_style.add_paragraph_style("IDS-Section", para) font = FontStyle() font.set_size(8) para = ParagraphStyle() para.set_alignment(PARA_ALIGN_RIGHT) para.set_font(font) para.set_top_margin(utils.pt2cm(3)) para.set_bottom_margin(utils.pt2cm(3)) para.set_description(_('A style used for image facts.')) default_style.add_paragraph_style("IDS-ImageNote", para) font = FontStyle() font.set_size(8) para = ParagraphStyle() para.set_alignment(PARA_ALIGN_CENTER) para.set_font(font) para.set_top_margin(utils.pt2cm(3)) para.set_bottom_margin(utils.pt2cm(3)) para.set_description(_('A style used for image captions.')) default_style.add_paragraph_style("IDS-ImageCaptionCenter", para) # Table Styles tbl = TableStyle() tbl.set_width(100) tbl.set_columns(2) tbl.set_column_width(0, 20) tbl.set_column_width(1, 80) default_style.add_table_style("IDS-IndTable", tbl) tbl = TableStyle() tbl.set_width(100) tbl.set_columns(2) tbl.set_column_width(0, 50) tbl.set_column_width(1, 50) default_style.add_table_style("IDS-ParentsTable", tbl) cell = TableCellStyle() cell.set_top_border(1) cell.set_bottom_border(1) default_style.add_cell_style("IDS-TableHead", cell) cell = TableCellStyle() default_style.add_cell_style("IDS-NormalCell", cell) cell = TableCellStyle() cell.set_longlist(1) default_style.add_cell_style("IDS-ListCell", cell) tbl = TableStyle() tbl.set_width(100) tbl.set_columns(3) tbl.set_column_width(0, 20) tbl.set_column_width(1, 50) tbl.set_column_width(2, 30) default_style.add_table_style('IDS-PersonTable', tbl) tbl = TableStyle() tbl.set_width(100) tbl.set_columns(2) tbl.set_column_width(0, 20) tbl.set_column_width(1, 80) default_style.add_table_style('IDS-PersonTable2', tbl) tbl = TableStyle() tbl.set_width(100) tbl.set_columns(5) tbl.set_column_width(0, 22) # Type tbl.set_column_width(1, 22) # Date tbl.set_column_width(2, 16) # Status tbl.set_column_width(3, 22) # Temple tbl.set_column_width(4, 18) # Place default_style.add_table_style('IDS-OrdinanceTable', tbl) tbl = TableStyle() tbl.set_width(100) tbl.set_columns(6) tbl.set_column_width(0, 20) # empty tbl.set_column_width(1, 18) # Type tbl.set_column_width(2, 18) # Date tbl.set_column_width(3, 14) # Status tbl.set_column_width(4, 18) # Temple tbl.set_column_width(5, 12) # Place default_style.add_table_style('IDS-OrdinanceTable2', tbl) tbl = TableStyle() tbl.set_width(100) tbl.set_columns(3) tbl.set_column_width(0, 33) tbl.set_column_width(1, 33) tbl.set_column_width(2, 34) default_style.add_table_style("IDS-GalleryTable", tbl) Endnotes.add_endnote_styles(default_style)
class TimeLineOptions(MenuReportOptions): """ Options for the TimeLine Report """ def __init__(self, name, dbase): self.__pid = None self.__filter = None self.__db = dbase self._nf = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ return self.__filter.get_filter().get_name() def add_menu_options(self, menu): category_name = _("Report Options") self.__filter = FilterOption(_("Filter"), 0) self.__filter.set_help( _("Determines what people are included in the report")) menu.add_option(category_name, "filter", self.__filter) self.__filter.connect('value-changed', self.__filter_changed) self.__pid = PersonOption(_("Filter Person")) self.__pid.set_help(_("The center person for the filter")) menu.add_option(category_name, "pid", self.__pid) self.__pid.connect('value-changed', self.__update_filters) self._nf = stdoptions.add_name_format_option(menu, category_name) self._nf.connect('value-changed', self.__update_filters) self.__update_filters() stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) sortby = EnumeratedListOption(_('Sort by'), 0) idx = 0 for item in _get_sort_functions(Sort(self.__db)): sortby.add_item(idx, _(item[0])) idx += 1 sortby.set_help(_("Sorting method to use")) menu.add_option(category_name, "sortby", sortby) stdoptions.add_localization_option(menu, category_name) def __update_filters(self): """ Update the filter list based on the selected person """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) nfv = self._nf.get_value() filter_list = utils.get_person_filters(person, include_single=False, name_format=nfv) self.__filter.set_filters(filter_list) def __filter_changed(self): """ Handle filter change. If the filter is not specific to a person, disable the person option """ filter_value = self.__filter.get_value() if filter_value in [1, 2, 3, 4]: # Filters 1, 2, 3 and 4 rely on the center person self.__pid.set_available(True) else: # The rest don't self.__pid.set_available(False) def make_default_style(self, default_style): """Make the default output style for the Timeline report.""" # Paragraph Styles fstyle = FontStyle() fstyle.set_size(10) fstyle.set_type_face(FONT_SANS_SERIF) pstyle = ParagraphStyle() pstyle.set_font(fstyle) pstyle.set_description(_("The style used for the person's name.")) default_style.add_paragraph_style("TLG-Name", pstyle) fstyle = FontStyle() fstyle.set_size(8) fstyle.set_type_face(FONT_SANS_SERIF) pstyle = ParagraphStyle() pstyle.set_font(fstyle) pstyle.set_alignment(PARA_ALIGN_CENTER) pstyle.set_description(_("The style used for the year labels.")) default_style.add_paragraph_style("TLG-Label", pstyle) fstyle = FontStyle() fstyle.set_size(14) fstyle.set_type_face(FONT_SANS_SERIF) pstyle = ParagraphStyle() pstyle.set_font(fstyle) pstyle.set_alignment(PARA_ALIGN_CENTER) pstyle.set_description(_("The style used for the title of the page.")) default_style.add_paragraph_style("TLG-Title", pstyle) """ Graphic Styles TLG-grid - 0.5pt wide line dashed line. Used for the lines that make up the grid. TLG-line - 0.5pt wide line. Used for the line connecting two endpoints and for the birth marker. TLG-solid - 0.5pt line with a black fill color. Used for the date of death marker. TLG-text - Contains the TLG-Name paragraph style used for the individual's name. TLG-title - Contains the TLG-Title paragraph style used for the title of the document. TLG-label - Contains the TLG-Label paragraph style used for the year label's in the document. """ gstyle = GraphicsStyle() gstyle.set_line_width(0.5) gstyle.set_color((0, 0, 0)) default_style.add_draw_style("TLG-line", gstyle) gstyle = GraphicsStyle() gstyle.set_line_width(0.5) gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((0, 0, 0)) default_style.add_draw_style("TLG-solid", gstyle) gstyle = GraphicsStyle() gstyle.set_line_width(0.5) gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 255, 255)) default_style.add_draw_style("open", gstyle) gstyle = GraphicsStyle() gstyle.set_line_width(0.5) gstyle.set_line_style(DASHED) gstyle.set_color((0, 0, 0)) default_style.add_draw_style("TLG-grid", gstyle) gstyle = GraphicsStyle() gstyle.set_paragraph_style("TLG-Name") gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 255, 255)) gstyle.set_line_width(0) default_style.add_draw_style("TLG-text", gstyle) gstyle = GraphicsStyle() gstyle.set_paragraph_style("TLG-Title") gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 255, 255)) gstyle.set_line_width(0) default_style.add_draw_style("TLG-title", gstyle) gstyle = GraphicsStyle() gstyle.set_paragraph_style("TLG-Label") gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 255, 255)) gstyle.set_line_width(0) default_style.add_draw_style("TLG-label", gstyle)
class FanChartOptions(MenuReportOptions): """ options for fanchart report """ def __init__(self, name, dbase): self.__db = dbase self.__pid = None self.max_generations = 11 MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) return _nd.display(person) def add_menu_options(self, menu): """ Add options to the menu for the fan chart. """ category_name = _("Report Options") self.__pid = PersonOption(_("Center Person")) self.__pid.set_help(_("The center person for the report")) menu.add_option(category_name, "pid", self.__pid) stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) max_gen = NumberOption(_("Generations"), 5, 1, self.max_generations) max_gen.set_help( _("The number of generations " "to include in the report")) menu.add_option(category_name, "maxgen", max_gen) circle = EnumeratedListOption(_('Type of graph'), HALF_CIRCLE) circle.add_item(FULL_CIRCLE, _('full circle')) circle.add_item(HALF_CIRCLE, _('half circle')) circle.add_item(QUAR_CIRCLE, _('quarter circle')) circle.set_help( _("The form of the graph: full circle, half circle," " or quarter circle.")) menu.add_option(category_name, "circle", circle) background = EnumeratedListOption(_('Background color'), BACKGROUND_GEN) background.add_item(BACKGROUND_WHITE, _('white')) background.add_item(BACKGROUND_GEN, _('generation dependent')) background.set_help( _("Background color is either white or generation" " dependent")) menu.add_option(category_name, "background", background) radial = EnumeratedListOption(_('Orientation of radial texts'), RADIAL_UPRIGHT) radial.add_item(RADIAL_UPRIGHT, _('upright')) radial.add_item(RADIAL_ROUNDABOUT, _('roundabout')) radial.set_help(_("Print radial texts upright or roundabout")) menu.add_option(category_name, "radial", radial) draw_empty = BooleanOption(_("Draw empty boxes"), True) draw_empty.set_help( _("Draw the background " "although there is no information")) menu.add_option(category_name, "draw_empty", draw_empty) same_style = BooleanOption( _("Use one font style " "for all generations"), True) same_style.set_help( _("You can customize font and color " "for each generation in the style editor")) menu.add_option(category_name, "same_style", same_style) stdoptions.add_localization_option(menu, category_name) def make_default_style(self, default_style): """Make the default output style for the Fan Chart report.""" background_colors = [(255, 63, 0), (255, 175, 15), (255, 223, 87), (255, 255, 111), (159, 255, 159), (111, 215, 255), (79, 151, 255), (231, 23, 255), (231, 23, 221), (210, 170, 124), (189, 153, 112)] #Paragraph Styles f_style = FontStyle() f_style.set_size(18) f_style.set_bold(1) f_style.set_type_face(FONT_SANS_SERIF) p_style = ParagraphStyle() p_style.set_font(f_style) p_style.set_alignment(PARA_ALIGN_CENTER) p_style.set_description(_('The style used for the title.')) default_style.add_paragraph_style("FC-Title", p_style) f_style = FontStyle() f_style.set_size(9) f_style.set_type_face(FONT_SANS_SERIF) p_style = ParagraphStyle() p_style.set_font(f_style) p_style.set_alignment(PARA_ALIGN_CENTER) p_style.set_description( _('The basic style used for the default text display.')) default_style.add_paragraph_style("FC-Text", p_style) for i in range(0, self.max_generations): f_style = FontStyle() f_style.set_size(9) f_style.set_type_face(FONT_SANS_SERIF) p_style = ParagraphStyle() p_style.set_font(f_style) p_style.set_alignment(PARA_ALIGN_CENTER) p_style.set_description( _('The style used for the text display of generation "%d"') % i) default_style.add_paragraph_style("FC-Text" + "%02d" % i, p_style) # GraphicsStyles g_style = GraphicsStyle() g_style.set_paragraph_style('FC-Title') default_style.add_draw_style('FC-Graphic-title', g_style) for i in range(0, self.max_generations): g_style = GraphicsStyle() g_style.set_paragraph_style('FC-Text' + '%02d' % i) g_style.set_fill_color(background_colors[i]) default_style.add_draw_style('FC-Graphic' + '%02d' % i, g_style)
class DetAncestorOptions(MenuReportOptions): """ Defines options and provides handling interface. """ def __init__(self, name, dbase): self.__db = dbase self.__pid = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) return _nd.display(person) def add_menu_options(self, menu): from functools import partial # Report Options category = _("Report Options") addopt = partial(menu.add_option, category) self.__pid = PersonOption(_("Center Person")) self.__pid.set_help(_("The center person for the report")) addopt("pid", self.__pid) start_number = NumberOption(_("Sosa-Stradonitz number"), 1, 1, 16384) start_number.set_help( _('The Sosa-Stradonitz number of the central person.')) addopt("initial_sosa", start_number) stdoptions.add_name_format_option(menu, category) stdoptions.add_private_data_option(menu, category) stdoptions.add_living_people_option(menu, category) gen = NumberOption(_("Generations"), 10, 1, 100) gen.set_help(_("The number of generations to include in the report")) addopt("gen", gen) pagebbg = BooleanOption(_("Page break between generations"), False) pagebbg.set_help( _("Whether to start a new page after each generation.")) addopt("pagebbg", pagebbg) pageben = BooleanOption(_("Page break before end notes"), False) pageben.set_help( _("Whether to start a new page before the end notes.")) addopt("pageben", pageben) stdoptions.add_localization_option(menu, category) # Content options addopt = partial(menu.add_option, _("Content")) usecall = BooleanOption(_("Use callname for common name"), False) usecall.set_help(_("Whether to use the call name as the first name.")) addopt("usecall", usecall) fulldates = BooleanOption( _("Use full dates instead of only the year"), True) fulldates.set_help( _("Whether to use full dates instead of just year.")) addopt("fulldates", fulldates) listc = BooleanOption(_("List children"), True) listc.set_help(_("Whether to list children.")) addopt("listc", listc) computeage = BooleanOption(_("Compute death age"), True) computeage.set_help(_("Whether to compute a person's age at death.")) addopt("computeage", computeage) omitda = BooleanOption(_("Omit duplicate ancestors"), True) omitda.set_help(_("Whether to omit duplicate ancestors.")) addopt("omitda", omitda) verbose = BooleanOption(_("Use Complete Sentences"), True) verbose.set_help( _("Whether to use complete sentences or succinct language.")) addopt("verbose", verbose) desref = BooleanOption( _("Add descendant reference in child list"), True) desref.set_help( _("Whether to add descendant references in child list.")) addopt("desref", desref) # What to include addopt = partial(menu.add_option, _("Include")) incnotes = BooleanOption(_("Include notes"), True) incnotes.set_help(_("Whether to include notes.")) addopt("incnotes", incnotes) incattrs = BooleanOption(_("Include attributes"), False) incattrs.set_help(_("Whether to include attributes.")) addopt("incattrs", incattrs) incphotos = BooleanOption(_("Include Photo/Images from Gallery"), False) incphotos.set_help(_("Whether to include images.")) addopt("incphotos", incphotos) incnames = BooleanOption(_("Include alternative names"), False) incnames.set_help(_("Whether to include other names.")) addopt("incnames", incnames) incevents = BooleanOption(_("Include events"), False) incevents.set_help(_("Whether to include events.")) addopt("incevents", incevents) incaddresses = BooleanOption(_("Include addresses"), False) incaddresses.set_help(_("Whether to include addresses.")) addopt("incaddresses", incaddresses) incsources = BooleanOption(_("Include sources"), False) incsources.set_help(_("Whether to include source references.")) addopt("incsources", incsources) incsrcnotes = BooleanOption(_("Include sources notes"), False) incsrcnotes.set_help(_("Whether to include source notes in the " "Endnotes section. Only works if " "Include sources is selected.")) addopt("incsrcnotes", incsrcnotes) incotherevents = BooleanOption(_("Include other events"), False) incotherevents.set_help(_("Whether to include other events " "people participated in.")) addopt("incotherevents", incotherevents) # How to handle missing information addopt = partial(menu.add_option, _("Missing information")) repplace = BooleanOption(_("Replace missing places with ______"), False) repplace.set_help(_("Whether to replace missing Places with blanks.")) addopt("repplace", repplace) repdate = BooleanOption(_("Replace missing dates with ______"), False) repdate.set_help(_("Whether to replace missing Dates with blanks.")) addopt("repdate", repdate) def make_default_style(self, default_style): """Make the default output style for the Detailed Ancestral Report""" font = FontStyle() font.set(face=FONT_SANS_SERIF, size=16, bold=1) para = ParagraphStyle() para.set_font(font) para.set_header_level(1) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_alignment(PARA_ALIGN_CENTER) para.set_description(_('The style used for the title of the page.')) default_style.add_paragraph_style("DAR-Title", para) font = FontStyle() font.set(face=FONT_SANS_SERIF, size=14, italic=1) para = ParagraphStyle() para.set_font(font) para.set_header_level(2) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for the generation header.')) default_style.add_paragraph_style("DAR-Generation", para) font = FontStyle() font.set(face=FONT_SANS_SERIF, size=10, italic=0, bold=1) para = ParagraphStyle() para.set_font(font) para.set_left_margin(1.0) # in centimeters para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for the children list title.')) default_style.add_paragraph_style("DAR-ChildTitle", para) font = FontStyle() font.set(size=10) para = ParagraphStyle() para.set_font(font) para.set(first_indent=-0.75, lmargin=1.75) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for the children list.')) default_style.add_paragraph_style("DAR-ChildList", para) font = FontStyle() font.set(face=FONT_SANS_SERIF, size=10, italic=0, bold=1) para = ParagraphStyle() para.set_font(font) para.set(first_indent=0.0, lmargin=1.0) para.set_top_margin(0.25) para.set_bottom_margin(0.25) default_style.add_paragraph_style("DAR-NoteHeader", para) para = ParagraphStyle() para.set(lmargin=1.0) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The basic style used for the text display.')) default_style.add_paragraph_style("DAR-Entry", para) para = ParagraphStyle() para.set(first_indent=-1.0, lmargin=1.0) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for the first personal entry.')) default_style.add_paragraph_style("DAR-First-Entry", para) font = FontStyle() font.set(size=10, face=FONT_SANS_SERIF, bold=1) para = ParagraphStyle() para.set_font(font) para.set(first_indent=0.0, lmargin=1.0) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for the More About header.')) default_style.add_paragraph_style("DAR-MoreHeader", para) font = FontStyle() font.set(face=FONT_SERIF, size=10) para = ParagraphStyle() para.set_font(font) para.set(first_indent=0.0, lmargin=1.0) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for additional detail data.')) default_style.add_paragraph_style("DAR-MoreDetails", para) endnotes.add_endnote_styles(default_style)
class StatisticsChartOptions(MenuReportOptions): """ Options for StatisticsChart report """ def __init__(self, name, dbase): self.__pid = None self.__filter = None self.__db = dbase self._nf = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ return self.__filter.get_filter().get_name() def add_menu_options(self, menu): """ Add options to the menu for the statistics report. """ ################################ category_name = _("Report Options") add_option = partial(menu.add_option, category_name) ################################ self.__filter = FilterOption(_("Filter"), 0) self.__filter.set_help( _("Determines what people are included " "in the report.")) add_option("filter", self.__filter) self.__filter.connect('value-changed', self.__filter_changed) self.__pid = PersonOption(_("Filter Person")) self.__pid.set_help(_("The center person for the filter.")) menu.add_option(category_name, "pid", self.__pid) self.__pid.connect('value-changed', self.__update_filters) self._nf = stdoptions.add_name_format_option(menu, category_name) self._nf.connect('value-changed', self.__update_filters) self.__update_filters() stdoptions.add_private_data_option(menu, category_name) stdoptions.add_living_people_option(menu, category_name) stdoptions.add_localization_option(menu, category_name) ################################ category_name = _("Report Details") add_option = partial(menu.add_option, category_name) ################################ sortby = EnumeratedListOption(_('Sort chart items by'), _options.SORT_VALUE) for item_idx in range(len(_options.opt_sorts)): item = _options.opt_sorts[item_idx] sortby.add_item(item_idx, item[2]) sortby.set_help(_("Select how the statistical data is sorted.")) add_option("sortby", sortby) reverse = BooleanOption(_("Sort in reverse order"), False) reverse.set_help(_("Check to reverse the sorting order.")) add_option("reverse", reverse) this_year = time.localtime()[0] year_from = NumberOption(_("People Born After"), 1700, 1, this_year) year_from.set_help(_("Birth year from which to include people.")) add_option("year_from", year_from) year_to = NumberOption(_("People Born Before"), this_year, 1, this_year) year_to.set_help(_("Birth year until which to include people")) add_option("year_to", year_to) no_years = BooleanOption(_("Include people without known birth years"), False) no_years.set_help( _("Whether to include people without " "known birth years.")) add_option("no_years", no_years) gender = EnumeratedListOption(_('Genders included'), Person.UNKNOWN) for item_idx in range(len(_options.opt_genders)): item = _options.opt_genders[item_idx] gender.add_item(item[0], item[2]) gender.set_help( _("Select which genders are included into " "statistics.")) add_option("gender", gender) bar_items = NumberOption(_("Max. items for a pie"), 8, 0, 20) bar_items.set_help( _("With fewer items pie chart and legend will be " "used instead of a bar chart.")) add_option("bar_items", bar_items) # ------------------------------------------------- # List of available charts on separate option tabs idx = 0 half = len(_Extract.extractors) // 2 chart_types = [] for (chart_opt, ctuple) in _Extract.extractors.items(): chart_types.append((_(ctuple[1]), chart_opt, ctuple)) sorted_chart_types = sorted(chart_types, key=lambda x: glocale.sort_key(x[0])) for (translated_option_name, opt_name, ctuple) in sorted_chart_types: if idx <= half: category_name = _("Charts 1") else: category_name = _("Charts 2") opt = BooleanOption(translated_option_name, False) opt.set_help(_("Include charts with indicated data.")) menu.add_option(category_name, opt_name, opt) idx += 1 # Enable a couple of charts by default menu.get_option_by_name("data_gender").set_value(True) menu.get_option_by_name("data_ccount").set_value(True) menu.get_option_by_name("data_bmonth").set_value(True) def __update_filters(self): """ Update the filter list based on the selected person """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) nfv = self._nf.get_value() filter_list = utils.get_person_filters(person, include_single=False, name_format=nfv) self.__filter.set_filters(filter_list) def __filter_changed(self): """ Handle filter change. If the filter is not specific to a person, disable the person option """ filter_value = self.__filter.get_value() if filter_value in [1, 2, 3, 4]: # Filters 1, 2, 3 and 4 rely on the center person self.__pid.set_available(True) else: # The rest don't self.__pid.set_available(False) def make_default_style(self, default_style): """Make the default output style for the Statistics report.""" # Paragraph Styles fstyle = FontStyle() fstyle.set_size(10) fstyle.set_type_face(FONT_SERIF) pstyle = ParagraphStyle() pstyle.set_font(fstyle) pstyle.set_alignment(PARA_ALIGN_LEFT) pstyle.set_description(_("The style used for the items and values.")) default_style.add_paragraph_style("SC-Text", pstyle) fstyle = FontStyle() fstyle.set_size(14) fstyle.set_type_face(FONT_SANS_SERIF) pstyle = ParagraphStyle() pstyle.set_font(fstyle) pstyle.set_alignment(PARA_ALIGN_CENTER) pstyle.set_description(_("The style used for the title of the page.")) default_style.add_paragraph_style("SC-Title", pstyle) """ Graphic Styles: SC-title - Contains the SC-Title paragraph style used for the title of the document SC-text - Contains the SC-Name paragraph style used for the individual's name SC-color-N - The colors for drawing pies. SC-bar - A red bar with 0.5pt black line. """ gstyle = GraphicsStyle() gstyle.set_paragraph_style("SC-Title") gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 255, 255)) gstyle.set_line_width(0) default_style.add_draw_style("SC-title", gstyle) gstyle = GraphicsStyle() gstyle.set_paragraph_style("SC-Text") gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 255, 255)) gstyle.set_line_width(0) default_style.add_draw_style("SC-text", gstyle) width = 0.8 # red gstyle = GraphicsStyle() gstyle.set_paragraph_style('SC-Text') gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 0, 0)) gstyle.set_line_width(width) default_style.add_draw_style("SC-color-0", gstyle) # orange gstyle = GraphicsStyle() gstyle.set_paragraph_style('SC-Text') gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 158, 33)) gstyle.set_line_width(width) default_style.add_draw_style("SC-color-1", gstyle) # green gstyle = GraphicsStyle() gstyle.set_paragraph_style('SC-Text') gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((0, 178, 0)) gstyle.set_line_width(width) default_style.add_draw_style("SC-color-2", gstyle) # violet gstyle = GraphicsStyle() gstyle.set_paragraph_style('SC-Text') gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((123, 0, 123)) gstyle.set_line_width(width) default_style.add_draw_style("SC-color-3", gstyle) # yellow gstyle = GraphicsStyle() gstyle.set_paragraph_style('SC-Text') gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 255, 0)) gstyle.set_line_width(width) default_style.add_draw_style("SC-color-4", gstyle) # blue gstyle = GraphicsStyle() gstyle.set_paragraph_style('SC-Text') gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((0, 105, 214)) gstyle.set_line_width(width) default_style.add_draw_style("SC-color-5", gstyle) # gray gstyle = GraphicsStyle() gstyle.set_paragraph_style('SC-Text') gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((210, 204, 210)) gstyle.set_line_width(width) default_style.add_draw_style("SC-color-6", gstyle) gstyle = GraphicsStyle() gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 0, 0)) gstyle.set_line_width(width) default_style.add_draw_style("SC-bar", gstyle) # legend gstyle = GraphicsStyle() gstyle.set_paragraph_style('SC-Text') gstyle.set_color((0, 0, 0)) gstyle.set_fill_color((255, 255, 255)) gstyle.set_line_width(0) default_style.add_draw_style("SC-legend", gstyle)
class DetDescendantOptions(MenuReportOptions): """ Defines options and provides handling interface. """ def __init__(self, name, dbase): self.__db = dbase self.__pid = None MenuReportOptions.__init__(self, name, dbase) def get_subject(self): """ Return a string that describes the subject of the report. """ gid = self.__pid.get_value() person = self.__db.get_person_from_gid(gid) return _nd.display(person) def add_menu_options(self, menu): """ Add options to the menu for the detailed descendant report. """ # Report Options category = _("Report Options") add_option = partial(menu.add_option, category) self.__pid = PersonOption(_("Center Person")) self.__pid.set_help(_("The center person for the report")) add_option("pid", self.__pid) stdoptions.add_name_format_option(menu, category) stdoptions.add_private_data_option(menu, category) stdoptions.add_living_people_option(menu, category) numbering = EnumeratedListOption(_("Numbering system"), "Henry") numbering.set_items([("Henry", _("Henry numbering")), ("Modified Henry", _("Modified Henry numbering")), ("d'Aboville", _("d'Aboville numbering")), ("Record (Modified Register)", _("Record (Modified Register) numbering"))]) numbering.set_help(_("The numbering system to be used")) add_option("numbering", numbering) structure = EnumeratedListOption(_("Report structure"), "by generation") structure.set_items([("by generation", _("show people by generations")), ("by lineage", _("show people by lineage"))]) structure.set_help(_("How people are organized in the report")) add_option("structure", structure) generations = NumberOption(_("Generations"), 10, 1, 100) generations.set_help( _("The number of generations to include in the report")) add_option("gen", generations) stdoptions.add_localization_option(menu, category) # Content add_option = partial(menu.add_option, _("Content")) usecall = BooleanOption(_("Use callname for common name"), False) usecall.set_help(_("Whether to use the call name as the first name.")) add_option("usecall", usecall) fulldates = BooleanOption(_("Use full dates instead of only the year"), True) fulldates.set_help( _("Whether to use full dates instead of just year.")) add_option("fulldates", fulldates) listc = BooleanOption(_("List children"), True) listc.set_help(_("Whether to list children.")) add_option("listc", listc) computeage = BooleanOption(_("Compute death age"), True) computeage.set_help(_("Whether to compute a person's age at death.")) add_option("computeage", computeage) omitda = BooleanOption(_("Omit duplicate ancestors"), True) omitda.set_help(_("Whether to omit duplicate ancestors.")) add_option("omitda", omitda) verbose = BooleanOption(_("Use complete sentences"), True) verbose.set_help( _("Whether to use complete sentences or succinct language.")) add_option("verbose", verbose) desref = BooleanOption(_("Add descendant reference in child list"), True) desref.set_help( _("Whether to add descendant references in child list.")) add_option("desref", desref) pagebbg = BooleanOption(_("Page break between generations"), False) pagebbg.set_help( _("Whether to start a new page after each generation.")) add_option("pagebbg", pagebbg) pageben = BooleanOption(_("Page break before end notes"), False) pageben.set_help( _("Whether to start a new page before the end notes.")) add_option("pageben", pageben) add_option = partial(menu.add_option, _("Include") + " 1") incphotos = BooleanOption(_("Include Photo/Images from Gallery"), False) incphotos.set_help(_("Whether to include images.")) add_option("incphotos", incphotos) incevents = BooleanOption(_("Include events"), False) incevents.set_help(_("Whether to include events.")) add_option("incevents", incevents) incnotes = BooleanOption(_("Include notes"), True) incnotes.set_help(_("Whether to include notes.")) add_option("incnotes", incnotes) incmates = BooleanOption(_("Include spouses"), False) incmates.set_help(_("Whether to include detailed spouse information.")) add_option("incmates", incmates) incmateref = BooleanOption(_("Include spouse reference"), False) incmateref.set_help(_("Whether to include reference to spouse.")) add_option("incmateref", incmateref) add_option = partial(menu.add_option, _("Include") + " 2") incaddresses = BooleanOption(_("Include addresses"), False) incaddresses.set_help(_("Whether to include addresses.")) add_option("incaddresses", incaddresses) incattrs = BooleanOption(_("Include attributes"), False) incattrs.set_help(_("Whether to include attributes.")) add_option("incattrs", incattrs) incnames = BooleanOption(_("Include alternative names"), False) incnames.set_help(_("Whether to include other names.")) add_option("incnames", incnames) incsources = BooleanOption(_("Include sources"), False) incsources.set_help(_("Whether to include source references.")) add_option("incsources", incsources) incsrcnotes = BooleanOption(_("Include sources notes"), False) incsrcnotes.set_help( _("Whether to include source notes in the " "Endnotes section. Only works if Include sources is selected.")) add_option("incsrcnotes", incsrcnotes) incssign = BooleanOption( _("Include sign of succession ('+') in child-list"), True) incssign.set_help( _("Whether to include a sign ('+') before the" " descendant number in the child-list to indicate" " a child has succession.")) add_option("incssign", incssign) incpaths = BooleanOption(_("Include path to start-person"), False) incpaths.set_help( _("Whether to include the path of descendancy " "from the start-person to each descendant.")) add_option("incpaths", incpaths) # Missing information add_option = partial(menu.add_option, _("Missing information")) repplace = BooleanOption(_("Replace missing places with ______"), False) repplace.set_help(_("Whether to replace missing Places with blanks.")) add_option("repplace", repplace) repdate = BooleanOption(_("Replace missing dates with ______"), False) repdate.set_help(_("Whether to replace missing Dates with blanks.")) add_option("repdate", repdate) def make_default_style(self, default_style): """Make the default output style for the Detailed Ancestral Report""" font = FontStyle() font.set(face=FONT_SANS_SERIF, size=16, bold=1) para = ParagraphStyle() para.set_font(font) para.set_header_level(1) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_alignment(PARA_ALIGN_CENTER) para.set_description(_('The style used for the title of the page.')) default_style.add_paragraph_style("DDR-Title", para) font = FontStyle() font.set(face=FONT_SANS_SERIF, size=14, italic=1) para = ParagraphStyle() para.set_font(font) para.set_header_level(2) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for the generation header.')) default_style.add_paragraph_style("DDR-Generation", para) font = FontStyle() font.set(face=FONT_SANS_SERIF, size=10, italic=0, bold=1) para = ParagraphStyle() para.set_font(font) para.set_left_margin(1.5) # in centimeters para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for the children list title.')) default_style.add_paragraph_style("DDR-ChildTitle", para) font = FontStyle() font.set(size=10) para = ParagraphStyle() para.set_font(font) para.set(first_indent=-0.75, lmargin=2.25) para.set_top_margin(0.125) para.set_bottom_margin(0.125) para.set_description(_('The style used for the children list.')) default_style.add_paragraph_style("DDR-ChildList", para) font = FontStyle() font.set(face=FONT_SANS_SERIF, size=10, italic=0, bold=1) para = ParagraphStyle() para.set_font(font) para.set(first_indent=0.0, lmargin=1.5) para.set_top_margin(0.25) para.set_bottom_margin(0.25) default_style.add_paragraph_style("DDR-NoteHeader", para) para = ParagraphStyle() para.set(lmargin=1.5) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The basic style used for the text display.')) default_style.add_paragraph_style("DDR-Entry", para) para = ParagraphStyle() para.set(first_indent=-1.5, lmargin=1.5) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for the first personal entry.')) default_style.add_paragraph_style("DDR-First-Entry", para) font = FontStyle() font.set(size=10, face=FONT_SANS_SERIF, bold=1) para = ParagraphStyle() para.set_font(font) para.set(first_indent=0.0, lmargin=1.5) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description( _('The style used for the More About header and ' 'for headers of mates.')) default_style.add_paragraph_style("DDR-MoreHeader", para) font = FontStyle() font.set(face=FONT_SERIF, size=10) para = ParagraphStyle() para.set_font(font) para.set(first_indent=0.0, lmargin=1.5) para.set_top_margin(0.25) para.set_bottom_margin(0.25) para.set_description(_('The style used for additional detail data.')) default_style.add_paragraph_style("DDR-MoreDetails", para) endnotes.add_endnote_styles(default_style)