Wed, 26 Jun 2024 11:57:04 +0200
Added the display of the path standalone Python interpreters are installed to.
# -*- coding: utf-8 -*- # Copyright (c) 2024 Detlev Offenbach <detlev@die-offenbachs.de> # """ Module implementing the pipx management widget. """ from PyQt6.QtCore import Qt, pyqtSlot from PyQt6.QtWidgets import QTreeWidgetItem, QWidget from eric7.EricGui import EricPixmapCache from .Pipx import Pipx from .PipxAppStartDialog import PipxAppStartDialog from .Ui_PipxWidget import Ui_PipxWidget class PipxWidget(QWidget, Ui_PipxWidget): """ Class documentation goes here. """ PackageColumn = 0 VersionColumn = 1 PythonVersionColumn = 2 AppPathRole = Qt.ItemDataRole.UserRole def __init__(self, plugin, fromEric=True, parent=None): """ Constructor @param plugin reference to the plug-in object @type MqttMonitorPlugin @param fromEric flag indicating the eric-ide mode (defaults to True) (True = eric-ide mode, False = application mode) @type bool (optional) @param parent reference to the parent widget (defaults to None) @type QWidget (optional) """ super().__init__(parent) self.setupUi(self) self.__plugin = plugin self.__pipx = Pipx(self) if fromEric: self.layout().setContentsMargins(0, 3, 0, 0) else: self.layout().setContentsMargins(0, 0, 0, 0) # TODO: set the various icons self.pipxMenuButton.setIcon(EricPixmapCache.getIcon("superMenu")) self.refreshButton.setIcon(EricPixmapCache.getIcon("reload")) self.packagesList.header().setSortIndicator( PipxWidget.PackageColumn, Qt.SortOrder.AscendingOrder ) self.__showPipxVersion() pipxPaths = self.__pipx.getPipxStrPaths() self.venvsPathEdit.setText(pipxPaths["venvsPath"]) self.applicationsPathEdit.setText(pipxPaths["appsPath"]) self.manPagesPathEdit.setText(pipxPaths["manPath"]) self.interpretersPathEdit.setText(pipxPaths["pythonPath"]) self.__populatePackages() def __showPipxVersion(self): """ Private method to show the pipx version in the widget header. """ self.pipxVersionLabel.setText( self.tr("<b>pipx Version {0}</b>").format(self.__pipx.getPipxVersion()) ) def __resizePackagesColumns(self): """ Private method to resize the columns of the packages list. """ self.packagesList.header().setStretchLastSection(True) self.packagesList.resizeColumnToContents(PipxWidget.PackageColumn) self.packagesList.resizeColumnToContents(PipxWidget.VersionColumn) self.packagesList.resizeColumnToContents(PipxWidget.PythonVersionColumn) def __populatePackages(self): """ Private method to populate the packages list. """ self.packagesList.clear() packages = self.__pipx.getInstalledPackages() for package in packages: topItem = QTreeWidgetItem( self.packagesList, [package["name"], package["version"], package["python"]], ) for app, appPath in package["apps"]: itm = QTreeWidgetItem(topItem, [app]) itm.setData(0, PipxWidget.AppPathRole, appPath) self.__resizePackagesColumns() @pyqtSlot() def on_refreshButton_clicked(self): """ Private slot to refresh the packages list. """ self.__showPipxVersion() expandedPackages = [] for row in range(self.packagesList.topLevelItemCount()): itm = self.packagesList.topLevelItem(row) if itm.isExpanded(): expandedPackages.append(itm.text(PipxWidget.PackageColumn)) self.__populatePackages() for row in range(self.packagesList.topLevelItemCount()): itm = self.packagesList.topLevelItem(row) if itm.text(PipxWidget.PackageColumn) in expandedPackages: itm.setExpanded(True) self.__resizePackagesColumns() @pyqtSlot(QTreeWidgetItem, int) def on_packagesList_itemActivated(self, item, column): """ Private slot to start the activated item, if it is not a top level one @param item reference to the activated item @type QTreeWidgetItem @param column column number of the activation @type int """ if item.parent() is not None: app = item.data(0, PipxWidget.AppPathRole) dlg = PipxAppStartDialog(app, self.__plugin, self) dlg.show()