class DBRestore(QDialog): update_signal = pyqtSignal(object, object) def __init__(self, parent, library_path, wait_time=2): QDialog.__init__(self, parent) self.l = QVBoxLayout() self.setLayout(self.l) self.l1 = QLabel('<b>'+_('Restoring database from backups, do not' ' interrupt, this will happen in three stages')+'...') self.setWindowTitle(_('Restoring database')) self.l.addWidget(self.l1) self.pb = QProgressBar(self) self.l.addWidget(self.pb) self.pb.setMaximum(0) self.pb.setMinimum(0) self.msg = QLabel('') self.l.addWidget(self.msg) self.msg.setWordWrap(True) self.bb = QDialogButtonBox(QDialogButtonBox.Cancel) self.l.addWidget(self.bb) self.bb.rejected.connect(self.reject) self.resize(self.sizeHint() + QSize(100, 50)) self.error = None self.rejected = False self.library_path = library_path self.update_signal.connect(self.do_update, type=Qt.QueuedConnection) from calibre.db.restore import Restore self.restorer = Restore(library_path, self) self.restorer.daemon = True # Give the metadata backup thread time to stop QTimer.singleShot(wait_time * 1000, self.start) def start(self): self.restorer.start() QTimer.singleShot(10, self.update) def reject(self): self.rejected = True self.restorer.progress_callback = lambda x, y: x QDialog.reject(self) def update(self): if self.restorer.is_alive(): QTimer.singleShot(10, self.update) else: self.restorer.progress_callback = lambda x, y: x self.accept() def __call__(self, msg, step): self.update_signal.emit(msg, step) def do_update(self, msg, step): if msg is None: self.pb.setMaximum(step) else: self.msg.setText(msg) self.pb.setValue(step)
class EvalWizardStep2Window(QMainWindow): def __init__(self, wav_files, output_directory, network_location): QMainWindow.__init__(self) self.wav_files = wav_files self.output_directory = output_directory self.network_location = network_location self.setMinimumSize(QSize(900, 500)) self.setWindowTitle("Diarization - Diarize Files (Step 2 of 2)") centralWidget = QWidget(self) self.setCentralWidget(centralWidget) gridLayout = QGridLayout(self) centralWidget.setLayout(gridLayout) title = QLabel("Please Wait While The .wav Files Are Annotated", self) title.setAlignment(QtCore.Qt.AlignCenter) self._all_files_progress = QProgressBar(self) self._all_files_progress.setMinimum(1) self._all_files_progress.setMaximum(len(wav_files)) self._file_name_lbl = QLabel("File: ", self) self._file_name_lbl.setAlignment(QtCore.Qt.AlignCenter) self._file_progress_lbl = QLabel("0%", self) self._file_progress_lbl.setAlignment(QtCore.Qt.AlignCenter) gridLayout.setRowStretch(0, 0) gridLayout.addWidget(title, 1, 0) gridLayout.setRowStretch(2, 0) gridLayout.addWidget(self._all_files_progress, 3, 0) gridLayout.addWidget(self._file_name_lbl, 4, 0) gridLayout.addWidget(self._file_progress_lbl, 5, 0) gridLayout.setRowStretch(49, 0) gridLayout.setRowStretch(50, 0) thread = Thread(target=self.exe_controler, args=()) thread.start() def exe_controler(self): # net = network.open(self.network_location) i = 0 for file_name in self.wav_files: self._file_name_lbl.setText("File: " + file_name) # net.annotate_wav_file(file_name, self.output_directory) time.sleep(0.1) # Delete This Line Shortly self._all_files_progress.setValue(i) self._file_progress_lbl.setText(str(i * 100 / len(self.wav_files)) + "%") i += 1 self._all_files_progress.setValue(len(self.wav_files)) self._file_progress_lbl.setText("100%; Your files have now been annotated. Please close this window.")
class DownloadDialog(QDialog): # {{{ def __init__(self, url, fname, parent): QDialog.__init__(self, parent) self.setWindowTitle(_('Download %s')%fname) self.l = QVBoxLayout(self) self.purl = urlparse(url) self.msg = QLabel(_('Downloading <b>%(fname)s</b> from %(url)s')%dict( fname=fname, url=self.purl.netloc)) self.msg.setWordWrap(True) self.l.addWidget(self.msg) self.pb = QProgressBar(self) self.pb.setMinimum(0) self.pb.setMaximum(0) self.l.addWidget(self.pb) self.bb = QDialogButtonBox(QDialogButtonBox.Cancel, Qt.Horizontal, self) self.l.addWidget(self.bb) self.bb.rejected.connect(self.reject) sz = self.sizeHint() self.resize(max(sz.width(), 400), sz.height()) fpath = PersistentTemporaryFile(os.path.splitext(fname)[1]) fpath.close() self.fpath = fpath.name self.worker = Worker(url, self.fpath, Queue()) self.rejected = False def reject(self): self.rejected = True QDialog.reject(self) def start_download(self): self.worker.start() QTimer.singleShot(50, self.update) self.exec_() if self.worker.err is not None: error_dialog(self.parent(), _('Download failed'), _('Failed to download from %(url)r with error: %(err)s')%dict( url=self.worker.url, err=self.worker.err), det_msg=self.worker.tb, show=True) def update(self): if self.rejected: return try: progress = self.worker.rq.get_nowait() except Empty: pass else: self.update_pb(progress) if not self.worker.is_alive(): return self.accept() QTimer.singleShot(50, self.update) def update_pb(self, progress): transferred, block_size, total = progress if total == -1: self.pb.setMaximum(0) self.pb.setMinimum(0) self.pb.setValue(0) else: so_far = transferred * block_size self.pb.setMaximum(max(total, so_far)) self.pb.setValue(so_far) @property def err(self): return self.worker.err
class SplashScreen(QSplashScreen): """ Display a Splashscreen """ signal_done = QtCore.pyqtSignal() def __init__(self): QSplashScreen.__init__(self, QtGui.QPixmap(), QtCore.Qt.WindowStaysOnTopHint) self.rootDir = Path(__file__).parent # default values self.image = None self.version = "Version: 3.x" # pixmap.height - ? self.progress_y = 68 # pixmap.width - ? self.vx = 24 # pixmap.height - ? self.vy = 32 # message font size self.msize = 12 self.cv = OpenCVLib() self.progressBar = QProgressBar(self) self.progressBar.setMinimum(0) self.progressBar.setValue(0) self.progressBar.setMaximum(100) self.progressBar.setTextVisible(False) self.setPositionProgressBar() self.message = QLabel(self) self.message.setFont(QFont("Arial", self.msize)) self.message.setStyleSheet("QLabel { color : #000000; }") self.message.setAlignment(Qt.AlignCenter) # Shadow Effekt effect = QGraphicsDropShadowEffect(self) effect.setBlurRadius(5) effect.setColor(QColor("#ffffff")) effect.setOffset(1, 1) self.message.setGraphicsEffect(effect) self.setPositionMessage() # self.message.hide() # CSS Styling self.setStyleSheet(""" QProgressBar{ border: 1px solid #eeeeee; text-align: center; padding: 0; margin-top: 10px; } QProgressBar::chunk{ background-color: #3daee9; width: 0.34em; margin: 0 1px; } """) def show(self, *args, **kwargs): if self.image == None: raise ValueError('Specify an Image via SplashScreen::setImage()') return QSplashScreen.show(self, *args, **kwargs) def setMessage(self, msg): self.message.setText("%s ..." % (msg)) self.message.show() def setPositionMessage(self): """ place Message on screen """ # where is progress? p = self.progressBar.geometry() self.message.setGeometry(0, p.y() - self.msize, self.pixmap().width(), 2 * self.msize) self.message.updateGeometry() def setPositionProgressBar(self): """ place ProgressBar on screen """ margin = 10 # x, y, w, h self.progressBar.setGeometry(margin, self.pixmap().height() - self.progress_y, self.pixmap().width() - 2 * margin, 20) self.progressBar.updateGeometry() def scale(self, pix): gold = 0.618 h = pix.size().height() w = pix.size().width() # max width 68% of screen screen = QGuiApplication.screens()[0] new_w = screen.geometry().width() * gold new_h = h * new_w / w # python resize # return pix.scaled(new_w, new_h, Qt.KeepAspectRatioByExpanding | Qt.SmoothTransformation) # resize with opencv Qimg = pix.toImage() img = self.cv.QImage2MAT(Qimg) resized = self.cv.resizeTo(img, new_w, new_h) return self.cv.MAT2QPixmap(resized) def setVersion(self, version): """ adds a Version Number and updates the image """ self.version = "Version: %s" % version def paintEvent(self, *args, **kwargs): """ override, important to work """ return QSplashScreen.paintEvent(self, *args, **kwargs) def setImage(self, img): """ sets the image and adds a Version Number """ self.image = self.rootDir.joinpath(img).as_posix() splash_pix = QtGui.QPixmap(self.image, format='jpg') if splash_pix.isNull(): raise ValueError('Error loading Image [self.image]') # Add version painter = QtGui.QPainter(splash_pix) painter.setRenderHint(QtGui.QPainter.Antialiasing) painter.setFont(QFont("Arial", 18)) painter.setPen(QColor("#666666")) painter.drawText(0, 0, splash_pix.size().width() - self.vx, splash_pix.size().height() - self.vy, QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight, self.version) painter.end() self.setPixmap(self.scale(splash_pix)) # ---------------------------------------------- # other stuff self.setPositionProgressBar() self.setPositionMessage() def step(self): """ a preloading step is done """ self.progressBar.setValue(self.progressBar.value() + 1) self.progressBar.repaint() if (self.progressBar.value() >= (self.progressBar.maximum() - 1)): self.signal_done.emit() def setProgressMax(self, maxval): self.progressBar.setMaximum(maxval)