From d3c700d5a01556bc70d8981ae0100502cfff18ce Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 5 Feb 2013 09:39:55 +0530 Subject: [PATCH] Start work on GUI for ebook polishing --- imgsrc/polish.svg | 366 +++++++++++++++++++++++++++++ resources/images/polish.png | Bin 0 -> 11335 bytes src/calibre/customize/builtins.py | 7 +- src/calibre/gui2/actions/polish.py | 70 ++++++ 4 files changed, 442 insertions(+), 1 deletion(-) create mode 100644 imgsrc/polish.svg create mode 100644 resources/images/polish.png create mode 100644 src/calibre/gui2/actions/polish.py diff --git a/imgsrc/polish.svg b/imgsrc/polish.svg new file mode 100644 index 0000000000..7affaaf4bd --- /dev/null +++ b/imgsrc/polish.svg @@ -0,0 +1,366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + Ulisse Perusin + + + + uli.peru@gmail.com + edit-clear + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/polish.png b/resources/images/polish.png new file mode 100644 index 0000000000000000000000000000000000000000..7963e91e9399422374819765d18ff795a4cbdfba GIT binary patch literal 11335 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 JPDHLkV1i<{>w*9P literal 0 HcmV?d00001 diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index 43a0baa1d8..a61340966d 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -789,6 +789,11 @@ class ActionConvert(InterfaceActionBase): actual_plugin = 'calibre.gui2.actions.convert:ConvertAction' description = _('Convert books to various ebook formats') +# class ActionPolish(InterfaceActionBase): +# name = 'Polish Books' +# actual_plugin = 'calibre.gui2.actions.polish:PolishAction' +# description = _('Fine tune your ebooks') +# class ActionDelete(InterfaceActionBase): name = 'Remove Books' actual_plugin = 'calibre.gui2.actions.delete:DeleteAction' @@ -924,7 +929,7 @@ class ActionPluginUpdater(InterfaceActionBase): plugins += [ActionAdd, ActionFetchAnnotations, ActionGenerateCatalog, ActionConvert, ActionDelete, ActionEditMetadata, ActionView, - ActionFetchNews, ActionSaveToDisk, ActionQuickview, + ActionFetchNews, ActionSaveToDisk, ActionQuickview, #ActionPolish, ActionShowBookDetails,ActionRestart, ActionOpenFolder, ActionConnectShare, ActionSendToDevice, ActionHelp, ActionPreferences, ActionSimilarBooks, ActionAddToLibrary, ActionEditCollections, ActionChooseLibrary, diff --git a/src/calibre/gui2/actions/polish.py b/src/calibre/gui2/actions/polish.py new file mode 100644 index 0000000000..0edd6538b6 --- /dev/null +++ b/src/calibre/gui2/actions/polish.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai +from __future__ import (unicode_literals, division, absolute_import, + print_function) + +__license__ = 'GPL v3' +__copyright__ = '2013, Kovid Goyal ' +__docformat__ = 'restructuredtext en' + +from PyQt4.Qt import (QDialog) + +from calibre.gui2 import error_dialog +from calibre.gui2.actions import InterfaceAction + +SUPPORTED = {'EPUB', 'AZW3'} + +class Polish(QDialog): + + def __init__(self, db, book_id_map, parent=None): + QDialog.__init__(self, parent) + +class PolishAction(InterfaceAction): + + name = 'Polish Books' + action_spec = (_('Polish books'), 'polish.png', None, None) + dont_add_to = frozenset(['context-menu-device']) + action_type = 'current' + + def genesis(self): + self.qaction.triggered.connect(self.polish_books) + + def location_selected(self, loc): + enabled = loc == 'library' + self.qaction.setEnabled(enabled) + + def get_books_for_polishing(self): + rows = [r.row() for r in + self.gui.library_view.selectionModel().selectedRows()] + if not rows or len(rows) == 0: + d = error_dialog(self.gui, _('Cannot polish'), + _('No books selected')) + d.exec_() + return None + db = self.gui.library_view.model().db + ans = (db.id(r) for r in rows) + supported = set(SUPPORTED) + for x in SUPPORTED: + supported.add('ORIGINAL_'+x) + ans = {x:set( (db.formats(x, index_is_id=True) or '').split(',') ) + .intersection(supported) for x in ans} + ans = {x:fmts for x, fmts in ans.iteritems() if fmts} + if not ans: + error_dialog(self.gui, _('Cannot polish'), + _('Polishing is only supported for books in the %s' + ' formats. Convert to one of those formats before polishing.') + %_(' or ').join(sorted(SUPPORTED)), show=True) + for fmts in ans.itervalues(): + for x in SUPPORTED: + if ('ORIGINAL_'+x) in fmts: + fmts.discard(x) + return ans + + def polish_books(self): + book_id_map = self.get_books_for_polishing() + if not book_id_map: + return + d = Polish(self.gui.library_view.model().db, book_id_map, parent=self.gui) + if d.exec_() == d.Accepted: + pass +