--- a/ProjectFlask/RunServerDialog.py Fri Nov 13 19:51:28 2020 +0100 +++ b/ProjectFlask/RunServerDialog.py Sat Nov 14 19:56:06 2020 +0100 @@ -11,7 +11,7 @@ from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QTimer from PyQt5.QtGui import QTextCharFormat -from PyQt5.QtWidgets import QDialog, QDialogButtonBox +from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QMenu from E5Gui import E5MessageBox from E5Gui.E5Application import e5App @@ -19,6 +19,9 @@ from .Ui_RunServerDialog import Ui_RunServerDialog from . import AnsiTools +from .ServerStartOptionsDialog import ServerStartOptionsDialog + +import UI.PixmapCache # TODO: should this be placed into the sidebar as a sidebar widget? @@ -26,12 +29,14 @@ """ Class implementing a dialog to run the Flask server. """ - def __init__(self, plugin, parent=None): + def __init__(self, plugin, project, parent=None): """ Constructor @param plugin reference to the plug-in object @type PluginProjectFlask + @param project reference to the project object + @type Project @param parent reference to the parent widget @type QWidget """ @@ -39,11 +44,16 @@ self.setupUi(self) self.__plugin = plugin + self.__project = project + + self.__serverOptions = { + "development": False + } self.__process = None self.__serverUrl = "" - self.__ansiRe = re.compile(r"""(\\x1b\[\d+m)""") + self.__ansiRe = re.compile("(\\x1b\[\d+m)") self.__urlRe = re.compile(r""" * Running on ([^(]+) \(.*""") @@ -51,22 +61,67 @@ self.buttonBox.button(QDialogButtonBox.Close).setDefault(True) self.__defaultTextFormat = self.outputEdit.currentCharFormat() + + self.__initActionsMenu() - def startServer(self, project, development=False): + def __initActionsMenu(self): + """ + Private method to populate the actions button menu. + """ + self.__actionsMenu = QMenu() + self.__actionsMenu.setTearOffEnabled(True) + self.__actionsMenu.setToolTipsVisible(True) + self.__actionsMenu.aboutToShow.connect(self.__showActionsMenu) + + # re-start server + self.__actionsMenu.addAction( + self.tr("Re-start Server"), self.__restartServer) + self.__restartModeAct = self.__actionsMenu.addAction( + self.tr("Re-start Server"), self.__restartServerDifferentMode) + self.__actionsMenu.addSeparator() + self.__actionsMenu.addAction( + self.tr("Re-start Server with Options"), + self.__restartServerWithOptions) + # start server with options + + self.menuButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton")) + self.menuButton.setMenu(self.__actionsMenu) + + @pyqtSlot() + def __showActionsMenu(self): + """ + Private slot handling the actions menu about to be shown. + """ + if self.__serverOptions["development"]: + self.__restartModeAct.setText( + self.tr("Re-start Server (Production Mode)")) + else: + self.__restartModeAct.setText( + self.tr("Re-start Server (Development Mode)")) + + def startServer(self, development=False, restart=False, + askForOptions=False): """ Public method to start the Flask server process. - @param project reference to the project object - @type Project @param development flag indicating development mode @type bool @return flag indicating success @rtype bool """ - workdir, env = project.prepareRuntimeEnvironment( - development=development) + self.__serverOptions["development"] = development + + if askForOptions: + dlg = ServerStartOptionsDialog(self.__serverOptions) + if dlg.exec() != QDialog.Accepted: + return False + + self.__serverOptions.update(dlg.getDataDict()) + + workdir, env = self.__project.prepareRuntimeEnvironment( + development=self.__serverOptions["development"]) if env is not None: - command = project.getFlaskCommand() + command = self.__project.getFlaskCommand() self.__process = QProcess() self.__process.setProcessEnvironment(env) @@ -76,11 +131,13 @@ self.__process.readyReadStandardOutput.connect(self.__readStdOut) self.__process.finished.connect(self.__processFinished) + self.outputEdit.clear() + args = ["run"] -# if host: -# args += ["--host", host] -# if port: -# args += ["--port", str(port)] + if "host" in self.__serverOptions and self.__serverOptions["host"]: + args += ["--host", self.__serverOptions["host"]] + if "port" in self.__serverOptions and self.__serverOptions["port"]: + args += ["--port", self.__serverOptions["port"]] self.__process.start(command, args) ok = self.__process.waitForStarted(10000) @@ -94,6 +151,7 @@ self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) self.stopServerButton.setEnabled(True) self.stopServerButton.setDefault(True) + self.startBrowserButton.setEnabled(True) else: ok = False @@ -120,7 +178,6 @@ urlMatch = self.__urlRe.search(out) if urlMatch: self.__serverUrl = urlMatch.group(1) - self.startBrowserButton.setEnabled(True) for txt in self.__ansiRe.split(out): if txt.startswith("\x1b["): @@ -180,3 +237,36 @@ else: e5App().getObject("UserInterface").launchHelpViewer( self.__serverUrl) + + @pyqtSlot() + def __restartServer(self): + """ + Private slot to restart the server process. + """ + # step 1: stop the current server + self.on_stopServerButton_clicked() + + # step 2: start a new server + self.startServer(development=self.__serverOptions["development"]) + + @pyqtSlot() + def __restartServerDifferentMode(self): + """ + Private slot to restart the server process with the opposite mode. + """ + # step 1: stop the current server + self.on_stopServerButton_clicked() + + # step 2: start a new server + self.startServer(development=not self.__serverOptions["development"]) + @pyqtSlot() + def __restartServerWithOptions(self): + """ + Private slot to restart the server asking for start options. + """ + # step 1: stop the current server + self.on_stopServerButton_clicked() + + # step 2: start a new server + self.startServer(development=self.__serverOptions["development"], + askForOptions=True)