5701: configure an existing "book" using saved-away values

svn: r19916
This commit is contained in:
Paul Franklin 2012-06-24 17:22:53 +00:00
parent 4a7623a5ed
commit b7d5b91535
2 changed files with 110 additions and 38 deletions

View File

@ -7,7 +7,7 @@
# Copyright (C) 2009 Nick Hall # Copyright (C) 2009 Nick Hall
# Copyright (C) 2010 Jakim Friant # Copyright (C) 2010 Jakim Friant
# Copyright (C) 2011 Adam Stein <adam@csh.rit.edu> # Copyright (C) 2011 Adam Stein <adam@csh.rit.edu>
# Copyright (C) 2011 Paul Franklin # Copyright (C) 2011-2012 Paul Franklin
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -163,7 +163,7 @@ class GuiStringOption(gtk.Entry):
""" """
This class displays an option that is a simple one-line string. This class displays an option that is a simple one-line string.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.StringOption @type option: gen.plug.menu.StringOption
@ -225,7 +225,7 @@ class GuiColorOption(gtk.ColorButton):
""" """
This class displays an option that allows the selection of a colour. This class displays an option that allows the selection of a colour.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
self.__option = option self.__option = option
value = self.__option.get_value() value = self.__option.get_value()
gtk.ColorButton.__init__( self, gtk.gdk.color_parse(value) ) gtk.ColorButton.__init__( self, gtk.gdk.color_parse(value) )
@ -278,7 +278,7 @@ class GuiNumberOption(gtk.SpinButton):
This class displays an option that is a simple number with defined maximum This class displays an option that is a simple number with defined maximum
and minimum values. and minimum values.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
self.__option = option self.__option = option
decimals = 0 decimals = 0
@ -350,7 +350,7 @@ class GuiTextOption(gtk.ScrolledWindow):
""" """
This class displays an option that is a multi-line string. This class displays an option that is a multi-line string.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
self.__option = option self.__option = option
gtk.ScrolledWindow.__init__(self) gtk.ScrolledWindow.__init__(self)
self.set_shadow_type(gtk.SHADOW_IN) self.set_shadow_type(gtk.SHADOW_IN)
@ -433,7 +433,7 @@ class GuiBooleanOption(gtk.CheckButton):
""" """
This class displays an option that is a boolean (True or False). This class displays an option that is a boolean (True or False).
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
self.__option = option self.__option = option
gtk.CheckButton.__init__(self, self.__option.get_label()) gtk.CheckButton.__init__(self, self.__option.get_label())
self.set_active(self.__option.get_value()) self.set_active(self.__option.get_value())
@ -489,7 +489,7 @@ class GuiEnumeratedListOption(gtk.HBox):
This class displays an option that provides a finite number of values. This class displays an option that provides a finite number of values.
Each possible value is assigned a value and a description. Each possible value is assigned a value and a description.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
gtk.HBox.__init__(self) gtk.HBox.__init__(self)
evtBox = gtk.EventBox() evtBox = gtk.EventBox()
self.__option = option self.__option = option
@ -582,7 +582,7 @@ class GuiPersonOption(gtk.HBox):
This class displays an option that allows a person from the This class displays an option that allows a person from the
database to be selected. database to be selected.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.PersonOption @type option: gen.plug.menu.PersonOption
@ -612,11 +612,12 @@ class GuiPersonOption(gtk.HBox):
person_handle = self.__uistate.get_active('Person') person_handle = self.__uistate.get_active('Person')
person = self.__dbstate.db.get_person_from_handle(person_handle) person = self.__dbstate.db.get_person_from_handle(person_handle)
if not person: if override or not person:
# Pick up the stored option value if there is one # Pick up the stored option value if there is one
person = self.__db.get_person_from_gramps_id(gid) person = self.__db.get_person_from_gramps_id(gid)
if not person: if not person:
# If all else fails, get the default person to avoid bad values
person = self.__db.get_default_person() person = self.__db.get_default_person()
if not person: if not person:
@ -706,7 +707,7 @@ class GuiFamilyOption(gtk.HBox):
This class displays an option that allows a family from the This class displays an option that allows a family from the
database to be selected. database to be selected.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.FamilyOption @type option: gen.plug.menu.FamilyOption
@ -730,7 +731,7 @@ class GuiFamilyOption(gtk.HBox):
self.pack_start(pevt, False) self.pack_start(pevt, False)
self.pack_end(family_button, False) self.pack_end(family_button, False)
self.__initialize_family() self.__initialize_family(override)
self.valuekey = self.__option.connect('value-changed', self.__value_changed) self.valuekey = self.__option.connect('value-changed', self.__value_changed)
@ -740,10 +741,10 @@ class GuiFamilyOption(gtk.HBox):
pevt.set_tooltip_text(self.__option.get_help()) pevt.set_tooltip_text(self.__option.get_help())
family_button.set_tooltip_text(_('Select a different family')) family_button.set_tooltip_text(_('Select a different family'))
def __initialize_family(self): def __initialize_family(self, override):
""" """
Find a family to initialize the option with. If there is no saved Find a family to initialize the option with. If there is no saved
family option, use the active family. If there ris no active family option, use the active family. If there is no active
family, try to find a family that the user is likely interested in. family, try to find a family that the user is likely interested in.
""" """
family_list = [] family_list = []
@ -752,7 +753,7 @@ class GuiFamilyOption(gtk.HBox):
# Use the active family if one is selected # Use the active family if one is selected
family = self.__uistate.get_active('Family') family = self.__uistate.get_active('Family')
if family: if family and not override:
family_list = [family] family_list = [family]
else: else:
# Use the stored option value # Use the stored option value
@ -892,7 +893,7 @@ class GuiNoteOption(gtk.HBox):
This class displays an option that allows a note from the This class displays an option that allows a note from the
database to be selected. database to be selected.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.NoteOption @type option: gen.plug.menu.NoteOption
@ -996,7 +997,7 @@ class GuiMediaOption(gtk.HBox):
This class displays an option that allows a media object from the This class displays an option that allows a media object from the
database to be selected. database to be selected.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.MediaOption @type option: gen.plug.menu.MediaOption
@ -1097,7 +1098,7 @@ class GuiPersonListOption(gtk.HBox):
This class displays a widget that allows multiple people from the This class displays a widget that allows multiple people from the
database to be selected. database to be selected.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.PersonListOption @type option: gen.plug.menu.PersonListOption
@ -1274,7 +1275,7 @@ class GuiPlaceListOption(gtk.HBox):
This class displays a widget that allows multiple places from the This class displays a widget that allows multiple places from the
database to be selected. database to be selected.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.PlaceListOption @type option: gen.plug.menu.PlaceListOption
@ -1418,7 +1419,7 @@ class GuiSurnameColorOption(gtk.HBox):
selected from the database, and to assign a colour (not necessarily selected from the database, and to assign a colour (not necessarily
unique) to each one. unique) to each one.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.SurnameColorOption @type option: gen.plug.menu.SurnameColorOption
@ -1609,7 +1610,7 @@ class GuiDestinationOption(gtk.HBox):
This class displays an option that allows the user to select a This class displays an option that allows the user to select a
DestinationOption. DestinationOption.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.DestinationOption @type option: gen.plug.menu.DestinationOption
@ -1738,7 +1739,7 @@ class GuiStyleOption(GuiEnumeratedListOption):
""" """
This class displays a StyleOption. This class displays a StyleOption.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
""" """
@param option: The option to display. @param option: The option to display.
@type option: gen.plug.menu.StyleOption @type option: gen.plug.menu.StyleOption
@ -1778,7 +1779,7 @@ class GuiBooleanListOption(gtk.HBox):
This class displays an option that provides a list of check boxes. This class displays an option that provides a list of check boxes.
Each possible value is assigned a value and a description. Each possible value is assigned a value and a description.
""" """
def __init__(self, option, dbstate, uistate, track): def __init__(self, option, dbstate, uistate, track, override):
gtk.HBox.__init__(self) gtk.HBox.__init__(self)
self.__option = option self.__option = option
self.__cbutton = [] self.__cbutton = []
@ -1890,10 +1891,14 @@ _OPTIONS = (
) )
del menu del menu
def make_gui_option(option, dbstate, uistate, track): def make_gui_option(option, dbstate, uistate, track, override=False):
""" """
Stand-alone function so that Options can be used in other Stand-alone function so that Options can be used in other
ways, too. Takes an Option and returns a GuiOption. ways, too. Takes an Option and returns a GuiOption.
override: if True will override the GuiOption's normal behavior
(in a GuiOption-dependant fashion, for instance in a GuiPersonOption
it will force the use of the options's value to set the GuiOption)
""" """
label, widget = True, None label, widget = True, None
@ -1910,7 +1915,7 @@ def make_gui_option(option, dbstate, uistate, track):
"can't make GuiOption: unknown option type: '%s'" % option) "can't make GuiOption: unknown option type: '%s'" % option)
if widget: if widget:
widget = widget(option, dbstate, uistate, track) widget = widget(option, dbstate, uistate, track, override)
return widget, label return widget, label

View File

@ -4,7 +4,7 @@
# Copyright (C) 2003-2007 Donald N. Allingham # Copyright (C) 2003-2007 Donald N. Allingham
# Copyright (C) 2007-2008 Brian G. Matherly # Copyright (C) 2007-2008 Brian G. Matherly
# Copyright (C) 2010 Jakim Friant # Copyright (C) 2010 Jakim Friant
# Copyright (C) 2011 Paul Franklin # Copyright (C) 2011-2012 Paul Franklin
# #
# This program is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -80,6 +80,8 @@ from gui.managedwindow import ManagedWindow, set_titles
from gui.glade import Glade from gui.glade import Glade
import gui.utils import gui.utils
import gui.user import gui.user
from gui.plug import make_gui_option
from types import ClassType
# Import from specific modules in ReportBase # Import from specific modules in ReportBase
from gen.plug.report import CATEGORY_BOOK, book_categories from gen.plug.report import CATEGORY_BOOK, book_categories
@ -447,7 +449,7 @@ class BookList(object):
f = open(self.file, "w") f = open(self.file, "w")
f.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n") f.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
f.write('<booklist>\n') f.write('<booklist>\n')
for name in self.bookmap: for name in sorted(self.bookmap): # enable a diff of archived copies
book = self.get_book(name) book = self.get_book(name)
dbname = book.get_dbname() dbname = book.get_dbname()
f.write('<book name="%s" database="%s">\n' % (name, dbname) ) f.write('<book name="%s" database="%s">\n' % (name, dbname) )
@ -933,21 +935,26 @@ class BookReportSelector(ManagedWindow):
""" """
store, the_iter = self.book_model.get_selected() store, the_iter = self.book_model.get_selected()
if not the_iter: if not the_iter:
WarningDialog(_('No selected book item'),
_('Please select a book item to configure.')
)
return return
data = self.book_model.get_data(the_iter, range(self.book_nr_cols)) data = self.book_model.get_data(the_iter, range(self.book_nr_cols))
row = self.book_model.get_selected_row() row = self.book_model.get_selected_row()
item = self.book.get_item(row) item = self.book.get_item(row)
option_class = item.option_class option_class = item.option_class
item_dialog = BookItemDialog(self.dbstate, self.uistate, option_class, option_class.handler.set_default_stylesheet_name(item.get_style_name())
item.get_name(), item.is_from_saved_book = bool(self.book.get_name())
item.get_translated_name(), item_dialog = BookItemDialog(self.dbstate, self.uistate,
self.track) item, self.track)
while True: while True:
response = item_dialog.window.run() response = item_dialog.window.run()
if response == gtk.RESPONSE_OK: if response == gtk.RESPONSE_OK:
# dialog will be closed by connect, now continue work while # dialog will be closed by connect, now continue work while
# rest of dialog is unresponsive, release when finished # rest of dialog is unresponsive, release when finished
style = option_class.handler.get_default_stylesheet_name()
item.set_style_name(style)
subject = _get_subject(option_class, self.db) subject = _get_subject(option_class, self.db)
self.book_model.model.set_value(the_iter, 2, subject) self.book_model.model.set_value(the_iter, 2, subject)
self.book.set_item(row, item) self.book.set_item(row, item)
@ -1042,6 +1049,9 @@ class BookReportSelector(ManagedWindow):
if self.book.item_list: if self.book.item_list:
BookReportDialog(self.dbstate, self.uistate, BookReportDialog(self.dbstate, self.uistate,
self.book, BookOptions) self.book, BookOptions)
else:
WarningDialog(_('No items'), _('This book has no items.'))
return
self.close() self.close()
def on_save_clicked(self, obj): def on_save_clicked(self, obj):
@ -1086,7 +1096,7 @@ class BookReportSelector(ManagedWindow):
if book: if book:
self.open_book(book) self.open_book(book)
self.name_entry.set_text(book.get_name()) self.name_entry.set_text(book.get_name())
self.book.name = book.get_name() self.book.set_name(book.get_name())
def on_edit_clicked(self, obj): def on_edit_clicked(self, obj):
""" """
@ -1113,11 +1123,14 @@ class BookItemDialog(ReportDialog):
in a way specific for this report. This is a book item dialog. in a way specific for this report. This is a book item dialog.
""" """
def __init__(self, dbstate, uistate, option_class, name, translated_name, def __init__(self, dbstate, uistate, item, track=[]):
track=[]): option_class = item.option_class
name = item.get_name()
translated_name = item.get_translated_name()
self.category = CATEGORY_BOOK self.category = CATEGORY_BOOK
self.database = dbstate.db self.database = dbstate.db
self.option_class = option_class self.option_class = option_class
self.is_from_saved_book = item.is_from_saved_book
ReportDialog.__init__(self, dbstate, uistate, ReportDialog.__init__(self, dbstate, uistate,
option_class, name, translated_name, track) option_class, name, translated_name, track)
@ -1138,6 +1151,43 @@ class BookItemDialog(ReportDialog):
def parse_target_frame(self): def parse_target_frame(self):
"""Target frame is not used.""" """Target frame is not used."""
return 1 return 1
def init_options(self, option_class):
try:
if (issubclass(option_class, object) or # New-style class
isinstance(option_class, ClassType)): # Old-style class
self.options = option_class(self.raw_name, self.db)
except TypeError:
self.options = option_class
if not self.is_from_saved_book:
self.options.load_previous_values()
def add_user_options(self):
"""
Generic method to add user options to the gui.
"""
if not hasattr(self.options, "menu"):
return
menu = self.options.menu
options_dict = self.options.options_dict
for category in menu.get_categories():
for name in menu.get_option_names(category):
option = menu.get_option(category, name)
# override option default with xml-saved value:
if name in options_dict:
option.set_value(options_dict[name])
widget, label = make_gui_option(option, self.dbstate,
self.uistate, self.track,
self.is_from_saved_book)
if widget is not None:
if label:
self.add_frame_option(category,
option.get_label(),
widget)
else:
self.add_frame_option(category, "", widget)
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -1193,26 +1243,30 @@ class BookReportDialog(DocReportDialog):
def __init__(self, dbstate, uistate, book, options): def __init__(self, dbstate, uistate, book, options):
self.format_menu = None self.format_menu = None
self.options = options self.options = options
self.is_from_saved_book = False
self.page_html_added = False self.page_html_added = False
self.book = book
DocReportDialog.__init__(self, dbstate, uistate, options, DocReportDialog.__init__(self, dbstate, uistate, options,
'book', _("Book Report")) 'book', _("Book Report"))
self.book = book
self.options.options_dict['bookname'] = self.book.name self.options.options_dict['bookname'] = self.book.name
self.database = dbstate.db self.database = dbstate.db
self.selected_style = StyleSheet() self.selected_style = StyleSheet()
for item in self.book.get_item_list(): for item in self.book.get_item_list():
handler = item.option_class.handler
# Set up default style # Set up default style
handler.set_default_stylesheet_name(item.get_style_name())
default_style = StyleSheet() default_style = StyleSheet()
make_default_style = item.option_class.make_default_style make_default_style = item.option_class.make_default_style
make_default_style(default_style) make_default_style(default_style)
# Read all style sheets available for this item # Read all style sheets available for this item
style_file = item.option_class.handler.get_stylesheet_savefile() style_file = handler.get_stylesheet_savefile()
style_list = StyleSheetList(style_file, default_style) style_list = StyleSheetList(style_file, default_style)
# Get the selected stylesheet # Get the selected stylesheet
style_name = item.option_class.handler.get_default_stylesheet_name() style_name = handler.get_default_stylesheet_name()
style_sheet = style_list.get_style_sheet(style_name) style_sheet = style_list.get_style_sheet(style_name)
for this_style_name in style_sheet.get_paragraph_style_names(): for this_style_name in style_sheet.get_paragraph_style_names():
@ -1287,6 +1341,16 @@ class BookReportDialog(DocReportDialog):
if self.open_with_app.get_active(): if self.open_with_app.get_active():
gui.utils.open_file_with_default_application(self.target_path) gui.utils.open_file_with_default_application(self.target_path)
def init_options(self, option_class):
try:
if (issubclass(option_class, object) or # New-style class
isinstance(option_class, ClassType)): # Old-style class
self.options = option_class(self.raw_name, self.db)
except TypeError:
self.options = option_class
if not self.is_from_saved_book:
self.options.load_previous_values()
#------------------------------------------------------------------------ #------------------------------------------------------------------------
# #
# Function to write books from command line # Function to write books from command line
@ -1318,17 +1382,20 @@ def cl_report(database, name, category, options_str_dict):
selected_style = StyleSheet() selected_style = StyleSheet()
for item in book.get_item_list(): for item in book.get_item_list():
handler = item.option_class.handler
# Set up default style # Set up default style
handler.set_default_stylesheet_name(item.get_style_name())
default_style = StyleSheet() default_style = StyleSheet()
make_default_style = item.option_class.make_default_style make_default_style = item.option_class.make_default_style
make_default_style(default_style) make_default_style(default_style)
# Read all style sheets available for this item # Read all style sheets available for this item
style_file = item.option_class.handler.get_stylesheet_savefile() style_file = handler.get_stylesheet_savefile()
style_list = StyleSheetList(style_file, default_style) style_list = StyleSheetList(style_file, default_style)
# Get the selected stylesheet # Get the selected stylesheet
style_name = item.option_class.handler.get_default_stylesheet_name() style_name = handler.get_default_stylesheet_name()
style_sheet = style_list.get_style_sheet(style_name) style_sheet = style_list.get_style_sheet(style_name)
for this_style_name in style_sheet.get_paragraph_style_names(): for this_style_name in style_sheet.get_paragraph_style_names():