%PDF- %PDF-
Direktori : /lib/calibre/calibre/gui2/dialogs/ |
Current File : //lib/calibre/calibre/gui2/dialogs/progress.py |
#!/usr/bin/env python3 __license__ = 'GPL v3' __copyright__ = '2009, Kovid Goyal kovid@kovidgoyal.net' __docformat__ = 'restructuredtext en' from qt.core import ( QDialog, pyqtSignal, Qt, QVBoxLayout, QLabel, QFont, QProgressBar, QSize, QDialogButtonBox, QApplication, QFontMetrics, QHBoxLayout, QIcon) from calibre.gui2 import elided_text from calibre.gui2.progress_indicator import ProgressIndicator class ProgressDialog(QDialog): canceled_signal = pyqtSignal() def __init__(self, title, msg='\u00a0', min=0, max=99, parent=None, cancelable=True, icon=None): QDialog.__init__(self, parent) if icon is None: self.l = l = QVBoxLayout(self) else: self.h = h = QHBoxLayout(self) self.icon = i = QLabel(self) if not isinstance(icon, QIcon): icon = QIcon(I(icon)) i.setPixmap(icon.pixmap(64)) h.addWidget(i, alignment=Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignHCenter) self.l = l = QVBoxLayout() h.addLayout(l) self.setWindowIcon(icon) self.title_label = t = QLabel(title) self.setWindowTitle(title) t.setStyleSheet('QLabel { font-weight: bold }'), t.setAlignment(Qt.AlignmentFlag.AlignCenter), t.setTextFormat(Qt.TextFormat.PlainText) l.addWidget(t) self.bar = b = QProgressBar(self) b.setMinimum(min), b.setMaximum(max), b.setValue(min) l.addWidget(b) self.message = m = QLabel(self) fm = QFontMetrics(self.font()) m.setAlignment(Qt.AlignmentFlag.AlignCenter), m.setMinimumWidth(fm.averageCharWidth() * 80), m.setTextFormat(Qt.TextFormat.PlainText) l.addWidget(m) self.msg = msg self.button_box = bb = QDialogButtonBox(QDialogButtonBox.StandardButton.Abort, self) bb.rejected.connect(self._canceled) l.addWidget(bb) self.setWindowModality(Qt.WindowModality.ApplicationModal) self.canceled = False if not cancelable: bb.setVisible(False) self.cancelable = cancelable self.resize(self.sizeHint()) def set_msg(self, msg=''): self.msg = msg def set_value(self, val): self.value = val @property def value(self): return self.bar.value() @value.setter def value(self, val): self.bar.setValue(val) def set_min(self, min): self.min = min def set_max(self, max): self.max = max @property def max(self): return self.bar.maximum() @max.setter def max(self, val): self.bar.setMaximum(val) @property def min(self): return self.bar.minimum() @min.setter def min(self, val): self.bar.setMinimum(val) @property def title(self): return self.title_label.text() @title.setter def title(self, val): self.title_label.setText(str(val or '')) @property def msg(self): return self.message.text() @msg.setter def msg(self, val): val = str(val or '') self.message.setText(elided_text(val, self.font(), self.message.minimumWidth()-10)) def _canceled(self, *args): self.canceled = True self.button_box.setDisabled(True) self.title = _('Aborting...') self.canceled_signal.emit() def reject(self): if not self.cancelable: return QDialog.reject(self) def keyPressEvent(self, ev): if ev.key() == Qt.Key.Key_Escape: if self.cancelable: self._canceled() else: QDialog.keyPressEvent(self, ev) class BlockingBusy(QDialog): def __init__(self, msg, parent=None, window_title=_('Working')): QDialog.__init__(self, parent) self._layout = QVBoxLayout() self.setLayout(self._layout) self.msg = QLabel(msg) # self.msg.setWordWrap(True) self.font = QFont() self.font.setPointSize(self.font.pointSize() + 8) self.msg.setFont(self.font) self.pi = ProgressIndicator(self) self.pi.setDisplaySize(QSize(100, 100)) self._layout.addWidget(self.pi, 0, Qt.AlignmentFlag.AlignHCenter) self._layout.addSpacing(15) self._layout.addWidget(self.msg, 0, Qt.AlignmentFlag.AlignHCenter) self.start() self.setWindowTitle(window_title) self.resize(self.sizeHint()) def start(self): self.pi.startAnimation() def stop(self): self.pi.stopAnimation() def accept(self): self.stop() return QDialog.accept(self) def reject(self): pass # Cannot cancel this dialog if __name__ == '__main__': from qt.core import QTimer app = QApplication([]) d = ProgressDialog('A title', 'A message', icon='lt.png') d.show(), d.canceled_signal.connect(app.quit) QTimer.singleShot(1000, lambda : (setattr(d, 'value', 10), setattr(d, 'msg', ('A message ' * 100)))) app.exec()