From 6871651ff1719971c1f52b4fb8ed6c2ae2025c44 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 9 Jan 2011 16:41:54 +0000 Subject: [PATCH 1/3] Fix bug in formatter where parse errors at end of file threw an exception instead of providing the message. --- src/calibre/utils/formatter.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index 2e4f843c3d..40760bf91b 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -98,9 +98,10 @@ class _Parser(object): m = 'Formatter: ' + message + _(' near ') if self.lex_pos > 0: m = '{0} {1}'.format(m, self.prog[self.lex_pos-1][1]) - m = '{0} {1}'.format(m, self.prog[self.lex_pos][1]) - if self.lex_pos < len(self.prog): + elif self.lex_pos < len(self.prog): m = '{0} {1}'.format(m, self.prog[self.lex_pos+1][1]) + else: + m = '{0} {1}'.format(m, _('end of program')) raise ValueError(m) def token(self): From 0067f6af4edf0a5645acc6a9a48a1608f60fb5a6 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 9 Jan 2011 16:42:11 +0000 Subject: [PATCH 2/3] Fix bug in formatter where parse errors at end of file threw an exception instead of providing the message. --- src/calibre/gui2/preferences/plugboard.py | 31 +++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/calibre/gui2/preferences/plugboard.py b/src/calibre/gui2/preferences/plugboard.py index 296387106c..e1dc6b03bd 100644 --- a/src/calibre/gui2/preferences/plugboard.py +++ b/src/calibre/gui2/preferences/plugboard.py @@ -5,11 +5,11 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -from PyQt4 import QtGui -from PyQt4.Qt import Qt +from PyQt4.Qt import Qt, QLineEdit, QComboBox, SIGNAL, QListWidgetItem from calibre.gui2 import error_dialog from calibre.gui2.device import device_name_for_plugboards +from calibre.gui2.dialogs.template_dialog import TemplateDialog from calibre.gui2.preferences import ConfigWidgetBase, test_widget from calibre.gui2.preferences.plugboard_ui import Ui_Form from calibre.customize.ui import metadata_writers, device_plugins @@ -17,6 +17,27 @@ from calibre.library.save_to_disk import plugboard_any_format_value, \ plugboard_any_device_value, plugboard_save_to_disk_value from calibre.utils.formatter import validation_formatter + +class LineEditWithTextBox(QLineEdit): + + ''' + Extend the context menu of a QLineEdit to include more actions. + ''' + + def contextMenuEvent(self, event): + menu = self.createStandardContextMenu() + menu.addSeparator() + + action_open_editor = menu.addAction(_('Open Editor')) + + self.connect(action_open_editor, SIGNAL('triggered()'), self.open_editor) + menu.exec_(event.globalPos()) + + def open_editor(self): + t = TemplateDialog(self, self.text()) + if t.exec_(): + self.setText(t.textbox.toPlainText()) + class ConfigWidget(ConfigWidgetBase, Ui_Form): def genesis(self, gui): @@ -72,10 +93,10 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): self.source_widgets = [] self.dest_widgets = [] for i in range(0, len(self.dest_fields)-1): - w = QtGui.QLineEdit(self) + w = LineEditWithTextBox(self) self.source_widgets.append(w) self.fields_layout.addWidget(w, 5+i, 0, 1, 1) - w = QtGui.QComboBox(self) + w = QComboBox(self) self.dest_widgets.append(w) self.fields_layout.addWidget(w, 5+i, 1, 1, 1) @@ -297,7 +318,7 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): for op in self.current_plugboards[f][d]: ops.append('([' + op[0] + '] -> ' + op[1] + ')') txt = '%s:%s = %s\n'%(f, d, ', '.join(ops)) - item = QtGui.QListWidgetItem(txt) + item = QListWidgetItem(txt) item.setData(Qt.UserRole, (f, d)) self.existing_plugboards.addItem(item) self.refilling = False From cdc017bc6349cfb29944e7da4657c2ba42f122fd Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Sun, 9 Jan 2011 16:42:28 +0000 Subject: [PATCH 3/3] Fix #8244 Merging two books fails (None custom numeric values throws exception) --- src/calibre/library/custom_columns.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/calibre/library/custom_columns.py b/src/calibre/library/custom_columns.py index d925f7c91d..d905f6d01a 100644 --- a/src/calibre/library/custom_columns.py +++ b/src/calibre/library/custom_columns.py @@ -151,6 +151,8 @@ class CustomColumns(object): return v def adapt_number(x, d): + if x is None: + return None if isinstance(x, (str, unicode, bytes)): if x.lower() == 'none': return None