PipxInterface/PipxWidget.py

Wed, 26 Jun 2024 11:57:04 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Wed, 26 Jun 2024 11:57:04 +0200
changeset 8
02b45cd11e64
parent 7
9a98f7260372
child 9
2ab7d3ac8283
permissions
-rw-r--r--

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()

eric ide

mercurial