PipxInterface/PipxWidget.py

changeset 2
26430067aa09
child 4
097a06104774
--- /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()

eric ide

mercurial