From 862bc734f288e187292d161e8955b6b6f8c50b8c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 8 Nov 2013 15:35:38 +0530 Subject: [PATCH] Add various polish actions to Tweak Book --- resources/images/embed-fonts.png | Bin 0 -> 13520 bytes resources/images/smarten-punctuation.png | Bin 0 -> 776 bytes resources/images/subset-fonts.png | Bin 0 -> 15321 bytes src/calibre/gui2/tweak_book/boss.py | 31 ++++++++++++++++++++--- src/calibre/gui2/tweak_book/ui.py | 23 +++++++++++++++++ 5 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 resources/images/embed-fonts.png create mode 100644 resources/images/smarten-punctuation.png create mode 100644 resources/images/subset-fonts.png diff --git a/resources/images/embed-fonts.png b/resources/images/embed-fonts.png new file mode 100644 index 0000000000000000000000000000000000000000..fac5b5022de3f2f499f1efa71aa4f7f266c53532 GIT binary patch literal 13520 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 Q^`|00SzcYPT-GA!f0R^goB#j- literal 0 HcmV?d00001 diff --git a/resources/images/smarten-punctuation.png b/resources/images/smarten-punctuation.png new file mode 100644 index 0000000000000000000000000000000000000000..6f3cb92ed76e3bb37cc9e0726f693f5be064bc16 GIT binary patch literal 776 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 literal 0 HcmV?d00001 diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index e92e596801..a749e65f54 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -11,12 +11,12 @@ from functools import partial from PyQt4.Qt import ( QObject, QApplication, QDialog, QGridLayout, QLabel, QSize, Qt, - QDialogButtonBox, QIcon, QTimer, QPixmap) + QDialogButtonBox, QIcon, QTimer, QPixmap, QTextBrowser, QVBoxLayout) from calibre import prints from calibre.ptempfile import PersistentTemporaryDirectory from calibre.ebooks.oeb.base import urlnormalize -from calibre.ebooks.oeb.polish.main import SUPPORTED +from calibre.ebooks.oeb.polish.main import SUPPORTED, tweak_polish from calibre.ebooks.oeb.polish.container import get_container as _gc, clone_container, guess_type from calibre.ebooks.oeb.polish.replace import rename_files from calibre.gui2 import error_dialog, choose_files, question_dialog, info_dialog @@ -156,12 +156,37 @@ class Boss(QObject): if not self.check_dirtied(): return self.add_savepoint(_('Edit Table of Contents')) - d = TOCEditor(parent=self.gui) + d = TOCEditor(title=self.current_metadata.title, parent=self.gui) if d.exec_() != d.Accepted: self.rewind_savepoint() return self.update_editors_from_container() + def polish(self, action, name): + if not self.check_dirtied(): + return + self.add_savepoint(name) + try: + report = tweak_polish(current_container(), {action:True}) + except: + self.rewind_savepoint() + raise + self.apply_container_update_to_gui() + from calibre.ebooks.markdown import markdown + report = markdown('# %s\n\n'%self.current_metadata.title + '\n\n'.join(report), output_format='html4') + d = QDialog(self.gui) + d.l = QVBoxLayout() + d.setLayout(d.l) + d.e = QTextBrowser(d) + d.l.addWidget(d.e) + d.e.setHtml(report) + d.bb = QDialogButtonBox(QDialogButtonBox.Close) + d.l.addWidget(d.bb) + d.bb.rejected.connect(d.reject) + d.bb.accepted.connect(d.accept) + d.resize(600, 400) + d.exec_() + # Renaming {{{ def rename_requested(self, oldname, newname): if not self.check_dirtied(): diff --git a/src/calibre/gui2/tweak_book/ui.py b/src/calibre/gui2/tweak_book/ui.py index b808c9b9d3..6c80c1d434 100644 --- a/src/calibre/gui2/tweak_book/ui.py +++ b/src/calibre/gui2/tweak_book/ui.py @@ -6,6 +6,8 @@ from __future__ import (unicode_literals, division, absolute_import, __license__ = 'GPL v3' __copyright__ = '2013, Kovid Goyal ' +from functools import partial + from PyQt4.Qt import ( QDockWidget, Qt, QLabel, QIcon, QAction, QApplication, QWidget, QVBoxLayout, QStackedWidget, QTabWidget, QImage, QPixmap, pyqtSignal) @@ -179,6 +181,18 @@ class Main(MainWindow): group = _('Tools') self.action_toc = reg('toc.png', _('&Edit Table of Contents'), self.boss.edit_toc, 'edit-toc', (), _('Edit Table of Contents')) + # Polish actions + group = _('Polish') + self.action_subset_fonts = reg( + 'subset-fonts.png', _('&Subset embedded fonts'), partial( + self.boss.polish, 'subset', _('Subset fonts')), 'subset-fonts', (), _('Subset embedded fonts')) + self.action_embed_fonts = reg( + 'embed-fonts.png', _('&Embed referenced fonts'), partial( + self.boss.polish, 'embed', _('Embed fonts')), 'embed-fonts', (), _('Embed referenced fonts')) + self.action_smarten_punctuation = reg( + 'smarten-punctuation.png', _('&Smarten punctuation'), partial( + self.boss.polish, 'smarten_punctuation', _('Smarten punstuation')), 'smarten-punctuation', (), _('Smarten punctuation')) + def create_menubar(self): b = self.menuBar() @@ -200,6 +214,9 @@ class Main(MainWindow): e = b.addMenu(_('&Tools')) e.addAction(self.action_toc) + e.addAction(self.action_embed_fonts) + e.addAction(self.action_subset_fonts) + e.addAction(self.action_smarten_punctuation) def create_toolbar(self): self.global_bar = b = self.addToolBar(_('Book tool bar')) @@ -210,6 +227,12 @@ class Main(MainWindow): b.addAction(self.action_save) b.addAction(self.action_toc) + self.polish_bar = b = self.addToolBar(_('Polish book tool bar')) + b.setObjectName('polish_bar') # Needed for saveState + b.addAction(self.action_embed_fonts) + b.addAction(self.action_subset_fonts) + b.addAction(self.action_smarten_punctuation) + def create_docks(self): self.file_list_dock = d = QDockWidget(_('&Files Browser'), self) d.setObjectName('file_list_dock') # Needed for saveState