--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PipxInterface/PipxWidget.py Mon Jun 24 17:13:07 2024 +0200 @@ -0,0 +1,122 @@ +# -*- 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 .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.__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.__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()