ProjectFlask/RunServerDialog.py

changeset 9
79094fb72c18
parent 6
d491ccab7343
child 10
506c78268b18
diff -r cfbd3a2757fd -r 79094fb72c18 ProjectFlask/RunServerDialog.py
--- 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)

eric ide

mercurial