ProjectFlask/FlaskCommandDialog.py

changeset 15
3f5c05eb2d5f
parent 11
da6ef8ab8268
child 16
dd3f6bfb85f7
--- a/ProjectFlask/FlaskCommandDialog.py	Thu Nov 19 18:34:05 2020 +0100
+++ b/ProjectFlask/FlaskCommandDialog.py	Thu Nov 19 20:19:55 2020 +0100
@@ -35,11 +35,14 @@
         
         self.__process = None
         
+        self.successMessage = ""
+        self.errorMessage = ""
+        
         self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True)
         self.buttonBox.button(QDialogButtonBox.Close).setDefault(True)
         self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False)
     
-    def startCommand(self, command, args=None):
+    def startFlaskCommand(self, command, args=None):
         """
         Public method to start a flask command and show its output.
         
@@ -86,6 +89,61 @@
         
         return ok
     
+    def startBabelCommand(self, command, args, title, msgSuccess="",
+                          msgError=""):
+        """
+        Public method to start a pybabel command and show its output.
+        
+        @param command pybabel command to be run
+        @type str
+        @param args list of command line arguments for the command
+        @type list of str
+        @param title window title of the dialog
+        @type str
+        @param msgSuccess success message to be shown
+        @type str
+        @param msgError message to be shown on error
+        @type str
+        @return flag indicating a successful start
+        @rtype bool
+        """
+        self.setWindowTitle(title)
+        
+        self.successMessage = msgSuccess
+        self.errorMessage = msgError
+        
+        workdir, _ = self.__project.getApplication()
+        babelCommand = self.__project.getBabelCommand()
+        
+        self.__process = QProcess()
+        self.__process.setWorkingDirectory(workdir)
+        self.__process.setProcessChannelMode(QProcess.MergedChannels)
+        
+        self.__process.readyReadStandardOutput.connect(self.__readStdOut)
+        self.__process.finished.connect(self.__processFinished)
+        
+        self.outputEdit.clear()
+        
+        babelArgs = [command]
+        if args:
+            babelArgs += args
+        
+        self.__process.start(babelCommand, babelArgs)
+        ok = self.__process.waitForStarted(10000)
+        if not ok:
+            E5MessageBox.critical(
+                None,
+                self.tr("Execute PyBabel Command"),
+                self.tr("""The pybabel process could not be started."""))
+        else:
+            self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False)
+            self.buttonBox.button(QDialogButtonBox.Cancel).setDefault(True)
+            self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(True)
+            self.buttonBox.button(QDialogButtonBox.Cancel).setFocus(
+                Qt.OtherFocusReason)
+        
+        return ok
+    
     def closeEvent(self, evt):
         """
         Protected method handling the close event of the dialog.
@@ -105,11 +163,16 @@
             out = str(self.__process.readAllStandardOutput(), "utf-8")
             self.outputEdit.insertPlainText(out)
     
-    @pyqtSlot()
-    def __processFinished(self):
+    def __processFinished(self, exitCode, exitStatus):
         """
-        Private slot handling the finishing of the server process.
+        Private slot connected to the finished signal.
+        
+        @param exitCode exit code of the process
+        @type int
+        @param exitStatus exit status of the process
+        @type QProcess.ExitStatus
         """
+        normal = (exitStatus == QProcess.NormalExit) and (exitCode == 0)
         self.__cancelProcess()
         
         self.buttonBox.button(QDialogButtonBox.Cancel).setEnabled(False)
@@ -117,6 +180,11 @@
         self.buttonBox.button(QDialogButtonBox.Close).setDefault(True)
         self.buttonBox.button(QDialogButtonBox.Close).setFocus(
             Qt.OtherFocusReason)
+        
+        if normal and self.successMessage:
+            self.outputEdit.insertPlainText(self.successMessage)
+        elif not normal and self.errorMessage:
+            self.outputEdit.insertPlainText(self.errorMessage)
     
     @pyqtSlot()
     def __cancelProcess(self):

eric ide

mercurial