10 import os |
10 import os |
11 |
11 |
12 from PyQt6.QtCore import Qt, pyqtSlot |
12 from PyQt6.QtCore import Qt, pyqtSlot |
13 from PyQt6.QtWidgets import QDialog, QDialogButtonBox |
13 from PyQt6.QtWidgets import QDialog, QDialogButtonBox |
14 |
14 |
|
15 from eric7.EricWidgets.EricApplication import ericApp |
15 from eric7.EricWidgets.EricPathPicker import EricPathPickerModes |
16 from eric7.EricWidgets.EricPathPicker import EricPathPickerModes |
16 from eric7.SystemUtilities import OSUtilities, PythonUtilities |
17 from eric7.SystemUtilities import FileSystemUtilities, OSUtilities, PythonUtilities |
17 |
18 |
18 from .Ui_VirtualenvAddEditDialog import Ui_VirtualenvAddEditDialog |
19 from .Ui_VirtualenvAddEditDialog import Ui_VirtualenvAddEditDialog |
19 from .VirtualenvMeta import VirtualenvMetaData |
20 from .VirtualenvMeta import VirtualenvMetaData |
20 |
21 |
21 |
22 |
48 self.setupUi(self) |
49 self.setupUi(self) |
49 |
50 |
50 self.__venvName = "" if metadata is None else metadata.name |
51 self.__venvName = "" if metadata is None else metadata.name |
51 self.__manager = manager |
52 self.__manager = manager |
52 self.__editMode = bool(self.__venvName) |
53 self.__editMode = bool(self.__venvName) |
|
54 self.__serverInterface = ericApp().getObject("EricServer") |
|
55 self.__fsInterface = self.__serverInterface.getServiceInterface("FileSystem") |
53 |
56 |
54 if self.__editMode: |
57 if self.__editMode: |
55 self.setWindowTitle(self.tr("Edit Virtual Environment")) |
58 self.setWindowTitle(self.tr("Edit Virtual Environment")) |
56 else: |
59 else: |
57 self.setWindowTitle(self.tr("Add Virtual Environment")) |
60 self.setWindowTitle(self.tr("Add Virtual Environment")) |
58 |
61 |
59 self.__envBaseDir = baseDir |
62 self.__envBaseDir = baseDir |
60 if not self.__envBaseDir: |
63 if not self.__envBaseDir: |
61 self.__envBaseDir = OSUtilities.getHomeDir() |
64 self.__envBaseDir = OSUtilities.getHomeDir() |
62 |
65 |
|
66 self.serverRadioButton.setEnabled(self.__serverInterface.isServerConnected()) |
|
67 |
63 self.targetDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) |
68 self.targetDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) |
64 self.targetDirectoryPicker.setWindowTitle( |
69 self.targetDirectoryPicker.setWindowTitle( |
65 self.tr("Virtualenv Target Directory") |
70 self.tr("Virtualenv Target Directory") |
66 ) |
71 ) |
67 self.targetDirectoryPicker.setDefaultDirectory(self.__envBaseDir) |
72 if self.__serverInterface.isServerConnected(): |
|
73 self.targetDirectoryPicker.setRemote( |
|
74 metadata.is_eric_server if metadata else False |
|
75 ) |
|
76 if metadata is None or (not metadata.is_eric_server and not metadata.is_remote): |
|
77 self.targetDirectoryPicker.setDefaultDirectory(self.__envBaseDir) |
68 |
78 |
69 self.pythonExecPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE) |
79 self.pythonExecPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE) |
70 self.pythonExecPicker.setWindowTitle(self.tr("Python Interpreter")) |
80 self.pythonExecPicker.setWindowTitle(self.tr("Python Interpreter")) |
71 self.pythonExecPicker.setDefaultDirectory(PythonUtilities.getPythonExecutable()) |
81 if self.__serverInterface.isServerConnected(): |
|
82 self.pythonExecPicker.setRemote( |
|
83 metadata.is_eric_server if metadata else False |
|
84 ) |
|
85 if metadata is None or (not metadata.is_eric_server and not metadata.is_remote): |
|
86 self.pythonExecPicker.setDefaultDirectory( |
|
87 PythonUtilities.getPythonExecutable() |
|
88 ) |
72 |
89 |
73 self.execPathEdit.setToolTip( |
90 self.execPathEdit.setToolTip( |
74 self.tr( |
91 self.tr( |
75 "Enter the executable search path to be prepended to the PATH" |
92 "Enter the executable search path to be prepended to the PATH" |
76 " environment variable. Use '{0}' as the separator." |
93 " environment variable. Use '{0}' as the separator." |
79 |
96 |
80 self.nameEdit.setText(self.__venvName) |
97 self.nameEdit.setText(self.__venvName) |
81 if metadata: |
98 if metadata: |
82 if metadata.path: |
99 if metadata.path: |
83 self.targetDirectoryPicker.setText( |
100 self.targetDirectoryPicker.setText( |
84 metadata.path, toNative=not metadata.is_remote |
101 metadata.path, |
|
102 toNative=not metadata.is_remote and not metadata.is_eric_server, |
85 ) |
103 ) |
86 else: |
104 else: |
87 self.targetDirectoryPicker.setText( |
105 self.targetDirectoryPicker.setText( |
88 self.__envBaseDir, toNative=not metadata.is_remote |
106 self.__envBaseDir, |
89 ) |
107 toNative=not metadata.is_remote and not metadata.is_eric_server, |
90 if not metadata.interpreter and metadata.path and not metadata.is_remote: |
108 ) |
|
109 if ( |
|
110 not metadata.interpreter |
|
111 and metadata.path |
|
112 and not metadata.is_remote |
|
113 and not metadata.is_eric_server |
|
114 ): |
91 py = self.__detectPythonInterpreter(metadata.path) |
115 py = self.__detectPythonInterpreter(metadata.path) |
92 self.pythonExecPicker.setText(py) |
116 self.pythonExecPicker.setText(py) |
93 else: |
117 else: |
94 self.pythonExecPicker.setText( |
118 self.pythonExecPicker.setText( |
95 metadata.interpreter, toNative=not metadata.is_remote |
119 metadata.interpreter, |
|
120 toNative=not metadata.is_remote and not metadata.is_eric_server, |
96 ) |
121 ) |
97 else: |
122 else: |
98 self.targetDirectoryPicker.setText(self.__envBaseDir, toNative=True) |
123 self.targetDirectoryPicker.setText(self.__envBaseDir, toNative=True) |
99 |
124 |
100 self.globalCheckBox.setChecked(metadata.is_global if metadata else False) |
125 self.globalCheckBox.setChecked(metadata.is_global if metadata else False) |
101 self.anacondaCheckBox.setChecked(metadata.is_conda if metadata else False) |
126 self.standardRadioButton.setChecked(True) |
102 self.remoteCheckBox.setChecked(metadata.is_remote if metadata else False) |
127 self.anacondaRadioButton.setChecked(metadata.is_conda if metadata else False) |
|
128 self.remoteRadioButton.setChecked(metadata.is_remote if metadata else False) |
|
129 self.serverRadioButton.setChecked( |
|
130 metadata.is_eric_server if metadata else False |
|
131 ) |
103 self.execPathEdit.setText(metadata.exec_path if metadata else "") |
132 self.execPathEdit.setText(metadata.exec_path if metadata else "") |
104 self.descriptionEdit.setPlainText(metadata.description if metadata else "") |
133 self.descriptionEdit.setPlainText(metadata.description if metadata else "") |
|
134 self.serverLineEdit.setText(metadata.eric_server if metadata else "") |
105 |
135 |
106 self.__updateOk() |
136 self.__updateOk() |
107 |
137 |
108 self.nameEdit.setFocus(Qt.FocusReason.OtherFocusReason) |
138 self.nameEdit.setFocus(Qt.FocusReason.OtherFocusReason) |
109 |
139 |
125 and self.__manager.isUnique(self.nameEdit.text()) |
155 and self.__manager.isUnique(self.nameEdit.text()) |
126 ) |
156 ) |
127 ) |
157 ) |
128 |
158 |
129 if not self.globalCheckBox.isChecked(): |
159 if not self.globalCheckBox.isChecked(): |
130 enable &= self.remoteCheckBox.isChecked() or ( |
160 enable &= self.remoteRadioButton.isChecked() or ( |
131 bool(self.targetDirectoryPicker.text()) |
161 bool(self.targetDirectoryPicker.text()) |
132 and self.targetDirectoryPicker.text() != self.__envBaseDir |
162 and self.targetDirectoryPicker.text() != self.__envBaseDir |
133 and os.path.exists(self.targetDirectoryPicker.text()) |
163 and ( |
134 ) |
164 ( |
135 |
165 self.serverRadioButton.isChecked() |
136 enable = ( |
166 and self.__fsInterface.exists(self.targetDirectoryPicker.text()) |
137 enable |
167 ) |
138 and bool(self.pythonExecPicker.text()) |
168 or ( |
|
169 not self.serverRadioButton.isChecked() |
|
170 and os.path.exists(self.targetDirectoryPicker.text()) |
|
171 ) |
|
172 ) |
|
173 ) |
|
174 |
|
175 enable &= self.remoteRadioButton.isChecked() or ( |
|
176 bool(self.pythonExecPicker.text()) |
139 and ( |
177 and ( |
140 self.remoteCheckBox.isChecked() |
178 ( |
141 or os.access(self.pythonExecPicker.text(), os.X_OK) |
179 self.serverRadioButton.isChecked() |
|
180 and self.__fsInterface.access( |
|
181 self.pythonExecPicker.text(), "execute" |
|
182 ) |
|
183 ) |
|
184 or ( |
|
185 not self.serverRadioButton.isChecked() |
|
186 and os.access(self.pythonExecPicker.text(), os.X_OK) |
|
187 ) |
142 ) |
188 ) |
143 ) |
189 ) |
144 |
190 |
145 self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable) |
191 self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled(enable) |
146 |
192 |
218 @type bool |
264 @type bool |
219 """ |
265 """ |
220 self.__updateOk() |
266 self.__updateOk() |
221 |
267 |
222 @pyqtSlot(bool) |
268 @pyqtSlot(bool) |
223 def on_remoteCheckBox_toggled(self, checked): |
269 def on_remoteRadioButton_toggled(self, checked): |
224 """ |
270 """ |
225 Private slot handling a change of the remote check box state. |
271 Private slot handling a change of the remote radio button state. |
226 |
272 |
227 @param checked state of the check box |
273 @param checked state of the radio button |
228 @type bool |
274 @type bool |
229 """ |
275 """ |
230 self.__updateOk() |
276 self.__updateOk() |
231 |
277 |
232 @pyqtSlot(bool) |
278 @pyqtSlot(bool) |
233 def on_anacondaCheckBox_clicked(self, checked): |
279 def on_serverRadioButton_toggled(self, checked): |
234 """ |
280 """ |
235 Private slot handling a user click on this check box. |
281 Private slot handling a change of the eric IDE server radio button state. |
236 |
282 |
237 @param checked state of the check box |
283 @param checked state of the radio button |
|
284 @type bool |
|
285 """ |
|
286 if self.__serverInterface.isServerConnected(): |
|
287 self.targetDirectoryPicker.setRemote(checked) |
|
288 self.pythonExecPicker.setRemote(checked) |
|
289 self.serverLineEdit.setText( |
|
290 self.__serverInterface.getHost() if checked else "" |
|
291 ) |
|
292 |
|
293 self.__updateOk() |
|
294 |
|
295 @pyqtSlot(bool) |
|
296 def on_anacondaRadioButton_clicked(self, checked): |
|
297 """ |
|
298 Private slot handling a user click on this radio button. |
|
299 |
|
300 @param checked state of the radio button |
238 @type bool |
301 @type bool |
239 """ |
302 """ |
240 if checked and not bool(self.execPathEdit.text()): |
303 if checked and not bool(self.execPathEdit.text()): |
241 # prepopulate the execPathEdit widget |
304 # prepopulate the execPathEdit widget |
242 if OSUtilities.isWindowsPlatform(): |
305 if OSUtilities.isWindowsPlatform(): |
261 Public method to retrieve the entered metadata. |
324 Public method to retrieve the entered metadata. |
262 |
325 |
263 @return metadata for the virtual environment |
326 @return metadata for the virtual environment |
264 @rtype VirtualenvMetaData |
327 @rtype VirtualenvMetaData |
265 """ |
328 """ |
266 nativePaths = not self.remoteCheckBox.isChecked() |
329 nativePaths = ( |
|
330 not self.remoteRadioButton.isChecked() |
|
331 and not self.serverRadioButton.isChecked() |
|
332 ) |
|
333 is_eric_server = self.serverRadioButton.isChecked() |
|
334 envPath = ( |
|
335 FileSystemUtilities.remoteFileName(self.targetDirectoryPicker.text()) |
|
336 if is_eric_server |
|
337 else FileSystemUtilities.plainFileName( |
|
338 self.targetDirectoryPicker.text(toNative=nativePaths) |
|
339 ) |
|
340 ) |
|
341 interpreter = ( |
|
342 FileSystemUtilities.remoteFileName(self.pythonExecPicker.text()) |
|
343 if is_eric_server |
|
344 else FileSystemUtilities.plainFileName( |
|
345 self.pythonExecPicker.text(toNative=nativePaths) |
|
346 ) |
|
347 ) |
267 return VirtualenvMetaData( |
348 return VirtualenvMetaData( |
268 name=self.nameEdit.text(), |
349 name=self.nameEdit.text(), |
269 path=self.targetDirectoryPicker.text(toNative=nativePaths), |
350 path=envPath, |
270 interpreter=self.pythonExecPicker.text(toNative=nativePaths), |
351 interpreter=interpreter, |
271 is_global=self.globalCheckBox.isChecked(), |
352 is_global=self.globalCheckBox.isChecked(), |
272 is_conda=self.anacondaCheckBox.isChecked(), |
353 is_conda=self.anacondaRadioButton.isChecked(), |
273 is_remote=self.remoteCheckBox.isChecked(), |
354 is_remote=self.remoteRadioButton.isChecked(), |
274 exec_path=self.execPathEdit.text(), |
355 exec_path=self.execPathEdit.text(), |
275 description=self.descriptionEdit.toPlainText(), |
356 description=self.descriptionEdit.toPlainText(), |
276 ) |
357 is_eric_server=is_eric_server, |
|
358 eric_server=self.serverLineEdit.text(), |
|
359 ) |