diff --git a/src/calibre/gui2/preferences/__init__.py b/src/calibre/gui2/preferences/__init__.py index ee882f2d9e..273e8073ee 100644 --- a/src/calibre/gui2/preferences/__init__.py +++ b/src/calibre/gui2/preferences/__init__.py @@ -23,6 +23,10 @@ class AbortCommit(Exception): pass +class AbortInitialize(Exception): + pass + + class ConfigWidgetInterface(object): ''' @@ -59,7 +63,8 @@ class ConfigWidgetInterface(object): def initialize(self): ''' Should set all config values to their initial values (the values - stored in the config files). + stored in the config files). A "return" statement is optional. Return + False if the dialog is not to be shown. ''' raise NotImplementedError() diff --git a/src/calibre/gui2/preferences/main.py b/src/calibre/gui2/preferences/main.py index dbd74e8afa..fec9771ef2 100644 --- a/src/calibre/gui2/preferences/main.py +++ b/src/calibre/gui2/preferences/main.py @@ -6,22 +6,26 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import textwrap, re -from functools import partial +import re +import textwrap from collections import OrderedDict - +from functools import partial from qt.core import ( - Qt, QIcon, QFont, QWidget, QScrollArea, QStackedWidget, QVBoxLayout, - QLabel, QFrame, QToolBar, QSize, pyqtSignal, QDialogButtonBox, - QHBoxLayout, QDialog, QSizePolicy, QPainter, QTextLayout, QPointF, - QStatusTipEvent, QApplication, QTabWidget) + QApplication, QDialog, QDialogButtonBox, QFont, QFrame, QHBoxLayout, QIcon, + QLabel, QPainter, QPointF, QScrollArea, QSize, QSizePolicy, QStackedWidget, + QStatusTipEvent, Qt, QTabWidget, QTextLayout, QToolBar, QVBoxLayout, QWidget, + pyqtSignal +) from calibre.constants import __appname__, __version__, islinux -from calibre.gui2 import (gprefs, min_available_height, available_width, - show_restart_warning) -from calibre.gui2.dialogs.message_box import Icon -from calibre.gui2.preferences import init_gui, AbortCommit, get_plugin from calibre.customize.ui import preferences_plugins +from calibre.gui2 import ( + available_width, gprefs, min_available_height, show_restart_warning +) +from calibre.gui2.dialogs.message_box import Icon +from calibre.gui2.preferences import ( + AbortCommit, AbortInitialize, get_plugin, init_gui +) from polyglot.builtins import unicode_type ICON_SIZE = 32 @@ -310,7 +314,10 @@ class Preferences(QDialog): def show_plugin(self, plugin): self.showing_widget = plugin.create_widget(self.scroll_area) self.showing_widget.genesis(self.gui) - self.showing_widget.initialize() + try: + self.showing_widget.initialize() + except AbortInitialize: + return self.set_tooltips_for_labels() self.scroll_area.setWidget(self.showing_widget) self.stack.setCurrentIndex(1) @@ -425,8 +432,8 @@ class Preferences(QDialog): if __name__ == '__main__': - from calibre.gui_launch import init_dbus from calibre.gui2 import Application + from calibre.gui_launch import init_dbus init_dbus() app = Application([]) app diff --git a/src/calibre/gui2/preferences/template_functions.py b/src/calibre/gui2/preferences/template_functions.py index 0c5fcfe036..5bcaa1ef34 100644 --- a/src/calibre/gui2/preferences/template_functions.py +++ b/src/calibre/gui2/preferences/template_functions.py @@ -2,12 +2,14 @@ # vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai # License: GPLv3 Copyright: 2010, Kovid Goyal -import copy, json, traceback -from qt.core import QDialogButtonBox, QDialog +import copy +import json +import traceback +from qt.core import QDialog, QDialogButtonBox -from calibre.gui2 import error_dialog, warning_dialog +from calibre.gui2 import error_dialog, question_dialog, warning_dialog from calibre.gui2.dialogs.template_dialog import TemplateDialog -from calibre.gui2.preferences import ConfigWidgetBase, test_widget +from calibre.gui2.preferences import AbortInitialize, ConfigWidgetBase, test_widget from calibre.gui2.preferences.template_functions_ui import Ui_Form from calibre.gui2.widgets import PythonHighlighter from calibre.utils.formatter_functions import ( @@ -149,9 +151,18 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.builtins = formatter_functions().get_builtins_and_aliases() self.st_funcs = {} - for v in self.db.prefs.get('user_template_functions', []): - if not function_pref_is_python(v): - self.st_funcs.update({function_pref_name(v):compile_user_function(*v)}) + try: + for v in self.db.prefs.get('user_template_functions', []): + if not function_pref_is_python(v): + self.st_funcs.update({function_pref_name(v):compile_user_function(*v)}) + except: + if question_dialog(self, _('Template functions'), + _('The template functions saved in the library are corrupt. ' + "Do you want to delete them? Answering 'Yes' will delete all " + "the functions."), det_msg=traceback.format_exc(), + show_copy_button=True): + self.db.prefs['user_template_functions'] = [] + raise AbortInitialize() self.build_function_names_box() self.function_name.currentIndexChanged[native_string_type].connect(self.function_index_changed)