7 Module implementing a dialog to run the Flask server. |
7 Module implementing a dialog to run the Flask server. |
8 """ |
8 """ |
9 |
9 |
10 import re |
10 import re |
11 |
11 |
12 from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QTimer |
12 from PyQt6.QtCore import pyqtSlot, Qt, QProcess, QTimer |
13 from PyQt5.QtGui import QTextCharFormat |
13 from PyQt6.QtGui import QTextCharFormat |
14 from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QMenu |
14 from PyQt6.QtWidgets import QDialog, QDialogButtonBox, QMenu |
15 |
15 |
16 from E5Gui import E5MessageBox |
16 from EricWidgets import EricMessageBox |
17 from E5Gui.E5Application import e5App |
17 from EricWidgets.EricApplication import ericApp |
18 |
18 |
19 from .Ui_RunServerDialog import Ui_RunServerDialog |
19 from .Ui_RunServerDialog import Ui_RunServerDialog |
20 |
20 |
21 from . import AnsiTools |
21 from . import AnsiTools |
22 from .ServerStartOptionsDialog import ServerStartOptionsDialog |
22 from .ServerStartOptionsDialog import ServerStartOptionsDialog |
55 |
55 |
56 self.__ansiRe = re.compile(r"(\x1b\[\d+m)") |
56 self.__ansiRe = re.compile(r"(\x1b\[\d+m)") |
57 |
57 |
58 self.__urlRe = re.compile(r" \* Running on ([^(]+) \(.*") |
58 self.__urlRe = re.compile(r" \* Running on ([^(]+) \(.*") |
59 |
59 |
60 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True) |
60 self.buttonBox.button( |
61 self.buttonBox.button(QDialogButtonBox.Close).setDefault(True) |
61 QDialogButtonBox.StandardButton.Close).setEnabled(True) |
|
62 self.buttonBox.button( |
|
63 QDialogButtonBox.StandardButton.Close).setDefault(True) |
62 |
64 |
63 self.__defaultTextFormat = self.outputEdit.currentCharFormat() |
65 self.__defaultTextFormat = self.outputEdit.currentCharFormat() |
64 |
66 |
65 self.__initActionsMenu() |
67 self.__initActionsMenu() |
66 |
68 |
73 self.__actionsMenu.setToolTipsVisible(True) |
75 self.__actionsMenu.setToolTipsVisible(True) |
74 self.__actionsMenu.aboutToShow.connect(self.__showActionsMenu) |
76 self.__actionsMenu.aboutToShow.connect(self.__showActionsMenu) |
75 |
77 |
76 # re-start server |
78 # re-start server |
77 self.__actionsMenu.addAction( |
79 self.__actionsMenu.addAction( |
78 self.tr("Re-start Server"), self.__restartServer) |
80 self.tr("Re-start Server"), |
|
81 self.__restartServer) |
79 self.__restartModeAct = self.__actionsMenu.addAction( |
82 self.__restartModeAct = self.__actionsMenu.addAction( |
80 self.tr("Re-start Server"), self.__restartServerDifferentMode) |
83 self.tr("Re-start Server"), |
|
84 self.__restartServerDifferentMode) |
81 self.__actionsMenu.addSeparator() |
85 self.__actionsMenu.addSeparator() |
|
86 # re-start server with options |
82 self.__actionsMenu.addAction( |
87 self.__actionsMenu.addAction( |
83 self.tr("Re-start Server with Options"), |
88 self.tr("Re-start Server with Options"), |
84 self.__restartServerWithOptions) |
89 self.__restartServerWithOptions) |
85 # start server with options |
|
86 |
90 |
87 self.menuButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton")) |
91 self.menuButton.setIcon(UI.PixmapCache.getIcon("actionsToolButton")) |
88 self.menuButton.setMenu(self.__actionsMenu) |
92 self.menuButton.setMenu(self.__actionsMenu) |
89 |
93 |
90 @pyqtSlot() |
94 @pyqtSlot() |
113 """ |
117 """ |
114 self.__serverOptions["development"] = development |
118 self.__serverOptions["development"] = development |
115 |
119 |
116 if askForOptions: |
120 if askForOptions: |
117 dlg = ServerStartOptionsDialog(self.__serverOptions) |
121 dlg = ServerStartOptionsDialog(self.__serverOptions) |
118 if dlg.exec() != QDialog.Accepted: |
122 if dlg.exec() != QDialog.DialogCode.Accepted: |
119 return False |
123 return False |
120 |
124 |
121 self.__serverOptions.update(dlg.getDataDict()) |
125 self.__serverOptions.update(dlg.getDataDict()) |
122 |
126 |
123 workdir, env = self.__project.prepareRuntimeEnvironment( |
127 workdir, env = self.__project.prepareRuntimeEnvironment( |
126 command = self.__project.getFlaskCommand() |
130 command = self.__project.getFlaskCommand() |
127 |
131 |
128 self.__process = QProcess() |
132 self.__process = QProcess() |
129 self.__process.setProcessEnvironment(env) |
133 self.__process.setProcessEnvironment(env) |
130 self.__process.setWorkingDirectory(workdir) |
134 self.__process.setWorkingDirectory(workdir) |
131 self.__process.setProcessChannelMode(QProcess.MergedChannels) |
135 self.__process.setProcessChannelMode( |
|
136 QProcess.ProcessChannelMode.MergedChannels) |
132 |
137 |
133 self.__process.readyReadStandardOutput.connect(self.__readStdOut) |
138 self.__process.readyReadStandardOutput.connect(self.__readStdOut) |
134 self.__process.finished.connect(self.__processFinished) |
139 self.__process.finished.connect(self.__processFinished) |
135 |
140 |
136 self.outputEdit.clear() |
141 self.outputEdit.clear() |
146 args += ["--key", self.__serverOptions["key"]] |
151 args += ["--key", self.__serverOptions["key"]] |
147 |
152 |
148 self.__process.start(command, args) |
153 self.__process.start(command, args) |
149 ok = self.__process.waitForStarted(10000) |
154 ok = self.__process.waitForStarted(10000) |
150 if not ok: |
155 if not ok: |
151 E5MessageBox.critical( |
156 EricMessageBox.critical( |
152 None, |
157 None, |
153 self.tr("Run Flask Server"), |
158 self.tr("Run Flask Server"), |
154 self.tr("""The Flask server process could not be""" |
159 self.tr("""The Flask server process could not be""" |
155 """ started.""")) |
160 """ started.""")) |
156 else: |
161 else: |
157 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(False) |
162 self.buttonBox.button( |
|
163 QDialogButtonBox.StandardButton.Close).setEnabled(False) |
158 self.stopServerButton.setEnabled(True) |
164 self.stopServerButton.setEnabled(True) |
159 self.stopServerButton.setDefault(True) |
165 self.stopServerButton.setDefault(True) |
160 self.startBrowserButton.setEnabled(True) |
166 self.startBrowserButton.setEnabled(True) |
161 else: |
167 else: |
162 ok = False |
168 ok = False |
208 """ |
214 """ |
209 Private slot handling the finishing of the server process. |
215 Private slot handling the finishing of the server process. |
210 """ |
216 """ |
211 if ( |
217 if ( |
212 self.__process is not None and |
218 self.__process is not None and |
213 self.__process.state() != QProcess.NotRunning |
219 self.__process.state() != QProcess.ProcessState.NotRunning |
214 ): |
220 ): |
215 self.__process.terminate() |
221 self.__process.terminate() |
216 QTimer.singleShot(2000, self.__process.kill) |
222 QTimer.singleShot(2000, self.__process.kill) |
217 self.__process.waitForFinished(3000) |
223 self.__process.waitForFinished(3000) |
218 |
224 |
219 self.__process = None |
225 self.__process = None |
220 |
226 |
221 self.startBrowserButton.setEnabled(False) |
227 self.startBrowserButton.setEnabled(False) |
222 self.stopServerButton.setEnabled(False) |
228 self.stopServerButton.setEnabled(False) |
223 self.buttonBox.button(QDialogButtonBox.Close).setEnabled(True) |
229 self.buttonBox.button( |
224 self.buttonBox.button(QDialogButtonBox.Close).setDefault(True) |
230 QDialogButtonBox.StandardButton.Close).setEnabled(True) |
225 self.buttonBox.button(QDialogButtonBox.Close).setFocus( |
231 self.buttonBox.button( |
226 Qt.OtherFocusReason) |
232 QDialogButtonBox.StandardButton.Close).setDefault(True) |
|
233 self.buttonBox.button(QDialogButtonBox.StandardButton.Close).setFocus( |
|
234 Qt.FocusReason.OtherFocusReason) |
227 |
235 |
228 @pyqtSlot() |
236 @pyqtSlot() |
229 def on_stopServerButton_clicked(self): |
237 def on_stopServerButton_clicked(self): |
230 """ |
238 """ |
231 Private slot to stop the running server. |
239 Private slot to stop the running server. |