--- a/src/eric7/VirtualEnv/VirtualenvAddEditDialog.py Wed Apr 23 17:23:57 2025 +0200 +++ b/src/eric7/VirtualEnv/VirtualenvAddEditDialog.py Wed Apr 23 18:02:09 2025 +0200 @@ -65,15 +65,13 @@ else: self.setWindowTitle(self.tr("Add Virtual Environment")) + for name, visualName in self.__manager.getEnvironmentTypeNames(): + self.environmentTypeComboBox.addItem(visualName, name) + self.__envBaseDir = baseDir if not self.__envBaseDir: self.__envBaseDir = OSUtilities.getHomeDir() - self.serverRadioButton.setEnabled( - self.__serverInterface is not None - and self.__serverInterface.isServerConnected() - ) - self.targetDirectoryPicker.setMode(EricPathPickerModes.DIRECTORY_MODE) self.targetDirectoryPicker.setWindowTitle( self.tr("Virtualenv Target Directory") @@ -83,9 +81,12 @@ and self.__serverInterface.isServerConnected() ): self.targetDirectoryPicker.setRemote( - metadata.is_eric_server if metadata else False + metadata.environment_type == "eric_server" if metadata else False ) - if metadata is None or (not metadata.is_eric_server and not metadata.is_remote): + if metadata is None or metadata.environment_type not in ( + "eric_server", + "remote", + ): self.targetDirectoryPicker.setDefaultDirectory(self.__envBaseDir) self.pythonExecPicker.setMode(EricPathPickerModes.OPEN_FILE_MODE) @@ -95,9 +96,12 @@ and self.__serverInterface.isServerConnected() ): self.pythonExecPicker.setRemote( - metadata.is_eric_server if metadata else False + metadata.environment_type == "eric_server" if metadata else False ) - if metadata is None or (not metadata.is_eric_server and not metadata.is_remote): + if metadata is None or metadata.environment_type not in ( + "eric_server", + "remote", + ): self.pythonExecPicker.setDefaultDirectory( PythonUtilities.getPythonExecutable() ) @@ -114,36 +118,33 @@ if metadata.path: self.targetDirectoryPicker.setText( metadata.path, - toNative=not metadata.is_remote and not metadata.is_eric_server, + toNative=metadata.environment_type not in ("eric_server", "remote"), ) else: self.targetDirectoryPicker.setText( self.__envBaseDir, - toNative=not metadata.is_remote and not metadata.is_eric_server, + toNative=metadata.environment_type not in ("eric_server", "remote"), ) if ( not metadata.interpreter and metadata.path - and not metadata.is_remote - and not metadata.is_eric_server + and metadata.environment_type not in ("eric_server", "remote") ): py = self.__detectPythonInterpreter(metadata.path) self.pythonExecPicker.setText(py) else: self.pythonExecPicker.setText( metadata.interpreter, - toNative=not metadata.is_remote and not metadata.is_eric_server, + toNative=metadata.environment_type not in ("eric_server", "remote"), ) else: self.targetDirectoryPicker.setText(self.__envBaseDir, toNative=True) self.globalCheckBox.setChecked(metadata.is_global 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 + itemIndex = self.environmentTypeComboBox.findData( + metadata.environment_type if metadata else "standard" ) + self.environmentTypeComboBox.setCurrentIndex(itemIndex) 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 "") @@ -171,35 +172,36 @@ ) ) + selectedVenvType = self.environmentTypeComboBox.currentData() if not self.globalCheckBox.isChecked(): - enable &= self.remoteRadioButton.isChecked() or ( + enable &= selectedVenvType == "remote" or ( bool(self.targetDirectoryPicker.text()) and self.targetDirectoryPicker.text() != self.__envBaseDir and ( ( - self.serverRadioButton.isChecked() + selectedVenvType == "eric_server" and self.__fsInterface is not None and self.__fsInterface.exists(self.targetDirectoryPicker.text()) ) or ( - not self.serverRadioButton.isChecked() + selectedVenvType != "eric_server" and os.path.exists(self.targetDirectoryPicker.text()) ) ) ) - enable &= self.remoteRadioButton.isChecked() or ( + enable &= selectedVenvType == "remote" or ( bool(self.pythonExecPicker.text()) and ( ( - self.serverRadioButton.isChecked() + selectedVenvType == "eric_server" and self.__fsInterface is not None and self.__fsInterface.access( self.pythonExecPicker.text(), "execute" ) ) or ( - not self.serverRadioButton.isChecked() + selectedVenvType != "eric_server" and os.access(self.pythonExecPicker.text(), os.X_OK) ) ) @@ -282,65 +284,48 @@ """ self.__updateOk() - @pyqtSlot(bool) - def on_remoteRadioButton_toggled(self, checked): + @pyqtSlot(int) + def on_environmentTypeComboBox_currentIndexChanged(self, index): """ - Private slot handling a change of the remote radio button state. + Private slot handling the selection of a virtual environment type. - @param checked state of the radio button - @type bool + @param index index of the selected virtual environment type + @type int """ - self.__updateOk() - - @pyqtSlot(bool) - def on_serverRadioButton_toggled(self, checked): - """ - Private slot handling a change of the eric-ide server radio button state. + # step 1: reset some configurations + self.pythonExecPicker.setRemote(False) + self.targetDirectoryPicker.setRemote(False) + self.serverLineEdit.clear() + self.ericServerInfoLabel.clear() - @param checked state of the radio button - @type bool - """ - if ( - self.__serverInterface is not None - and self.__serverInterface.isServerConnected() + # step 2: configure and set value iaw. selected environment type + selectedVenvType = self.environmentTypeComboBox.itemData(index) + if selectedVenvType == "eric_server": + serverAvailable = ( + self.__serverInterface is not None + and self.__serverInterface.isServerConnected() + ) + self.ericServerInfoLabel.setText( + "" if serverAvailable else self.tr("eric-ide Server is not available") + ) + self.pythonExecPicker.setRemote(serverAvailable) + self.targetDirectoryPicker.setRemote(serverAvailable) + if serverAvailable: + self.targetDirectoryPicker.setText(self.__fsInterface.getcwd()) + self.serverLineEdit.setText(self.__serverInterface.getHost()) + + venvTypeData = self.__manager.getEnvironmentTypesRegistry().getEnvironmentType( + selectedVenvType + ) + if venvTypeData.defaultExecPathFunc is not None and not bool( + self.execPathEdit.text() ): - self.targetDirectoryPicker.setRemote(checked) - self.pythonExecPicker.setRemote(checked) - self.serverLineEdit.setText( - self.__serverInterface.getHost() if checked else "" + self.execPathEdit.setText( + venvTypeData.defaultExecPathFunc(self.targetDirectoryPicker.text()) ) - if checked: - self.targetDirectoryPicker.setText(self.__fsInterface.getcwd()) 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()): - # prepopulate the execPathEdit widget - if OSUtilities.isWindowsPlatform(): - self.execPathEdit.setText( - os.pathsep.join( - [ - self.targetDirectoryPicker.text(), - os.path.join(self.targetDirectoryPicker.text(), "Scripts"), - os.path.join( - self.targetDirectoryPicker.text(), "Library", "bin" - ), - ] - ) - ) - else: - self.execPathEdit.setText( - os.path.join(self.targetDirectoryPicker.text(), "bin"), - ) - def getMetaData(self): """ Public method to retrieve the entered metadata. @@ -348,34 +333,31 @@ @return metadata for the virtual environment @rtype VirtualenvMetaData """ - nativePaths = ( - not self.remoteRadioButton.isChecked() - and not self.serverRadioButton.isChecked() - ) - is_eric_server = self.serverRadioButton.isChecked() + selectedEnvironmentType = self.environmentTypeComboBox.currentData() + nativePaths = selectedEnvironmentType not in ("remote", "eric_server") + isEricServer = selectedEnvironmentType == "eric_server" envPath = ( FileSystemUtilities.remoteFileName(self.targetDirectoryPicker.text()) - if is_eric_server + if isEricServer else FileSystemUtilities.plainFileName( self.targetDirectoryPicker.text(toNative=nativePaths) ) ) interpreter = ( FileSystemUtilities.remoteFileName(self.pythonExecPicker.text()) - if is_eric_server + if isEricServer else FileSystemUtilities.plainFileName( self.pythonExecPicker.text(toNative=nativePaths) ) ) + return VirtualenvMetaData( name=self.nameEdit.text(), path=envPath, interpreter=interpreter, is_global=self.globalCheckBox.isChecked(), - is_conda=self.anacondaRadioButton.isChecked(), - is_remote=self.remoteRadioButton.isChecked(), + environment_type=selectedEnvironmentType, exec_path=self.execPathEdit.text(), description=self.descriptionEdit.toPlainText(), - is_eric_server=is_eric_server, eric_server=self.serverLineEdit.text(), )