class BR_JobDock(QDockWidget): transcode_data = pyqtSignal([dict], [str]) job_complete = pyqtSignal() def __init__(self, job, passes, job_id, closesig, source, parent=None): name = source.title super().__init__(name, parent) self.job = job self.passes = passes self.job_id = job_id self.closesig = closesig self.source = source self.setWindowTitle(name) self.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) self.setAllowedAreas(Qt.BottomDockWidgetArea) self.setFloating(True) self.widget = QWidget() layout = QVBoxLayout() # layout.setSizeConstraint(QVBoxLayout.SetFixedSize) message_layout = QFormLayout() self.lblPass = QLabel('Pass ? of {}'.format(passes)) message_layout.addRow(self.lblPass) self.lblFrame = QLabel('?') message_layout.addRow('Frame:', self.lblFrame) self.lblFps = QLabel('?') message_layout.addRow('Frames per Second:', self.lblFps) self.lblSize = QLabel('?') message_layout.addRow('File Size:', self.lblSize) self.lblTime = QLabel('?') message_layout.addRow('Video Time:', self.lblTime) self.lblBitrate = QLabel('?') message_layout.addRow('Bitrate:', self.lblBitrate) layout.addLayout(message_layout) self.progressbar = QProgressBar() self.progressbar.setRange(0, self.source.length.total_seconds()) layout.addWidget(self.progressbar) self.qualitybar = QualityBar() layout.addWidget(self.qualitybar) btn_layout = QHBoxLayout() btn_More = QPushButton('More') btn_More.setCheckable(True) btn_layout.addWidget(btn_More) btn_layout.addStretch() self.btnCancel = QPushButton('Close') self.btnCancel.setIcon(QIcon(QPixmap(':/icons/application-exit.png'))) self.btnCancel.clicked.connect(self.on_cancel_clicked) btn_layout.addWidget(self.btnCancel) layout.addLayout(btn_layout) self.terminal = QPlainTextEdit() self.terminal.setReadOnly(True) self.terminal.setShown(False) # self.terminal.setMinimumWidth(400) btn_More.toggled.connect(self.terminal.setVisible) layout.addWidget(self.terminal) griplayout = QHBoxLayout() griplayout.addWidget(QSizeGrip(self.widget)) griplayout.addStretch() griplayout.addWidget(QSizeGrip(self.widget)) layout.addLayout(griplayout) self.widget.setLayout(layout) self.setWidget(self.widget) self.transcode_data[dict].connect(self.on_avconv_data) self.transcode_data[str].connect(self.on_terminal_data) self.closesig.connect(parent.on_jobclose) def start(self, dir): self.runjob = TranscodeJob(self.job, self.passes, self.source, dir, self.transcode_data, self.job_complete) self.runjob.completesig.connect(self.on_job_complete) self.btnCancel.setText('Stop') self.runjob.start() @pyqtSlot(dict) def on_avconv_data(self, match): self.lblPass.setText('Pass {pass} of {passes}'.format(**match)) self.lblFrame.setText('{frame}'.format(**match)) self.lblFps.setText('{fps}'.format(**match)) size = round(int(match['size']) / 1024, 2) self.lblSize.setText('{} MB'.format(size)) time = DvdTimeDelta(seconds=float(match['time'])) self.lblTime.setText('{}'.format(time)) self.lblBitrate.setText('{bitrate} kbps'.format(**match)) self.qualitybar.setValue(int(round(float(match['q']) * 10))) self.progressbar.setValue(int(round(float(match['time'])))) @pyqtSlot(str) def on_terminal_data(self, text): self.terminal.appendPlainText(text) @pyqtSlot() def on_cancel_clicked(self): if self.runjob.is_alive(): msg = QMessageBox(QMessageBox.Question, 'Cancelling Job', 'Do you want to cancel the running job?') msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No) msg.setDefaultButton(QMessageBox.No) ans = msg.exec_() if ans == QMessageBox.Yes: self.runjob.cancel() else: self.close_demand() @pyqtSlot() def on_job_complete(self): self.lblPass.setText('Completed') self.btnCancel.setText('Close') def close_demand(self): self.closesig.emit(self.job_id) self.close() def cancel(self): self.runjob.cancel() self.runjob.join()