diff --git a/src/calibre/gui2/viewer/documentview.py b/src/calibre/gui2/viewer/documentview.py index 1ac8f9cb85..89461c919f 100644 --- a/src/calibre/gui2/viewer/documentview.py +++ b/src/calibre/gui2/viewer/documentview.py @@ -661,9 +661,13 @@ class DocumentView(QWebView): # {{{ def selected_text(self): return self.document.selectedText().replace(u'\u00ad', u'').strip() + @property + def selected_html(self): + return self.document.selectedHtml().replace(u'\u00ad', u'').strip() + def selection_changed(self): if self.manager is not None: - self.manager.selection_changed(self.selected_text) + self.manager.selection_changed(self.selected_text, self.selected_html) def _selectedText(self): t = unicode(self.selectedText()).strip() diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index a903ae4ba9..219fcc29c4 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -10,8 +10,8 @@ from functools import partial from threading import Thread from PyQt5.Qt import ( - QAction, QApplication, QByteArray, QIcon, QInputDialog, QModelIndex, QObject, - QPropertyAnimation, QSize, Qt, QTime, QTimer, pyqtSignal + QAction, QApplication, QByteArray, QIcon, QInputDialog, QMimeData, QModelIndex, + QObject, QPropertyAnimation, QSize, Qt, QTime, QTimer, pyqtSignal ) from calibre import as_unicode, force_unicode, isbytestring, prints @@ -174,7 +174,7 @@ class EbookViewer(MainWindow): self.pending_toc_click = None self.cursor_hidden = False self.existing_bookmarks= [] - self.selected_text = None + self.selected_text = self.selected_html = None self.was_maximized = False self.read_settings() self.autosave_timer = t = QTimer(self) @@ -570,13 +570,19 @@ class EbookViewer(MainWindow): self.link_clicked(url) self.view.setFocus(Qt.OtherFocusReason) - def selection_changed(self, selected_text): - self.selected_text = selected_text.strip() - self.action_copy.setEnabled(bool(self.selected_text)) + def selection_changed(self, selected_text, selected_html): + self.selected_text = selected_text + self.selected_html = selected_html + self.action_copy.setEnabled(bool(self.selected_text) or bool(self.selected_html)) def copy(self, x=False): - if self.selected_text: - QApplication.clipboard().setText(self.selected_text) + if self.selected_text or self.selected_html: + md = QMimeData() + if self.selected_text: + md.setText(self.selected_text) + if self.selected_html: + md.setHtml(self.selected_html) + QApplication.clipboard().setMimeData(md) def back(self, x): pos = self.history.back(self.pos.value())