diff -r b2297669c065 -r 1f9bafeff96c src/eric7/VirtualEnv/VirtualenvManagerWidgets.py --- a/src/eric7/VirtualEnv/VirtualenvManagerWidgets.py Wed Nov 29 11:33:32 2023 +0100 +++ b/src/eric7/VirtualEnv/VirtualenvManagerWidgets.py Wed Nov 29 14:27:25 2023 +0100 @@ -8,6 +8,7 @@ environments. """ +import datetime import os from PyQt6.QtCore import Qt, pyqtSlot @@ -21,11 +22,14 @@ ) from eric7.EricGui import EricPixmapCache +from eric7.EricWidgets import EricMessageBox from eric7.EricWidgets.EricMainWindow import EricMainWindow from eric7.EricWidgets.EricPathPicker import EricPathPickerModes +from eric7.EricWidgets.EricListSelectionDialog import EricListSelectionDialog from eric7.SystemUtilities import OSUtilities from .Ui_VirtualenvManagerWidget import Ui_VirtualenvManagerWidget +from .VirtualenvMeta import VirtualenvMetaData class VirtualenvManagerWidget(QWidget, Ui_VirtualenvManagerWidget): @@ -55,6 +59,7 @@ self.refreshButton.setIcon(EricPixmapCache.getIcon("reload")) self.addButton.setIcon(EricPixmapCache.getIcon("plus")) self.newButton.setIcon(EricPixmapCache.getIcon("new")) + self.searchNewButton.setIcon(EricPixmapCache.getIcon("question")) self.editButton.setIcon(EricPixmapCache.getIcon("edit")) self.upgradeButton.setIcon(EricPixmapCache.getIcon("upgrade")) self.removeButton.setIcon(EricPixmapCache.getIcon("minus")) @@ -161,6 +166,73 @@ self.__manager.createVirtualEnv(baseDir=self.envBaseDirectoryPicker.text()) @pyqtSlot() + def on_searchNewButton_clicked(self): + """ + Public slot to search for new (not yet registered) Python interpreters. + """ + potentialInterpreters = self.__manager.searchUnregisteredInterpreters() + + if not bool(potentialInterpreters): + EricMessageBox.information( + self, + self.tr("Search Virtual Environments"), + self.tr("""No unregistered virtual environments were found."""), + ) + return + + baseDir = self.__manager.getVirtualEnvironmentsBaseDir() + if not baseDir: + baseDir = OSUtilities.getHomeDir() + + selectionList = [] + for interpreter in potentialInterpreters: + if not interpreter.startswith(baseDir): + realpath = os.path.realpath(interpreter) + if realpath != interpreter: + # interpreter is a link + selectionList.append( + ( + self.tr("{0}\n(=> {1})").format(interpreter, realpath), + interpreter, + ) + ) + continue + + selectionList.append((interpreter, interpreter)) + + dlg = EricListSelectionDialog( + sorted(selectionList), + title=self.tr("Search Virtual Environments"), + message=self.tr( + "Select the interpreters to create environment entries for:" + ), + checkBoxSelection=True, + emptySelectionOk=True, + showSelectAll=True, + ) + if dlg.exec() == QDialog.DialogCode.Accepted: + selectedInterpreters = [env[1] for env in dlg.getSelection()] + + nameTemplate = ( + "Environment #{0} added " + + datetime.datetime.now().strftime("%Y-%m-%d %H:%M") + ) + for interpreter in selectedInterpreters: + metadata = VirtualenvMetaData( + name=nameTemplate.format( + selectedInterpreters.index(interpreter) + 1 + ), + path=( + os.path.abspath(os.path.join(interpreter, "..", "..")) + if interpreter.startswith(baseDir) + else "" + ), + interpreter=interpreter, + is_global=not interpreter.startswith(baseDir), + ) + self.__manager.addVirtualEnv(metadata) + + @pyqtSlot() def on_editButton_clicked(self): """ Private slot to edit the selected entry.