Sat, 24 Apr 2021 11:30:11 +0200
- implemented some code simplifications
# -*- coding: utf-8 -*- # Copyright (c) 2020 - 2021 Detlev Offenbach <detlev@die-offenbachs.de> # """ Module implementing a dialog to show the application routes. """ from PyQt5.QtCore import pyqtSlot, Qt, QProcess from PyQt5.QtGui import QGuiApplication from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QTreeWidgetItem from E5Gui import E5MessageBox from .Ui_RoutesDialog import Ui_RoutesDialog class RoutesDialog(QDialog, Ui_RoutesDialog): """ Class implementing a dialog to show the application routes. """ def __init__(self, project, parent=None): """ Constructor @param project reference to the project object @type Project @param parent reference to the parent widget @type QWidget """ super().__init__(parent) self.setupUi(self) self.__refreshButton = self.buttonBox.addButton( self.tr("Refresh"), QDialogButtonBox.ActionRole) self.__refreshButton.clicked.connect(self.showRoutes) self.__project = project self.__process = None def showRoutes(self): """ Public method to show the list of routes. @return flag indicating success @rtype bool """ workdir, env = self.__project.prepareRuntimeEnvironment() if env is not None: command = self.__project.getFlaskCommand() self.__process = QProcess() self.__process.setProcessEnvironment(env) self.__process.setWorkingDirectory(workdir) self.__process.setProcessChannelMode(QProcess.MergedChannels) args = ["routes"] if self.matchButton.isChecked(): sortorder = "match" elif self.endpointButton.isChecked(): sortorder = "endpoint" elif self.methodsButton.isChecked(): sortorder = "methods" elif self.ruleButton.isChecked(): sortorder = "rule" else: sortorder = "" if sortorder: args += ["--sort", sortorder] if self.allMethodsCheckBox.isChecked(): args.append("--all-methods") QGuiApplication.setOverrideCursor(Qt.WaitCursor) self.__process.start(command, args) ok = self.__process.waitForStarted(10000) if ok: ok = self.__process.waitForFinished(10000) if ok: out = str(self.__process.readAllStandardOutput(), "utf-8") self.__processOutput(out) else: E5MessageBox.critical( None, self.tr("Flask Routes"), self.tr("""The Flask process did not finish within""" """ 10 seconds.""")) else: E5MessageBox.critical( None, self.tr("Flask Routes"), self.tr("""The Flask process could not be started.""")) for column in range(self.routesList.columnCount()): self.routesList.resizeColumnToContents(column) QGuiApplication.restoreOverrideCursor() return ok else: return False def __processOutput(self, output): """ Private method to process the flask output and populate the routes list. @param output output of the flask process @type str """ self.routesList.clear() lines = output.splitlines() widths = [len(part) for part in lines[1].split()] for line in lines[2:]: parts = [] for width in widths: parts.append(line[:width].strip()) line = line[width:].lstrip() QTreeWidgetItem(self.routesList, parts) @pyqtSlot(bool) def on_matchButton_toggled(self, checked): """ Private slot handling the selection of the 'match' sort order. @param checked state of the button @type bool """ if checked: self.showRoutes() @pyqtSlot(bool) def on_endpointButton_toggled(self, checked): """ Private slot handling the selection of the 'endpoint' sort order. @param checked state of the button @type bool """ if checked: self.showRoutes() @pyqtSlot(bool) def on_methodsButton_toggled(self, checked): """ Private slot handling the selection of the 'methods' sort order. @param checked state of the button @type bool """ if checked: self.showRoutes() @pyqtSlot(bool) def on_ruleButton_toggled(self, checked): """ Private slot handling the selection of the 'rule' sort order. @param checked state of the button @type bool """ if checked: self.showRoutes() @pyqtSlot(bool) def on_allMethodsCheckBox_toggled(self, checked): """ Private slot handling the selection to show all methods. @param checked state of the button @type bool """ self.showRoutes()