From f1952a3fc2043828641b85f7eacccb7dfaff5f98 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 21 Dec 2009 17:56:24 -0700 Subject: [PATCH 1/9] Fix #4265 (ImportError: cannot import name titles) --- src/calibre/ebooks/conversion/cli.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calibre/ebooks/conversion/cli.py b/src/calibre/ebooks/conversion/cli.py index e319104562..fa1b4056db 100644 --- a/src/calibre/ebooks/conversion/cli.py +++ b/src/calibre/ebooks/conversion/cli.py @@ -203,9 +203,10 @@ def create_option_parser(args, log): log('Created by:', __author__) raise SystemExit(0) if '--list-recipes' in args: - from calibre.web.feeds.recipes import titles + from calibre.web.feeds.recipes.collection import get_builtin_recipe_titles log('Available recipes:') - for title in sorted(titles): + titles = sorted(get_builtin_recipe_titles()) + for title in titles: try: log('\t'+title) except: From 2d5adba731c453e89ac25da3077dea3ee32329c0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 21 Dec 2009 18:33:25 -0700 Subject: [PATCH 2/9] Implement #4266 (Double-click to view in main window) --- src/calibre/gui2/library.py | 2 ++ src/calibre/gui2/ui.py | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index 6a346950dd..fa24bea8fb 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -693,6 +693,8 @@ class BooksView(TableView): self._model.current_changed) self.connect(self._model, SIGNAL('columns_sorted()'), self.columns_sorted, Qt.QueuedConnection) + hv = self.verticalHeader() + hv.setClickable(True) def columns_sorted(self): for i in range(self.model().columnCount(None)): diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 0fafb572c1..013b37e98f 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -552,6 +552,11 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): self.connect(self.scheduler, SIGNAL('start_recipe_fetch(PyQt_PyObject)'), self.download_scheduled_recipe, Qt.QueuedConnection) + self.library_view.verticalHeader().sectionClicked.connect(self.view_specific_book) + + for view in ('library', 'memory', 'card_a', 'card_b'): + view = getattr(self, view+'_view') + view.verticalHeader().sectionDoubleClicked.connect(self.view_specific_book) self.location_view.setCurrentIndex(self.location_view.model().index(0)) @@ -1442,7 +1447,12 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): def view_book(self, triggered): rows = self.current_view().selectionModel().selectedRows() + self._view_books(rows) + def view_specific_book(self, index): + self._view_books([index]) + + def _view_books(self, rows): if not rows or len(rows) == 0: self._launch_viewer() return @@ -1458,7 +1468,8 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): if self.current_view() is self.library_view: for row in rows: - row = row.row() + if hasattr(row, 'row'): + row = row.row() formats = self.library_view.model().db.formats(row) title = self.library_view.model().db.title(row) From 205cdd7a61f61d6803b138c03b36da41ca8dc55a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 21 Dec 2009 18:36:26 -0700 Subject: [PATCH 3/9] ... --- src/calibre/gui2/library.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/library.py b/src/calibre/gui2/library.py index fa24bea8fb..f772f94bf0 100644 --- a/src/calibre/gui2/library.py +++ b/src/calibre/gui2/library.py @@ -695,6 +695,7 @@ class BooksView(TableView): self.columns_sorted, Qt.QueuedConnection) hv = self.verticalHeader() hv.setClickable(True) + hv.setCursor(Qt.PointingHandCursor) def columns_sorted(self): for i in range(self.model().columnCount(None)): From 2508202262b832f221b967ad2fa6e88c624b08ab Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 21 Dec 2009 21:12:04 -0700 Subject: [PATCH 4/9] When adding books via the add books button to the device, restrict to formats supported by device --- src/calibre/gui2/ui.py | 12 ++++++++---- src/calibre/library/database2.py | 2 +- src/calibre/utils/config.py | 24 +----------------------- 3 files changed, 10 insertions(+), 28 deletions(-) diff --git a/src/calibre/gui2/ui.py b/src/calibre/gui2/ui.py index 013b37e98f..ad1e3938c4 100644 --- a/src/calibre/gui2/ui.py +++ b/src/calibre/gui2/ui.py @@ -926,8 +926,7 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): ''' Add books from the local filesystem to either the library or the device. ''' - books = choose_files(self, 'add books dialog dir', 'Select books', - filters=[ + filters = [ (_('Books'), BOOK_EXTENSIONS), (_('EPUB Books'), ['epub']), (_('LRF Books'), ['lrf']), @@ -938,10 +937,15 @@ class Main(MainWindow, Ui_MainWindow, DeviceGUI): (_('PDF Books'), ['pdf']), (_('Comics'), ['cbz', 'cbr', 'cbc']), (_('Archives'), ['zip', 'rar']), - ]) + ] + to_device = self.stack.currentIndex() != 0 + if to_device: + filters = [(_('Supported books'), self.device_manager.device.FORMATS)] + + books = choose_files(self, 'add books dialog dir', 'Select books', + filters=filters) if not books: return - to_device = self.stack.currentIndex() != 0 self._add_books(books, to_device) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index dce8d73499..411e5ee98b 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -473,7 +473,7 @@ class LibraryDatabase2(LibraryDatabase): def upgrade_version_2(self): ''' Fix Foreign key constraints for deleting from link tables. ''' script = textwrap.dedent('''\ - DROP TRIGGER fkc_delete_books_%(ltable)s_link; + DROP TRIGGER IF EXISTS fkc_delete_books_%(ltable)s_link; CREATE TRIGGER fkc_delete_on_%(table)s BEFORE DELETE ON %(table)s BEGIN diff --git a/src/calibre/utils/config.py b/src/calibre/utils/config.py index 3bfba86cb2..9281165d5f 100644 --- a/src/calibre/utils/config.py +++ b/src/calibre/utils/config.py @@ -11,7 +11,6 @@ from copy import deepcopy from functools import partial from optparse import OptionParser as _OptionParser from optparse import IndentedHelpFormatter -from PyQt4.QtCore import QString from calibre.constants import terminal_controller, iswindows, isosx, \ __appname__, __version__, __author__, plugins from calibre.utils.lock import LockError, ExclusiveFile @@ -365,6 +364,7 @@ class OptionSet(object): if val is val is True or val is False or val is None or \ isinstance(val, (int, float, long, basestring)): return repr(val) + from PyQt4.QtCore import QString if isinstance(val, QString): return repr(unicode(val)) pickle = cPickle.dumps(val, -1) @@ -722,26 +722,4 @@ def migrate(): p.set('migrated', True) -if __name__ == '__main__': - import subprocess - from PyQt4.Qt import QByteArray - c = Config('test', 'test config') - - c.add_opt('one', ['-1', '--one'], help="This is option #1") - c.set('one', u'345') - - c.add_opt('two', help="This is option #2") - c.set('two', 345) - - c.add_opt('three', help="This is option #3") - c.set('three', QString(u'aflatoon')) - - c.add_opt('four', help="This is option #4") - c.set('four', QByteArray('binary aflatoon')) - - subprocess.call(['pygmentize', os.path.expanduser('~/.config/calibre/test.py')]) - - opts = c.parse() - for i in ('one', 'two', 'three', 'four'): - print i, repr(getattr(opts, i)) From e4aac569dee6738fb3207d9283a337ea63bb25fc Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 21 Dec 2009 21:49:26 -0700 Subject: [PATCH 5/9] ... --- src/calibre/translations/calibre.pot | 317 ++++++++++++++------------- 1 file changed, 160 insertions(+), 157 deletions(-) diff --git a/src/calibre/translations/calibre.pot b/src/calibre/translations/calibre.pot index b8ea646a3a..fe3fa203bc 100644 --- a/src/calibre/translations/calibre.pot +++ b/src/calibre/translations/calibre.pot @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: calibre 0.6.29\n" -"POT-Creation-Date: 2009-12-18 12:30+MST\n" -"PO-Revision-Date: 2009-12-18 12:30+MST\n" +"POT-Creation-Date: 2009-12-21 21:13+MST\n" +"PO-Revision-Date: 2009-12-21 21:13+MST\n" "Last-Translator: Automatically generated\n" "Language-Team: LANGUAGE\n" "MIME-Version: 1.0\n" @@ -21,13 +21,13 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/customize/__init__.py:44 #: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:94 -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:53 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:54 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:58 #: /home/kovid/work/calibre/src/calibre/devices/prs505/books.py:199 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:767 #: /home/kovid/work/calibre/src/calibre/devices/usbms/device.py:770 #: /home/kovid/work/calibre/src/calibre/devices/usbms/driver.py:193 -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:410 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:414 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:67 #: /home/kovid/work/calibre/src/calibre/ebooks/fb2/input.py:69 #: /home/kovid/work/calibre/src/calibre/ebooks/html/input.py:319 @@ -115,8 +115,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/scheduler.py:170 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:392 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:405 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:877 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1003 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:880 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1006 #: /home/kovid/work/calibre/src/calibre/gui2/viewer/main.py:179 #: /home/kovid/work/calibre/src/calibre/library/cli.py:281 #: /home/kovid/work/calibre/src/calibre/library/database.py:913 @@ -380,12 +380,15 @@ msgid "Communicate with the Blackberry smart phone." msgstr "" #: /home/kovid/work/calibre/src/calibre/devices/blackberry/driver.py:13 -#: /home/kovid/work/calibre/src/calibre/devices/iriver/driver.py:16 #: /home/kovid/work/calibre/src/calibre/devices/nuut2/driver.py:18 #: /home/kovid/work/calibre/src/calibre/devices/prs500/driver.py:88 msgid "Kovid Goyal" msgstr "" +#: /home/kovid/work/calibre/src/calibre/devices/boox/driver.py:17 +msgid "Communicate with the BOOX eBook reader." +msgstr "" + #: /home/kovid/work/calibre/src/calibre/devices/cybookg3/driver.py:22 msgid "Communicate with the Cybook Gen 3 eBook reader." msgstr "" @@ -439,19 +442,15 @@ msgstr "" msgid "Communicate with the JetBook eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/jetbook/driver.py:23 -msgid "James Ralston" -msgstr "" - -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:21 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:22 msgid "Communicate with the Kindle eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:66 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:67 msgid "Communicate with the Kindle 2 eBook reader." msgstr "" -#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:76 +#: /home/kovid/work/calibre/src/calibre/devices/kindle/driver.py:77 msgid "Communicate with the Kindle DX eBook reader." msgstr "" @@ -605,71 +604,71 @@ msgstr "" msgid "Removing books from device metadata listing..." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:196 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:200 msgid "Rendered %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:199 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:203 msgid "Failed %s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:256 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:260 msgid "" "Failed to process comic: \n" "\n" "%s" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:274 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:278 msgid "Number of colors for grayscale image conversion. Default: %default. Values of less than 256 may result in blurred text on your device if you are creating your comics in EPUB format." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:278 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:282 msgid "Disable normalize (improve contrast) color range for pictures. Default: False" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:281 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:285 msgid "Maintain picture aspect ratio. Default is to fill the screen." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:283 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:287 msgid "Disable sharpening." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:285 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:289 msgid "Disable trimming of comic pages. For some comics, trimming might remove content as well as borders." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:288 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:292 msgid "Don't split landscape images into two portrait images" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:290 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:294 msgid "Keep aspect ratio and scale image using screen height as image width for viewing in landscape mode." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:293 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:297 msgid "Used for right-to-left publications like manga. Causes landscape pages to be split into portrait pages from right to left." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:297 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:301 msgid "Enable Despeckle. Reduces speckle noise. May greatly increase processing time." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:300 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:304 msgid "Don't sort the files found in the comic alphabetically by name. Instead use the order they were added to the comic." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:304 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:308 msgid "The format that images in the created ebook are converted to. You can experiment to see which format gives you optimal size and look on your device." msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:308 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:312 msgid "Apply no processing to the image" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:434 -#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:445 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:438 +#: /home/kovid/work/calibre/src/calibre/ebooks/comic/input.py:449 msgid "Page" msgstr "" @@ -728,7 +727,7 @@ msgstr "" msgid "List builtin recipes" msgstr "" -#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:251 +#: /home/kovid/work/calibre/src/calibre/ebooks/conversion/cli.py:252 msgid "Output saved to" msgstr "" @@ -1284,7 +1283,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:56 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:159 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:389 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1069 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1072 msgid "Title" msgstr "" @@ -1292,7 +1291,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/fetch_metadata.py:57 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:160 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:394 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1070 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1073 msgid "Author(s)" msgstr "" @@ -1319,8 +1318,8 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:370 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:166 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:339 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1013 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1073 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1016 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1076 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:96 #: /home/kovid/work/calibre/src/calibre/gui2/tag_view.py:125 msgid "Tags" @@ -1339,7 +1338,7 @@ msgid "Language" msgstr "" #: /home/kovid/work/calibre/src/calibre/ebooks/metadata/__init__.py:375 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1012 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1015 msgid "Timestamp" msgstr "" @@ -2186,7 +2185,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/xpath_wizard_ui.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/device_drivers/configwidget_ui.py:67 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/search_item_ui.py:35 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:96 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:106 #: /home/kovid/work/calibre/src/calibre/gui2/wizard/send_email_ui.py:107 msgid "Form" msgstr "" @@ -2773,7 +2772,7 @@ msgid "RB Output" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/convert/regex_builder.py:77 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1421 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1431 msgid "Choose the format to view" msgstr "" @@ -3266,7 +3265,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:85 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/book_info.py:86 #: /home/kovid/work/calibre/src/calibre/gui2/library.py:346 -#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1008 +#: /home/kovid/work/calibre/src/calibre/gui2/library.py:1011 #: /home/kovid/work/calibre/src/calibre/gui2/status.py:92 msgid "Path" msgstr "" @@ -3381,7 +3380,7 @@ msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:475 #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:819 #: /home/kovid/work/calibre/src/calibre/gui2/ui.py:158 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1094 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:1104 #: /home/kovid/work/calibre/src/calibre/utils/ipc/job.py:53 msgid "Error" msgstr "" @@ -3451,7 +3450,7 @@ msgid "Access log:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/config/__init__.py:674 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:613 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:618 msgid "Failed to start content server" msgstr "" @@ -4037,7 +4036,7 @@ msgid "Choose formats for " msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/metadata_single.py:136 -#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:925 +#: /home/kovid/work/calibre/src/calibre/gui2/ui.py:930 msgid "Books" msgstr "" @@ -4456,7 +4455,7 @@ msgid "Send test mail from %s to:" msgstr "" #: /home/kovid/work/calibre/src/calibre/gui2/dialogs/test_email_ui.py:52 -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:105 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:115 msgid "&Test" msgstr "" @@ -4632,7 +4631,7 @@ msgstr "" msgid "Recipe source code (python)" msgstr "" -#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:97 +#: /home/kovid/work/calibre/src/calibre/gui2/filename_pattern_ui.py:107 msgid "" "\n" "