class RotatingIcon(QLabel): def __init__(self, resource, parent=None, steps=20, width=15, height=15): QLabel.__init__(self, parent) self._resource = resource self._steps = steps self._width = width self._height = height self._progressTimeLine = QTimeLine(1000, self) self._progressTimeLine.setFrameRange(0, self._steps) self._progressTimeLine.setLoopCount(0) self.connect(self._progressTimeLine, SIGNAL("frameChanged(int)"), self.setProgress) self._renderPixmaps() self.setProgress(0) def _renderPixmaps(self): self._pixmaps = [] for i in range(self._steps + 1): angle = int(i * 360.0 / self._steps) pixmap = QPixmap(self._resource) # if problem with loading png if pixmap.size().width() == 0: self._pixmaps = None return rotate_matrix = QMatrix() rotate_matrix.rotate(angle) pixmap_rotated = pixmap.transformed(rotate_matrix) pixmap_moved = QPixmap(pixmap.size()) pixmap_moved.fill(Qt.transparent) painter = QPainter() painter.begin(pixmap_moved) painter.drawPixmap( (pixmap_moved.width() - pixmap_rotated.width()) / 2.0, (pixmap_moved.height() - pixmap_rotated.height()) / 2.0, pixmap_rotated) painter.end() self._pixmaps += [pixmap_moved.scaled(self._width, self._height)] def setProgress(self, progress): if self._pixmaps != None: self.setPixmap(self._pixmaps[progress]) def start(self): self.setProgress(0) self._progressTimeLine.start() def stop(self): self._progressTimeLine.stop()
class RotatingIcon(QLabel): def __init__(self,resource,parent=None,steps=20,width=15,height=15): QLabel.__init__(self,parent) self._resource=resource self._steps=steps self._width=width self._height=height self._progressTimeLine = QTimeLine(1000, self) self._progressTimeLine.setFrameRange(0, self._steps) self._progressTimeLine.setLoopCount(0) self.connect(self._progressTimeLine, SIGNAL("frameChanged(int)"), self.setProgress) self._renderPixmaps() self.setProgress(0) def _renderPixmaps(self): self._pixmaps=[] for i in range(self._steps+1): angle = int(i * 360.0 / self._steps) pixmap = QPixmap(self._resource) # if problem with loading png if pixmap.size().width()==0: self._pixmaps=None return rotate_matrix = QMatrix() rotate_matrix.rotate(angle) pixmap_rotated = pixmap.transformed(rotate_matrix) pixmap_moved = QPixmap(pixmap.size()) pixmap_moved.fill(Qt.transparent) painter = QPainter() painter.begin(pixmap_moved) painter.drawPixmap((pixmap_moved.width() - pixmap_rotated.width()) / 2.0, (pixmap_moved.height() - pixmap_rotated.height()) / 2.0, pixmap_rotated) painter.end() self._pixmaps+=[pixmap_moved.scaled(self._width, self._height)] def setProgress(self, progress): if self._pixmaps!=None: self.setPixmap(self._pixmaps[progress]) def start(self): self.setProgress(0) self._progressTimeLine.start() def stop(self): self._progressTimeLine.stop()
class ProgressDialog(Ui_ProgressDialog, DialogBase): def __init__(self, publisher, plugin, parentWidget=None): DialogBase.__init__(self, parentWidget) self.setupUi(self) self.setObjectName("ProgressDialog") self.viewButton_.setEnabled(False) self._publisher = publisher self._plugin = plugin self._parent = parentWidget self._cancelled = False self._timeline = QTimeLine(1000*60, self) self._timeline.setFrameRange(0, 2*60) self._timeline.setLoopCount(0) self.progressBar_.setRange(0, 60) self.connect(self._timeline, QtCore.SIGNAL("frameChanged(int)"), self.updateProgressBar) self.outputGroupBox_ = QGroupBox("Script output", None) self.outputTextEdit_ = QTextEdit() self.outputTextEdit_.setTextInteractionFlags(Qt.TextSelectableByKeyboard | Qt.TextSelectableByMouse) self.outputTextEdit_.setReadOnly(True) self.outputTextEdit_.setTabChangesFocus(True) self.outputTextEdit_.setAcceptRichText(False) groupBoxLayout = QVBoxLayout() groupBoxLayout.setObjectName("groupBoxLayout") groupBoxLayout.setMargin(0) groupBoxLayout.addWidget(self.outputTextEdit_) self.outputGroupBox_.setLayout(groupBoxLayout) gridLayout = QGridLayout() gridLayout.setSizeConstraint(gridLayout.SetFixedSize) gridLayout.addWidget(self.progressLabel_, 0, 0, 1, 4) gridLayout.addWidget(self.progressBar_, 1, 0, 1, 4) gridLayout.addWidget(self.detailsCheckBox_, 2, 0) hSpacer = QSpacerItem(250, 10, QSizePolicy.Expanding) gridLayout.addItem(hSpacer, 2, 1) gridLayout.addWidget(self.viewButton_, 2, 2) gridLayout.addWidget(self.cancelButton_, 2, 3) gridLayout.addWidget(self.outputGroupBox_, 3, 0, 1, 4) self.setLayout(gridLayout) self.outputGroupBox_.setVisible(False) def updateProgressBar(self, frame): self.progressBar_.setValue(self.progressBar_.value() + 1) def on_detailsCheckBox__stateChanged(self, state): self.outputGroupBox_.setVisible(Qt.Checked == state) gridLayout = self.layout() if Qt.Checked == state: gridLayout.setSizeConstraint(gridLayout.SetMaximumSize) self.setSizeGripEnabled(True) else: gridLayout.setSizeConstraint(gridLayout.SetFixedSize) self.setSizeGripEnabled(False) def on_cancelButton__clicked(self, released=True): if not released: return if self._cancelled: self.reject() return self.cancelButton_.setEnabled(False) self.progressLabel_.setText("Cancelling...") self._publisher.cancel() self._cancelled = True QTimer.singleShot(5*1000, self, QtCore.SLOT("_kill()")) @QtCore.pyqtSignature("_kill()") def _cancel(self): self._parent.update() self._publisher.cancel(True) self.reject() def updatePublisherOutput(self, data): self.outputTextEdit_.append(data) def publishComplete(self, exitCode, exitStatus): self.progressBar_.setValue(self.progressBar_.maximum()) self._timeline.stop() if self._cancelled: self.reject() self._cancelled = True publishSuccess = (0 == exitCode and QProcess.NormalExit == exitStatus) output_exists = self.__findOutput() self.viewButton_.setEnabled(publishSuccess and \ output_exists) if not publishSuccess: self.progressLabel_.setText("Publishing failed, see script output" " for more details") else: self.progressLabel_.setText("Publishing completed") def __findOutput(self): output_exists = os.path.exists(unicode(self._outFile)) if not output_exists: output_exists = self.__findInSubdir() if not(output_exists) and ('Dita' in self._publisher.__str__()) : output_exists = self.__findInLog() if not(output_exists) and ('Docbook' in self._publisher.__str__()) : output_exists = self.__findInPI() return output_exists def __findInLog(self): log = self.outputTextEdit_.toPlainText() src_filename = os.path.basename(self._publisher.attrs()['srcUri']) dst_filename = src_filename.split('.')[0] + "." + self._publisher.attrs()['extension'] re_str = '\[xslt\] Processing.*?' + src_filename + ' to (?P<outputFilename>.*?' + dst_filename + ')' output_re = re.compile(re_str) output_filename = '' if None != output_re.search(log): output_filename = output_re.search(log).group("outputFilename") if not output_filename: return False real_dst_dir = os.path.dirname(unicode(output_filename)) dst_filename = os.path.join(real_dst_dir, os.path.basename(self._outFile)) os.rename(output_filename, dst_filename) output_exists = os.path.exists(dst_filename) if output_exists: self._outFile = dst_filename self._parent.setOutputFilePath(self._outFile) return True return False def __findInPI(self): src_uri = self._publisher.attrs()['srcUri'] grove = Grove.buildGroveFromFile(src_uri) xpath_value = XpathExpr("//self::processing-instruction('dbhtml')").eval(grove.document()) dbhtml_pi = xpath_value.getNodeSet().firstNode() str_ = unicode(dbhtml_pi.asGrovePi().data()) filename_re = re.compile('filename="(?P<filename>.*?\n?.*?)"') dir_re = re.compile('dir="(?P<dir>.*?\n?.*?)"') if None != filename_re.search(str_): filename_ = filename_re.search(str_).group("filename") if None != dir_re.search(str_): dir_ = dir_re.search(str_).group("dir") out_dir = os.path.dirname(self._outFile) combined_output_filename = os.path.join(out_dir, dir_, filename_) output_exists = os.path.exists(combined_output_filename) if output_exists: self._outFile = combined_output_filename self._parent.setOutputFilePath(self._outFile) return True return False def __findInSubdir(self): output_filename = unicode(self._outFile) filename_ = os.path.basename(output_filename) dir_ = os.path.dirname(output_filename) folder_name = os.path.basename(dir_) output_filename = os.path.join(dir_, folder_name, filename_) output_exists = os.path.exists(output_filename) if output_exists: self._outFile = output_filename self._parent.setOutputFilePath(self._outFile) return True return False def on_viewButton__clicked(self, released=True): if not released: return self._plugin.launchViewer(os.path.abspath(self._outFile)) def publish(self, dsi, outFile): if not self._publisher: self.updatePublisherOutput("Script is not found") self.publishComplete(1, QProcess.Crashed) return self.exec_() self._outFile = outFile self.show() try: self.progressBar_.setValue(self.progressBar_.minimum() + 1) self._publisher.publish(self, dsi, outFile) self._timeline.start() except PublishException, pe: self.updatePublisherOutput(pe.getErrorString()) return self.exec_()
class ProgressDialog(Ui_ProgressDialog, DialogBase): def __init__(self, publisher, plugin, parentWidget=None): DialogBase.__init__(self, parentWidget) self.setupUi(self) self.setObjectName("ProgressDialog") self.viewButton_.setEnabled(False) self._publisher = publisher self._plugin = plugin self._parent = parentWidget self._cancelled = False self._timeline = QTimeLine(1000 * 60, self) self._timeline.setFrameRange(0, 2 * 60) self._timeline.setLoopCount(0) self.progressBar_.setRange(0, 60) self.connect(self._timeline, QtCore.SIGNAL("frameChanged(int)"), self.updateProgressBar) self.outputGroupBox_ = QGroupBox("Script output", None) self.outputTextEdit_ = QTextEdit() self.outputTextEdit_.setTextInteractionFlags( Qt.TextSelectableByKeyboard | Qt.TextSelectableByMouse) self.outputTextEdit_.setReadOnly(True) self.outputTextEdit_.setTabChangesFocus(True) self.outputTextEdit_.setAcceptRichText(False) groupBoxLayout = QVBoxLayout() groupBoxLayout.setObjectName("groupBoxLayout") groupBoxLayout.setMargin(0) groupBoxLayout.addWidget(self.outputTextEdit_) self.outputGroupBox_.setLayout(groupBoxLayout) gridLayout = QGridLayout() gridLayout.setSizeConstraint(gridLayout.SetFixedSize) gridLayout.addWidget(self.progressLabel_, 0, 0, 1, 4) gridLayout.addWidget(self.progressBar_, 1, 0, 1, 4) gridLayout.addWidget(self.detailsCheckBox_, 2, 0) hSpacer = QSpacerItem(250, 10, QSizePolicy.Expanding) gridLayout.addItem(hSpacer, 2, 1) gridLayout.addWidget(self.viewButton_, 2, 2) gridLayout.addWidget(self.cancelButton_, 2, 3) gridLayout.addWidget(self.outputGroupBox_, 3, 0, 1, 4) self.setLayout(gridLayout) self.outputGroupBox_.setVisible(False) def updateProgressBar(self, frame): self.progressBar_.setValue(self.progressBar_.value() + 1) def on_detailsCheckBox__stateChanged(self, state): self.outputGroupBox_.setVisible(Qt.Checked == state) gridLayout = self.layout() if Qt.Checked == state: gridLayout.setSizeConstraint(gridLayout.SetMaximumSize) self.setSizeGripEnabled(True) else: gridLayout.setSizeConstraint(gridLayout.SetFixedSize) self.setSizeGripEnabled(False) def on_cancelButton__clicked(self, released=True): if not released: return if self._cancelled: self.reject() return self.cancelButton_.setEnabled(False) self.progressLabel_.setText("Cancelling...") self._publisher.cancel() self._cancelled = True QTimer.singleShot(5 * 1000, self, QtCore.SLOT("_kill()")) @QtCore.pyqtSignature("_kill()") def _cancel(self): self._parent.update() self._publisher.cancel(True) self.reject() def updatePublisherOutput(self, data): self.outputTextEdit_.append(data) def publishComplete(self, exitCode, exitStatus): self.progressBar_.setValue(self.progressBar_.maximum()) self._timeline.stop() if self._cancelled: self.reject() self._cancelled = True publishSuccess = (0 == exitCode and QProcess.NormalExit == exitStatus) output_exists = self.__findOutput() self.viewButton_.setEnabled(publishSuccess and \ output_exists) if not publishSuccess: self.progressLabel_.setText("Publishing failed, see script output" " for more details") else: self.progressLabel_.setText("Publishing completed") def __findOutput(self): output_exists = os.path.exists(unicode(self._outFile)) if not output_exists: output_exists = self.__findInSubdir() if not (output_exists) and ('Dita' in self._publisher.__str__()): output_exists = self.__findInLog() if not (output_exists) and ('Docbook' in self._publisher.__str__()): output_exists = self.__findInPI() return output_exists def __findInLog(self): log = self.outputTextEdit_.toPlainText() src_filename = os.path.basename(self._publisher.attrs()['srcUri']) dst_filename = src_filename.split( '.')[0] + "." + self._publisher.attrs()['extension'] re_str = '\[xslt\] Processing.*?' + src_filename + ' to (?P<outputFilename>.*?' + dst_filename + ')' output_re = re.compile(re_str) output_filename = '' if None != output_re.search(log): output_filename = output_re.search(log).group("outputFilename") if not output_filename: return False real_dst_dir = os.path.dirname(unicode(output_filename)) dst_filename = os.path.join(real_dst_dir, os.path.basename(self._outFile)) os.rename(output_filename, dst_filename) output_exists = os.path.exists(dst_filename) if output_exists: self._outFile = dst_filename self._parent.setOutputFilePath(self._outFile) return True return False def __findInPI(self): src_uri = self._publisher.attrs()['srcUri'] grove = Grove.buildGroveFromFile(src_uri) xpath_value = XpathExpr( "//self::processing-instruction('dbhtml')").eval(grove.document()) dbhtml_pi = xpath_value.getNodeSet().firstNode() str_ = unicode(dbhtml_pi.asGrovePi().data()) filename_re = re.compile('filename="(?P<filename>.*?\n?.*?)"') dir_re = re.compile('dir="(?P<dir>.*?\n?.*?)"') if None != filename_re.search(str_): filename_ = filename_re.search(str_).group("filename") if None != dir_re.search(str_): dir_ = dir_re.search(str_).group("dir") out_dir = os.path.dirname(self._outFile) combined_output_filename = os.path.join(out_dir, dir_, filename_) output_exists = os.path.exists(combined_output_filename) if output_exists: self._outFile = combined_output_filename self._parent.setOutputFilePath(self._outFile) return True return False def __findInSubdir(self): output_filename = unicode(self._outFile) filename_ = os.path.basename(output_filename) dir_ = os.path.dirname(output_filename) folder_name = os.path.basename(dir_) output_filename = os.path.join(dir_, folder_name, filename_) output_exists = os.path.exists(output_filename) if output_exists: self._outFile = output_filename self._parent.setOutputFilePath(self._outFile) return True return False def on_viewButton__clicked(self, released=True): if not released: return self._plugin.launchViewer(os.path.abspath(self._outFile)) def publish(self, dsi, outFile): if not self._publisher: self.updatePublisherOutput("Script is not found") self.publishComplete(1, QProcess.Crashed) return self.exec_() self._outFile = outFile self.show() try: self.progressBar_.setValue(self.progressBar_.minimum() + 1) self._publisher.publish(self, dsi, outFile) self._timeline.start() except PublishException, pe: self.updatePublisherOutput(pe.getErrorString()) return self.exec_()