diff --git a/src/calibre/gui2/metadata/basic_widgets.py b/src/calibre/gui2/metadata/basic_widgets.py index 8069864143..537736d3d0 100644 --- a/src/calibre/gui2/metadata/basic_widgets.py +++ b/src/calibre/gui2/metadata/basic_widgets.py @@ -9,7 +9,7 @@ __docformat__ = 'restructuredtext en' import textwrap, re, os -from PyQt4.Qt import (Qt, QDateEdit, QDate, +from PyQt4.Qt import (Qt, QDateEdit, QDate, pyqtSignal, QIcon, QToolButton, QWidget, QLabel, QGridLayout, QDoubleSpinBox, QListWidgetItem, QSize, QPixmap, QPushButton, QSpinBox, QLineEdit, QSizePolicy) @@ -613,6 +613,8 @@ class FormatsManager(QWidget): # {{{ class Cover(ImageView): # {{{ + download_cover = pyqtSignal() + def __init__(self, parent): ImageView.__init__(self, parent) self.dialog = parent @@ -703,9 +705,6 @@ class Cover(ImageView): # {{{ cdata = im.export('png') self.current_val = cdata - def download_cover(self, *args): - pass # TODO: Implement this - def generate_cover(self, *args): from calibre.ebooks import calibre_cover from calibre.ebooks.metadata import fmt_sidx diff --git a/src/calibre/gui2/metadata/single.py b/src/calibre/gui2/metadata/single.py index 1c761519d7..395f2aacab 100644 --- a/src/calibre/gui2/metadata/single.py +++ b/src/calibre/gui2/metadata/single.py @@ -133,6 +133,7 @@ class MetadataSingleDialogBase(ResizableDialog): self.formats_manager.cover_from_format_button.clicked.connect( self.cover_from_format) self.cover = Cover(self) + self.cover.download_cover.connect(self.download_cover) self.basic_metadata_widgets.append(self.cover) self.comments = CommentsEdit(self, self.one_line_comments_toolbar) @@ -159,7 +160,7 @@ class MetadataSingleDialogBase(ResizableDialog): self.basic_metadata_widgets.extend([self.timestamp, self.pubdate]) self.fetch_metadata_button = QPushButton( - _('&Fetch metadata from server'), self) + _('&Download metadata'), self) self.fetch_metadata_button.clicked.connect(self.fetch_metadata) font = self.fmb_font = QFont() font.setBold(True) @@ -313,6 +314,17 @@ class MetadataSingleDialogBase(ResizableDialog): self.update_from_mi(mi) if d.cover_pixmap is not None: self.cover.current_val = pixmap_to_data(d.cover_pixmap) + + def download_cover(self, *args): + from calibre.gui2.metadata.single_download import CoverFetch + d = CoverFetch(self.cover.pixmap(), self) + ret = d.start(self.title.current_val, self.authors.current_val, + self.identifiers.current_val) + if ret == d.Accepted: + if d.cover_pixmap is not None: + self.cover.current_val = pixmap_to_data(d.cover_pixmap) + + # }}} def apply_changes(self): diff --git a/src/calibre/gui2/metadata/single_download.py b/src/calibre/gui2/metadata/single_download.py index 9b59b57e13..8f01c6df1e 100644 --- a/src/calibre/gui2/metadata/single_download.py +++ b/src/calibre/gui2/metadata/single_download.py @@ -678,7 +678,8 @@ class CoversWidget(QWidget): # {{{ def start(self, book, current_cover, title, authors): self.book, self.current_cover = book, current_cover self.title, self.authors = title, authors - self.log('\n\nStarting cover download for:', book.title) + self.log('Starting cover download for:', book.title) + self.log('Query:', title, authors, self.book.identifiers) self.msg.setText('
'+_('Downloading covers for %s, please wait...')%book.title) self.covers_view.start() @@ -850,6 +851,7 @@ class FullFetch(QDialog): # {{{ self.ok_button.setVisible(True) self.book = book self.stack.setCurrentIndex(1) + self.log('\n\n') self.covers_widget.start(book, self.current_cover, self.title, self.authors) @@ -859,6 +861,7 @@ class FullFetch(QDialog): # {{{ def reject(self): self.identify_widget.cancel() + self.covers_widget.cancel() return QDialog.reject(self) def cleanup(self): @@ -888,6 +891,59 @@ class FullFetch(QDialog): # {{{ return self.exec_() # }}} +class CoverFetch(QDialog): # {{{ + + def __init__(self, current_cover=None, parent=None): + QDialog.__init__(self, parent) + self.current_cover = current_cover + self.log = Log() + self.cover_pixmap = None + + self.setWindowTitle(_('Downloading cover...')) + self.setWindowIcon(QIcon(I('book.png'))) + + self.l = l = QVBoxLayout() + self.setLayout(l) + + self.covers_widget = CoversWidget(self.log, self.current_cover, parent=self) + self.covers_widget.chosen.connect(self.accept) + l.addWidget(self.covers_widget) + + self.resize(850, 550) + + self.finished.connect(self.cleanup) + + self.bb = QDialogButtonBox(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) + l.addWidget(self.bb) + self.log_button = self.bb.addButton(_('View log'), self.bb.ActionRole) + self.log_button.clicked.connect(self.view_log) + self.log_button.setIcon(QIcon(I('debug.png'))) + self.bb.rejected.connect(self.reject) + self.bb.accepted.connect(self.accept) + + def cleanup(self): + self.covers_widget.cleanup() + + def reject(self): + self.covers_widget.cancel() + return QDialog.reject(self) + + def accept(self, *args): + self.cover_pixmap = self.covers_widget.cover_pixmap() + QDialog.accept(self) + + def start(self, title, authors, identifiers): + book = Metadata(title, authors) + book.identifiers = identifiers + self.covers_widget.start(book, self.current_cover, + title, authors) + return self.exec_() + + def view_log(self): + self._lv = LogViewer(self.log, self) + +# }}} + if __name__ == '__main__': #DEBUG_DIALOG = True app = QApplication([])