src/eric7/VirtualEnv/VirtualenvAddEditDialog.py

branch
eric7
changeset 11230
8a15b05eeee3
parent 11090
f5f5f5803935
diff -r 16a129d168f9 -r 8a15b05eeee3 src/eric7/VirtualEnv/VirtualenvAddEditDialog.py
--- 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(),
         )

eric ide

mercurial