From 732a57c560de0815119d316c18f637e9db9347a1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Mar 2013 13:35:25 +0530 Subject: [PATCH] Add a user interface action for the ToC editor --- manual/gui.rst | 2 + resources/images/toc.png | Bin 0 -> 50049 bytes src/calibre/customize/builtins.py | 7 +- src/calibre/gui2/actions/toc_edit.py | 148 +++++++++++++++++++++++++++ src/calibre/gui2/toc/location.py | 1 + src/calibre/gui2/toc/main.py | 4 +- 6 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 resources/images/toc.png create mode 100644 src/calibre/gui2/actions/toc_edit.py diff --git a/manual/gui.rst b/manual/gui.rst index 98954ebabd..b7cd4230bf 100755 --- a/manual/gui.rst +++ b/manual/gui.rst @@ -531,6 +531,8 @@ Calibre has several keyboard shortcuts to save you time and mouse movement. Thes - Get Books * - :kbd:`I` - Show book details + * - :kbd:`K` + - Edit Table of Contents * - :kbd:`M` - Merge selected records * - :kbd:`Alt+M` diff --git a/resources/images/toc.png b/resources/images/toc.png new file mode 100644 index 0000000000000000000000000000000000000000..67252a4ae6ce76e9884f9b00a5a5f51dd6be7551 GIT binary patch literal 50049 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\onG^>J+n-zJJqCNvqZ) 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 N002ovPDHLkV1oBl>8t<% literal 0 HcmV?d00001 diff --git a/src/calibre/customize/builtins.py b/src/calibre/customize/builtins.py index cf12f42d34..8e3b3c59b1 100644 --- a/src/calibre/customize/builtins.py +++ b/src/calibre/customize/builtins.py @@ -789,6 +789,11 @@ class ActionPolish(InterfaceActionBase): actual_plugin = 'calibre.gui2.actions.polish:PolishAction' description = _('Fine tune your ebooks') +class ActionEditToC(InterfaceActionBase): + name = 'Edit ToC' + actual_plugin = 'calibre.gui2.actions.toc_edit:ToCEditAction' + description = _('Edit the Table of Contents in your books') + class ActionDelete(InterfaceActionBase): name = 'Remove Books' actual_plugin = 'calibre.gui2.actions.delete:DeleteAction' @@ -929,7 +934,7 @@ plugins += [ActionAdd, ActionFetchAnnotations, ActionGenerateCatalog, ActionSendToDevice, ActionHelp, ActionPreferences, ActionSimilarBooks, ActionAddToLibrary, ActionEditCollections, ActionChooseLibrary, ActionCopyToLibrary, ActionTweakEpub, ActionNextMatch, ActionStore, - ActionPluginUpdater, ActionPickRandom] + ActionPluginUpdater, ActionPickRandom, ActionEditToC] # }}} diff --git a/src/calibre/gui2/actions/toc_edit.py b/src/calibre/gui2/actions/toc_edit.py new file mode 100644 index 0000000000..b22fdaba21 --- /dev/null +++ b/src/calibre/gui2/actions/toc_edit.py @@ -0,0 +1,148 @@ +#!/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 collections import OrderedDict + +from PyQt4.Qt import (QTimer, QDialog, QGridLayout, QCheckBox, QLabel, + QDialogButtonBox, QIcon) + +from calibre.gui2 import error_dialog +from calibre.gui2.actions import InterfaceAction + +SUPPORTED = {'EPUB', 'AZW3'} + +class ChooseFormat(QDialog): # {{{ + + def __init__(self, formats, parent=None): + QDialog.__init__(self, parent) + self.setWindowTitle(_('Choose format to edit')) + self.setWindowIcon(QIcon(I('dialog_question.png'))) + l = self.l = QGridLayout() + self.setLayout(l) + la = self.la = QLabel(_('Choose which format you want to edit:')) + formats = sorted(formats) + l.addWidget(la, 0, 0, 1, -1) + self.buttons = [] + for i, f in enumerate(formats): + b = QCheckBox('&' + f, self) + l.addWidget(b, 1, i) + self.buttons.append(b) + if i == 0: + b.setChecked(True) + bb = self.bb = QDialogButtonBox( + QDialogButtonBox.Ok|QDialogButtonBox.Cancel) + bb.addButton(_('&All formats'), + bb.ActionRole).clicked.connect(self.do_all) + bb.accepted.connect(self.accept) + bb.rejected.connect(self.reject) + l.addWidget(bb, l.rowCount(), 0, 1, -1) + self.resize(self.sizeHint()) + + def do_all(self): + for b in self.buttons: + b.setChecked(True) + self.accept() + + @property + def formats(self): + for b in self.buttons: + if b.isChecked(): + yield unicode(b.text())[1:] +# }}} + +class ToCEditAction(InterfaceAction): + + name = 'Edit ToC' + action_spec = (_('Edit ToC'), 'toc.png', + _('Edit the Table of Contents in your books'), _('K')) + dont_add_to = frozenset(['context-menu-device']) + action_type = 'current' + accepts_drops = True + + def accept_enter_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def accept_drag_move_event(self, event, mime_data): + if mime_data.hasFormat("application/calibre+from_library"): + return True + return False + + def drop_event(self, event, mime_data): + mime = 'application/calibre+from_library' + if mime_data.hasFormat(mime): + self.dropped_ids = tuple(map(int, str(mime_data.data(mime)).split())) + QTimer.singleShot(1, self.do_drop) + return True + return False + + def do_drop(self): + book_id_map = self.get_supported_books(self.dropped_ids) + del self.dropped_ids + if book_id_map: + self.do_edit(book_id_map) + + def genesis(self): + self.qaction.triggered.connect(self.edit_books) + + def get_supported_books(self, book_ids): + db = self.gui.library_view.model().db + supported = set(SUPPORTED) + ans = [(x, set( (db.formats(x, index_is_id=True) or '').split(',') ) + .intersection(supported)) for x in book_ids] + ans = [x for x in ans if x[1]] + if not ans: + error_dialog(self.gui, _('Cannot edit ToC'), + _('Editing Table of Contents is only supported for books in the %s' + ' formats. Convert to one of those formats before polishing.') + %_(' or ').join(sorted(supported)), show=True) + ans = OrderedDict(ans) + return ans + + def get_books_for_editing(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 edit ToC'), + _('No books selected')) + d.exec_() + return None + db = self.gui.current_db + ans = (db.id(r) for r in rows) + return self.get_supported_books(ans) + + def do_edit(self, book_id_map): + for book_id, fmts in book_id_map.iteritems(): + if len(fmts) > 1: + d = ChooseFormat(fmts, self.gui) + if d.exec_() != d.Accepted: + return + fmts = d.formats + for fmt in fmts: + self.do_one(book_id, fmt) + + def do_one(self, book_id, fmt): + from calibre.gui2.toc.main import TOCEditor + db = self.gui.current_db + path = db.format(book_id, fmt, index_is_id=True, as_path=True) + title = db.title(book_id, index_is_id=True) + ' [%s]'%fmt + d = TOCEditor(path, title=title, parent=self.gui) + d.start() + if d.exec_() == d.Accepted: + with open(path, 'rb') as f: + db.add_format(book_id, fmt, f, index_is_id=True) + + def edit_books(self): + book_id_map = self.get_books_for_editing() + if not book_id_map: + return + self.do_edit(book_id_map) + + diff --git a/src/calibre/gui2/toc/location.py b/src/calibre/gui2/toc/location.py index 31e651b88f..ec10ec7c5f 100644 --- a/src/calibre/gui2/toc/location.py +++ b/src/calibre/gui2/toc/location.py @@ -37,6 +37,7 @@ class Page(QWebPage): # {{{ def javaScriptAlert(self, frame, msg): self.log(unicode(msg)) + @pyqtSlot(result=bool) def shouldInterruptJavaScript(self): return True diff --git a/src/calibre/gui2/toc/main.py b/src/calibre/gui2/toc/main.py index 2db710eff1..876b6d9947 100644 --- a/src/calibre/gui2/toc/main.py +++ b/src/calibre/gui2/toc/main.py @@ -425,6 +425,7 @@ class TOCEditor(QDialog): # {{{ def __init__(self, pathtobook, title=None, parent=None): QDialog.__init__(self, parent) self.pathtobook = pathtobook + self.working = True t = title or os.path.basename(pathtobook) self.setWindowTitle(_('Edit the ToC in %s')%t) @@ -444,6 +445,7 @@ class TOCEditor(QDialog): # {{{ pi.startAnimation() ll.addWidget(pi, alignment=Qt.AlignHCenter|Qt.AlignCenter) la = self.la = QLabel(_('Loading %s, please wait...')%t) + la.setWordWrap(True) la.setStyleSheet('QLabel { font-size: 20pt }') ll.addWidget(la, alignment=Qt.AlignHCenter|Qt.AlignTop) self.toc_view = TOCView(self) @@ -460,7 +462,6 @@ class TOCEditor(QDialog): # {{{ self.explode_done.connect(self.read_toc, type=Qt.QueuedConnection) self.resize(950, 630) - self.working = True def add_new_item(self, item, where): self.item_edit(item, where) @@ -491,6 +492,7 @@ class TOCEditor(QDialog): # {{{ def explode(self): self.ebook = get_container(self.pathtobook, log=self.log) if self.working: + self.working = False self.explode_done.emit() def read_toc(self):