From 5ade2ccc74260957b0890b0079754deb83c06896 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 3 Mar 2011 12:25:56 -0700 Subject: [PATCH] You can now right click on the cover in the book details panel to copy/paste a new cover. Fixes #9255 (Updating covers via the Book Details pane) --- src/calibre/gui2/book_details.py | 37 ++++++++++++++++++++++++++++++-- src/calibre/gui2/init.py | 6 ++++++ src/calibre/gui2/widgets.py | 4 ++-- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index 2f7892692c..63deccb2f0 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -10,7 +10,7 @@ from Queue import Queue from PyQt4.Qt import QPixmap, QSize, QWidget, Qt, pyqtSignal, QUrl, \ QPropertyAnimation, QEasingCurve, QThread, QApplication, QFontInfo, \ - QSizePolicy, QPainter, QRect, pyqtProperty, QLayout, QPalette + QSizePolicy, QPainter, QRect, pyqtProperty, QLayout, QPalette, QMenu from PyQt4.QtWebKit import QWebView from calibre import fit_image, prepare_string_for_xml @@ -18,7 +18,7 @@ from calibre.gui2.widgets import IMAGE_EXTENSIONS from calibre.ebooks import BOOK_EXTENSIONS from calibre.constants import preferred_encoding from calibre.library.comments import comments_to_html -from calibre.gui2 import config, open_local_file, open_url +from calibre.gui2 import config, open_local_file, open_url, pixmap_to_data from calibre.utils.icu import sort_key # render_rows(data) {{{ @@ -70,6 +70,7 @@ def render_rows(data): class CoverView(QWidget): # {{{ + cover_changed = pyqtSignal(object, object) def __init__(self, vertical, parent=None): QWidget.__init__(self, parent) @@ -151,6 +152,35 @@ class CoverView(QWidget): # {{{ fset=setCurrentPixmapSize ) + def contextMenuEvent(self, ev): + cm = QMenu(self) + paste = cm.addAction(_('Paste Cover')) + copy = cm.addAction(_('Copy Cover')) + if not QApplication.instance().clipboard().mimeData().hasImage(): + paste.setEnabled(False) + copy.triggered.connect(self.copy_to_clipboard) + paste.triggered.connect(self.paste_from_clipboard) + cm.exec_(ev.globalPos()) + + def copy_to_clipboard(self): + QApplication.instance().clipboard().setPixmap(self.pixmap) + + def paste_from_clipboard(self): + cb = QApplication.instance().clipboard() + pmap = cb.pixmap() + if pmap.isNull() and cb.supportsSelection(): + pmap = cb.pixmap(cb.Selection) + if not pmap.isNull(): + self.pixmap = pmap + self.do_layout() + self.update() + if not config['disable_animations']: + self.animation.start() + id_ = self.data.get('id', None) + if id_ is not None: + self.cover_changed.emit(id_, + pixmap_to_data(pmap)) + # }}} @@ -362,7 +392,9 @@ class BookDetails(QWidget): # {{{ # Drag 'n drop {{{ DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS files_dropped = pyqtSignal(object, object) + cover_changed = pyqtSignal(object, object) + # application/x-moz-file-promise-url @classmethod def paths_from_event(cls, event): ''' @@ -399,6 +431,7 @@ class BookDetails(QWidget): # {{{ self.setLayout(self._layout) self.cover_view = CoverView(vertical, self) + self.cover_view.cover_changed.connect(self.cover_changed.emit) self._layout.addWidget(self.cover_view) self.book_info = BookInfo(vertical, self) self._layout.addWidget(self.book_info) diff --git a/src/calibre/gui2/init.py b/src/calibre/gui2/init.py index e7abbddd2a..e8c2712c83 100644 --- a/src/calibre/gui2/init.py +++ b/src/calibre/gui2/init.py @@ -262,6 +262,8 @@ class LayoutMixin(object): # {{{ self.status_bar.initialize(self.system_tray_icon) self.book_details.show_book_info.connect(self.iactions['Show Book Details'].show_book_info) self.book_details.files_dropped.connect(self.iactions['Add Books'].files_dropped_on_book) + self.book_details.cover_changed.connect(self.bd_cover_changed, + type=Qt.QueuedConnection) self.book_details.open_containing_folder.connect(self.iactions['View'].view_folder_for_id) self.book_details.view_specific_format.connect(self.iactions['View'].view_format_by_id) @@ -272,6 +274,10 @@ class LayoutMixin(object): # {{{ self.library_view.currentIndex()) self.library_view.setFocus(Qt.OtherFocusReason) + def bd_cover_changed(self, id_, cdata): + self.library_view.model().db.set_cover(id_, cdata) + if self.cover_flow: + self.cover_flow.dataChanged() def save_layout_state(self): for x in ('library', 'memory', 'card_a', 'card_b'): diff --git a/src/calibre/gui2/widgets.py b/src/calibre/gui2/widgets.py index 5cacf32bb2..aa9d6c8b9f 100644 --- a/src/calibre/gui2/widgets.py +++ b/src/calibre/gui2/widgets.py @@ -236,8 +236,8 @@ class ImageDropMixin(object): # {{{ def contextMenuEvent(self, ev): cm = QMenu(self) - copy = cm.addAction(_('Copy Image')) - paste = cm.addAction(_('Paste Image')) + paste = cm.addAction(_('Paste Cover')) + copy = cm.addAction(_('Copy Cover')) if not QApplication.instance().clipboard().mimeData().hasImage(): paste.setEnabled(False) copy.triggered.connect(self.copy_to_clipboard)