--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PipxInterface/PipxInterpretersDialog.py Fri Jun 28 16:25:21 2024 +0200 @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing a dialog to show the available standalone Python interpreters. +""" + +from PyQt6.QtCore import pyqtSlot +from PyQt6.QtWidgets import QDialog, QTreeWidgetItem + +from eric7.EricGui import EricPixmapCache + +from .Ui_PipxInterpretersDialog import Ui_PipxInterpretersDialog + + +class PipxInterpretersDialog(QDialog, Ui_PipxInterpretersDialog): + """ + Class implementing a dialog to show the available standalone Python interpreters. + """ + + def __init__(self, pipx, parent=None): + """ + Constructor + + @param pipx reference to the pipx interface + @type Pipx + @param parent reference to the parent widget (defaults to None) + @type QWidget (optional) + """ + super().__init__(parent) + self.setupUi(self) + + self.refreshButton.setIcon(EricPixmapCache.getIcon("reload")) + self.upgradeButton.setIcon(EricPixmapCache.getIcon("upgrade")) + self.pruneButton.setIcon(EricPixmapCache.getIcon("clear")) + + self.__pipx = pipx + + self.refreshButton.clicked.connect(self.__populateInterpretersList) + + self.__populateInterpretersList() + + @pyqtSlot() + def __populateInterpretersList(self): + """ + Private slot to populate the list of standalone Python interpreters. + """ + self.interpretersList.clear() + + interpreters = self.__pipx.getPipxInterpretersList()["interpreters"] + for interpreter in interpreters: + pyItem = QTreeWidgetItem( + self.interpretersList, + [ + self.tr("Python {0}{1}").format( + interpreter, + "" + if interpreters[interpreter]["used"] + else self.tr(" (unused)"), + ) + ] + ) + for package, packageVersion in interpreters[interpreter]["used_by"]: + QTreeWidgetItem( + pyItem, + [ + self.tr("{0} {1}", "package, version") + .format(package, packageVersion) + ] + ) + pyItem.setExpanded(True) + + @pyqtSlot() + def on_upgradeButton_clicked(self): + """ + Private slot to upgrade all pipx managed interpreters to the latest available + micro/patch version. + """ + self.__pipx.upgradeInterpreters(dialogParent=self) + self.__populateInterpretersList() + + @pyqtSlot() + def on_pruneButton_clicked(self): + """ + Private slot to prune unused interpreters. + """ + self.__pipx.pruneInterpreters(dialogParent=self) + self.__populateInterpretersList()