--- a/src/eric7/VirtualEnv/VirtualenvAddEditDialog.py Tue May 21 19:31:50 2024 +0200 +++ b/src/eric7/VirtualEnv/VirtualenvAddEditDialog.py Tue May 21 19:35:41 2024 +0200 @@ -12,8 +12,9 @@ from PyQt6.QtCore import Qt, pyqtSlot from PyQt6.QtWidgets import QDialog, QDialogButtonBox +from eric7.EricWidgets.EricApplication import ericApp from eric7.EricWidgets.EricPathPicker import EricPathPickerModes -from eric7.SystemUtilities import OSUtilities, PythonUtilities +from eric7.SystemUtilities import FileSystemUtilities, OSUtilities, PythonUtilities from .Ui_VirtualenvAddEditDialog import Ui_VirtualenvAddEditDialog from .VirtualenvMeta import VirtualenvMetaData @@ -50,6 +51,8 @@ self.__venvName = "" if metadata is None else metadata.name self.__manager = manager self.__editMode = bool(self.__venvName) + self.__serverInterface = ericApp().getObject("EricServer") + self.__fsInterface = self.__serverInterface.getServiceInterface("FileSystem") if self.__editMode: self.setWindowTitle(self.tr("Edit Virtual Environment")) @@ -60,15 +63,29 @@ if not self.__envBaseDir: self.__envBaseDir = OSUtilities.getHomeDir() + self.serverRadioButton.setEnabled(self.__serverInterface.isServerConnected()) + self.targetDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) self.targetDirectoryPicker.setWindowTitle( self.tr("Virtualenv Target Directory") ) - self.targetDirectoryPicker.setDefaultDirectory(self.__envBaseDir) + if self.__serverInterface.isServerConnected(): + self.targetDirectoryPicker.setRemote( + metadata.is_eric_server if metadata else False + ) + if metadata is None or (not metadata.is_eric_server and not metadata.is_remote): + self.targetDirectoryPicker.setDefaultDirectory(self.__envBaseDir) self.pythonExecPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE) self.pythonExecPicker.setWindowTitle(self.tr("Python Interpreter")) - self.pythonExecPicker.setDefaultDirectory(PythonUtilities.getPythonExecutable()) + if self.__serverInterface.isServerConnected(): + self.pythonExecPicker.setRemote( + metadata.is_eric_server if metadata else False + ) + if metadata is None or (not metadata.is_eric_server and not metadata.is_remote): + self.pythonExecPicker.setDefaultDirectory( + PythonUtilities.getPythonExecutable() + ) self.execPathEdit.setToolTip( self.tr( @@ -81,27 +98,40 @@ if metadata: if metadata.path: self.targetDirectoryPicker.setText( - metadata.path, toNative=not metadata.is_remote + metadata.path, + toNative=not metadata.is_remote and not metadata.is_eric_server, ) else: self.targetDirectoryPicker.setText( - self.__envBaseDir, toNative=not metadata.is_remote + self.__envBaseDir, + toNative=not metadata.is_remote and not metadata.is_eric_server, ) - if not metadata.interpreter and metadata.path and not metadata.is_remote: + if ( + not metadata.interpreter + and metadata.path + and not metadata.is_remote + and not metadata.is_eric_server + ): py = self.__detectPythonInterpreter(metadata.path) self.pythonExecPicker.setText(py) else: self.pythonExecPicker.setText( - metadata.interpreter, toNative=not metadata.is_remote + metadata.interpreter, + toNative=not metadata.is_remote and not metadata.is_eric_server, ) else: self.targetDirectoryPicker.setText(self.__envBaseDir, toNative=True) self.globalCheckBox.setChecked(metadata.is_global if metadata else False) - self.anacondaCheckBox.setChecked(metadata.is_conda if metadata else False) - self.remoteCheckBox.setChecked(metadata.is_remote if metadata else False) + self.standardRadioButton.setChecked(True) + self.anacondaRadioButton.setChecked(metadata.is_conda if metadata else False) + self.remoteRadioButton.setChecked(metadata.is_remote if metadata else False) + self.serverRadioButton.setChecked( + metadata.is_eric_server if metadata else False + ) self.execPathEdit.setText(metadata.exec_path if metadata else "") self.descriptionEdit.setPlainText(metadata.description if metadata else "") + self.serverLineEdit.setText(metadata.eric_server if metadata else "") self.__updateOk() @@ -127,18 +157,34 @@ ) if not self.globalCheckBox.isChecked(): - enable &= self.remoteCheckBox.isChecked() or ( + enable &= self.remoteRadioButton.isChecked() or ( bool(self.targetDirectoryPicker.text()) and self.targetDirectoryPicker.text() != self.__envBaseDir - and os.path.exists(self.targetDirectoryPicker.text()) + and ( + ( + self.serverRadioButton.isChecked() + and self.__fsInterface.exists(self.targetDirectoryPicker.text()) + ) + or ( + not self.serverRadioButton.isChecked() + and os.path.exists(self.targetDirectoryPicker.text()) + ) + ) ) - enable = ( - enable - and bool(self.pythonExecPicker.text()) + enable &= self.remoteRadioButton.isChecked() or ( + bool(self.pythonExecPicker.text()) and ( - self.remoteCheckBox.isChecked() - or os.access(self.pythonExecPicker.text(), os.X_OK) + ( + self.serverRadioButton.isChecked() + and self.__fsInterface.access( + self.pythonExecPicker.text(), "execute" + ) + ) + or ( + not self.serverRadioButton.isChecked() + and os.access(self.pythonExecPicker.text(), os.X_OK) + ) ) ) @@ -220,21 +266,38 @@ self.__updateOk() @pyqtSlot(bool) - def on_remoteCheckBox_toggled(self, checked): + def on_remoteRadioButton_toggled(self, checked): """ - Private slot handling a change of the remote check box state. + Private slot handling a change of the remote radio button state. - @param checked state of the check box + @param checked state of the radio button @type bool """ self.__updateOk() @pyqtSlot(bool) - def on_anacondaCheckBox_clicked(self, checked): + def on_serverRadioButton_toggled(self, checked): + """ + Private slot handling a change of the eric IDE server radio button state. + + @param checked state of the radio button + @type bool """ - Private slot handling a user click on this check box. + if self.__serverInterface.isServerConnected(): + self.targetDirectoryPicker.setRemote(checked) + self.pythonExecPicker.setRemote(checked) + self.serverLineEdit.setText( + self.__serverInterface.getHost() if checked else "" + ) - @param checked state of the check box + self.__updateOk() + + @pyqtSlot(bool) + def on_anacondaRadioButton_clicked(self, checked): + """ + Private slot handling a user click on this radio button. + + @param checked state of the radio button @type bool """ if checked and not bool(self.execPathEdit.text()): @@ -263,14 +326,34 @@ @return metadata for the virtual environment @rtype VirtualenvMetaData """ - nativePaths = not self.remoteCheckBox.isChecked() + nativePaths = ( + not self.remoteRadioButton.isChecked() + and not self.serverRadioButton.isChecked() + ) + is_eric_server = self.serverRadioButton.isChecked() + envPath = ( + FileSystemUtilities.remoteFileName(self.targetDirectoryPicker.text()) + if is_eric_server + else FileSystemUtilities.plainFileName( + self.targetDirectoryPicker.text(toNative=nativePaths) + ) + ) + interpreter = ( + FileSystemUtilities.remoteFileName(self.pythonExecPicker.text()) + if is_eric_server + else FileSystemUtilities.plainFileName( + self.pythonExecPicker.text(toNative=nativePaths) + ) + ) return VirtualenvMetaData( name=self.nameEdit.text(), - path=self.targetDirectoryPicker.text(toNative=nativePaths), - interpreter=self.pythonExecPicker.text(toNative=nativePaths), + path=envPath, + interpreter=interpreter, is_global=self.globalCheckBox.isChecked(), - is_conda=self.anacondaCheckBox.isChecked(), - is_remote=self.remoteCheckBox.isChecked(), + is_conda=self.anacondaRadioButton.isChecked(), + is_remote=self.remoteRadioButton.isChecked(), exec_path=self.execPathEdit.text(), description=self.descriptionEdit.toPlainText(), + is_eric_server=is_eric_server, + eric_server=self.serverLineEdit.text(), )