Use a progress spinner in the PDF covers dialog

This commit is contained in:
Kovid Goyal 2018-04-23 18:19:53 +05:30
parent 57f712d1b6
commit 5346902c6f
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 38 additions and 11 deletions

View File

@ -13,14 +13,15 @@ from glob import glob
import sip import sip
from PyQt5.Qt import ( from PyQt5.Qt import (
QDialog, QApplication, QLabel, QStackedLayout, QVBoxLayout, QDialogButtonBox, Qt, QDialog, QApplication, QLabel, QVBoxLayout, QDialogButtonBox, Qt,
pyqtSignal, QListWidget, QListWidgetItem, QSize, QPixmap, QStyledItemDelegate, QWidget pyqtSignal, QListWidget, QListWidgetItem, QSize, QPixmap, QStyledItemDelegate
) )
from calibre import as_unicode from calibre import as_unicode
from calibre.ebooks.metadata.pdf import page_images from calibre.ebooks.metadata.pdf import page_images
from calibre.gui2 import error_dialog, file_icon_provider from calibre.gui2 import error_dialog, file_icon_provider
from calibre.ptempfile import PersistentTemporaryDirectory from calibre.ptempfile import PersistentTemporaryDirectory
from calibre.gui2.progress_indicator import WaitLayout
class CoverDelegate(QStyledItemDelegate): class CoverDelegate(QStyledItemDelegate):
@ -44,14 +45,10 @@ class PDFCovers(QDialog):
def __init__(self, pdfpath, parent=None): def __init__(self, pdfpath, parent=None):
QDialog.__init__(self, parent) QDialog.__init__(self, parent)
self.pdfpath = pdfpath self.pdfpath = pdfpath
self.stack = QStackedLayout(self) self.stack = WaitLayout(_('Rendering PDF pages, please wait...'), parent=self)
self.loading = QLabel('<b>'+_('Rendering PDF pages, please wait...')) self.container = self.stack.after
self.stack.addWidget(self.loading)
self.container = QWidget(self)
self.stack.addWidget(self.container)
self.container.l = l = QVBoxLayout(self.container) self.container.l = l = QVBoxLayout(self.container)
self.la = la = QLabel(_('Choose a cover from the list of PDF pages below')) self.la = la = QLabel(_('Choose a cover from the list of PDF pages below'))
l.addWidget(la) l.addWidget(la)
self.covers = c = QListWidget(self) self.covers = c = QListWidget(self)
@ -113,7 +110,7 @@ class PDFCovers(QDialog):
self.rendering_done.emit() self.rendering_done.emit()
def hide_pages(self): def hide_pages(self):
self.stack.setCurrentIndex(0) self.stack.start()
self.more_pages.setVisible(False) self.more_pages.setVisible(False)
def show_pages(self): def show_pages(self):
@ -122,7 +119,7 @@ class PDFCovers(QDialog):
_('Could not render this PDF file'), show=True, det_msg=self.error) _('Could not render this PDF file'), show=True, det_msg=self.error)
self.reject() self.reject()
return return
self.stack.setCurrentIndex(1) self.stack.stop()
files = glob(os.path.join(self.current_tdir, '*.jpg')) + glob(os.path.join(self.current_tdir, '*.jpeg')) files = glob(os.path.join(self.current_tdir, '*.jpg')) + glob(os.path.join(self.current_tdir, '*.jpeg'))
if not files and not self.covers.count(): if not files and not self.covers.count():
error_dialog(self, _('Failed to render'), error_dialog(self, _('Failed to render'),

View File

@ -7,7 +7,7 @@ from __future__ import (unicode_literals, division, absolute_import,
from PyQt5.Qt import ( from PyQt5.Qt import (
Qt, QWidget, QSizePolicy, QSize, QRect, QConicalGradient, QPen, QBrush, Qt, QWidget, QSizePolicy, QSize, QRect, QConicalGradient, QPen, QBrush,
QPainter, QTimer, QVBoxLayout, QLabel, QStackedWidget, QDialog QPainter, QTimer, QVBoxLayout, QLabel, QStackedWidget, QDialog, QStackedLayout
) )
@ -113,6 +113,7 @@ class ProgressSpinner(QWidget):
traceback.print_exc() traceback.print_exc()
self.errored_out = True self.errored_out = True
ProgressIndicator = ProgressSpinner ProgressIndicator = ProgressSpinner
@ -167,6 +168,35 @@ class WaitStack(QStackedWidget):
def msg(self, val): def msg(self, val):
self.wp.msg = val self.wp.msg = val
class WaitLayout(QStackedLayout):
def __init__(self, msg, after=None, parent=None, size=256, interval=10):
QStackedLayout.__init__(self, parent)
self.wp = WaitPanel(msg, parent, size, interval)
if after is None:
after = QWidget(parent)
self.after = after
self.addWidget(self.wp)
self.addWidget(after)
def start(self):
self.setCurrentWidget(self.wp)
self.wp.start()
def stop(self):
self.wp.stop()
self.setCurrentWidget(self.after)
@property
def msg(self):
return self.wp.msg
@msg.setter
def msg(self, val):
self.wp.msg = val
if __name__ == '__main__': if __name__ == '__main__':
from calibre.gui2 import Application from calibre.gui2 import Application
app = Application([]) app = Application([])