diff --git a/src/calibre/gui2/tweak_book/__init__.py b/src/calibre/gui2/tweak_book/__init__.py index a36460ca72..91be009abd 100644 --- a/src/calibre/gui2/tweak_book/__init__.py +++ b/src/calibre/gui2/tweak_book/__init__.py @@ -71,6 +71,8 @@ d['auto_close_tags'] = True d['restore_book_state'] = True d['editor_accepts_drops'] = True d['toolbar_icon_size'] = 24 +d['insert_full_screen_image'] = False +d['preserve_aspect_ratio_when_inserting_image'] = False del d ucase_map = {l:string.ascii_uppercase[i] for i, l in enumerate(string.ascii_lowercase)} diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index a6b53dbd24..0941cbbb2c 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -776,14 +776,14 @@ class Boss(QObject): if rdata is None: return if rtype == 'image': - chosen_name, chosen_image_is_external = rdata + chosen_name, chosen_image_is_external, fullpage, preserve_ar = rdata if chosen_image_is_external: with open(chosen_image_is_external[1], 'rb') as f: current_container().add_file(chosen_image_is_external[0], f.read()) self.refresh_file_list() chosen_name = chosen_image_is_external[0] href = current_container().name_to_href(chosen_name, edname) - ed.insert_image(href) + ed.insert_image(href, fullpage=fullpage, preserve_aspect_ratio=preserve_ar) elif action[0] == 'insert_hyperlink': self.commit_all_editors_to_container() d = InsertLink(current_container(), edname, initial_text=ed.get_smart_selection(), parent=self.gui) diff --git a/src/calibre/gui2/tweak_book/editor/insert_resource.py b/src/calibre/gui2/tweak_book/editor/insert_resource.py index 4486a0ca52..5b0a8570d0 100644 --- a/src/calibre/gui2/tweak_book/editor/insert_resource.py +++ b/src/calibre/gui2/tweak_book/editor/insert_resource.py @@ -11,10 +11,10 @@ from functools import partial from PyQt5.Qt import ( QGridLayout, QSize, QListView, QStyledItemDelegate, QLabel, QPixmap, - QApplication, QSizePolicy, QAbstractListModel, Qt, QRect, + QApplication, QSizePolicy, QAbstractListModel, Qt, QRect, QCheckBox, QPainter, QModelIndex, QSortFilterProxyModel, QLineEdit, QToolButton, QIcon, QFormLayout, pyqtSignal, QTreeWidget, QTreeWidgetItem, QVBoxLayout, - QMenu, QInputDialog) + QMenu, QInputDialog, QHBoxLayout) from calibre import fit_image from calibre.constants import plugins @@ -226,7 +226,6 @@ class InsertImage(Dialog): l.addWidget(b, 2, 1) f.textChanged.connect(self.filter_changed) - l.addWidget(self.bb, 3, 0, 1, 2) if self.for_browsing: self.bb.clear() self.bb.addButton(self.bb.Close) @@ -244,6 +243,19 @@ class InsertImage(Dialog): b.clicked.connect(self.paste_image) b.setIcon(QIcon(I('edit-paste.png'))) b.setToolTip(_('Paste an image from the clipboard')) + self.fullpage = f = QCheckBox(_('Full page image'), self) + f.setToolTip(_('Insert the image so that it takes up an entire page when viewed in a reader')) + f.setChecked(tprefs['insert_full_screen_image']) + self.preserve_aspect_ratio = a = QCheckBox(_('Preserve aspect ratio')) + a.setToolTip(_('Preserve the aspect ratio of the inserted image when rendering it full paged')) + a.setChecked(tprefs['preserve_aspect_ratio_when_inserting_image']) + f.toggled.connect(lambda : (tprefs.set('insert_full_screen_image', f.isChecked()), a.setVisible(f.isChecked()))) + a.toggled.connect(lambda : tprefs.set('preserve_aspect_ratio_when_inserting_image', a.isChecked())) + a.setVisible(f.isChecked()) + h = QHBoxLayout() + l.addLayout(h, 3, 0, 1, -1) + h.addWidget(f), h.addStretch(10), h.addWidget(a) + l.addWidget(self.bb, 4, 0, 1, 2) def refresh(self): self.d.cover_cache.clear() @@ -305,7 +317,7 @@ def get_resource_data(rtype, parent): if rtype == 'image': d = InsertImage(parent) if d.exec_() == d.Accepted: - return d.chosen_image, d.chosen_image_is_external + return d.chosen_image, d.chosen_image_is_external, d.fullpage.isChecked(), d.preserve_aspect_ratio.isChecked() def create_folder_tree(container): root = {} diff --git a/src/calibre/gui2/tweak_book/editor/text.py b/src/calibre/gui2/tweak_book/editor/text.py index cb5142e832..c1e61c6fd2 100644 --- a/src/calibre/gui2/tweak_book/editor/text.py +++ b/src/calibre/gui2/tweak_book/editor/text.py @@ -682,7 +682,7 @@ class TextEdit(PlainTextEdit): c.setPosition(c.position() - len(suffix)) self.setTextCursor(c) - def insert_image(self, href): + def insert_image(self, href, fullpage=False, preserve_aspect_ratio=False): c = self.textCursor() template, alt = 'url(%s)', '' left = min(c.position(), c.anchor) @@ -690,12 +690,19 @@ class TextEdit(PlainTextEdit): left, right = self.get_range_inside_tag() c.setPosition(left) c.setPosition(right, c.KeepAnchor) - alt = _('Image') - template = '{0}'.format(alt) href = prepare_string_for_xml(href, True) + if fullpage: + template = '''\ +\ +\ +'''.format('xMidYMid meet' if preserve_aspect_ratio else 'none') + else: + alt = _('Image') + template = '{0}'.format(alt) text = template % href c.insertText(text) - if self.syntax == 'html': + if self.syntax == 'html' and not fullpage: c.setPosition(left + 10) c.setPosition(c.position() + len(alt), c.KeepAnchor) else: diff --git a/src/calibre/gui2/tweak_book/editor/widget.py b/src/calibre/gui2/tweak_book/editor/widget.py index 5277b0ba55..ad424a4216 100644 --- a/src/calibre/gui2/tweak_book/editor/widget.py +++ b/src/calibre/gui2/tweak_book/editor/widget.py @@ -221,8 +221,8 @@ class Editor(QMainWindow): func = getattr(self.editor, action) func(*args) - def insert_image(self, href): - self.editor.insert_image(href) + def insert_image(self, href, fullpage=False, preserve_aspect_ratio=False): + self.editor.insert_image(href, fullpage=fullpage, preserve_aspect_ratio=preserve_aspect_ratio) def insert_hyperlink(self, href, text): self.editor.insert_hyperlink(href, text)