PipxInterface/PipxDependenciesDialog.py

Sun, 29 Dec 2024 14:56:04 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 29 Dec 2024 14:56:04 +0100
changeset 121
8deb7d8d9b86
parent 106
dcc8d6b448fa
permissions
-rw-r--r--

Prepared a new release.

# -*- coding: utf-8 -*-
# Copyright (c) 2024 - 2025 Detlev Offenbach <detlev@die-offenbachs.de>
#

"""
Module implementing a dialog to show the package dependencies.
"""

from PyQt6.QtCore import Qt, pyqtSlot
from PyQt6.QtWidgets import (
    QAbstractButton,
    QAbstractItemView,
    QDialog,
    QDialogButtonBox,
    QTreeWidgetItem,
)

from .Ui_PipxDependenciesDialog import Ui_PipxDependenciesDialog


class PipxDependenciesDialog(QDialog, Ui_PipxDependenciesDialog):
    """
    Class implementing a dialog to show the package dependencies.
    """

    AllMode = 0
    UptodateMode = 1
    OutdatedMode = 2

    DependencyColumn = 0
    InstalledVersionColumn = 1
    AvailableVersionColumn = 2

    UpgradeAllDependenciesAction = 10
    # sent by done() when all dependencies shall be upgraded
    UpgradeSelectedDependenciesAction = 11
    # sent by done() when selected dependencies shall be upgraded

    def __init__(self, package, dependencies, mode, parent=None):
        """
        Constructor

        @param package name of the package
        @type str
        @param dependencies list of package dependency data
        @type list of tuple of (str, str, str) or list of tuple of (str, str)
        @param mode dialog mode
        @type int
        @param parent reference to the parent widget (defaults to None)
        @type QWidget (optional)
        """
        super().__init__(parent)
        self.setupUi(self)

        self.__mode = mode

        self.__upgradeAllButton = None
        self.__upgradeSelectedButton = None

        if mode != PipxDependenciesDialog.OutdatedMode:
            self.dependenciesList.hideColumn(
                PipxDependenciesDialog.AvailableVersionColumn
            )

        if mode == PipxDependenciesDialog.OutdatedMode:
            headerMsg = self.tr("Outdated Dependencies of package <b>{0}</b>")
            self.__upgradeSelectedButton = self.buttonBox.addButton(
                self.tr("Upgrade Selected Dependencies"),
                QDialogButtonBox.ButtonRole.ActionRole,
            )
            self.__upgradeAllButton = self.buttonBox.addButton(
                self.tr("Upgrade All Dependencies"),
                QDialogButtonBox.ButtonRole.ActionRole,
            )
            self.dependenciesList.setSelectionMode(
                QAbstractItemView.SelectionMode.ExtendedSelection
            )
        elif mode == PipxDependenciesDialog.UptodateMode:
            headerMsg = self.tr("Up-to-date Dependencies of package <b>{0}</b>")
        else:
            headerMsg = self.tr("Dependencies of package <b>{0}</b>")
        self.headerLabel.setText(headerMsg.format(package))

        for dependency in dependencies:
            QTreeWidgetItem(self.dependenciesList, list(dependency))

        self.dependenciesList.sortItems(
            PipxDependenciesDialog.DependencyColumn, Qt.SortOrder.AscendingOrder
        )
        self.__resizeColumns()

        if mode == PipxDependenciesDialog.OutdatedMode:
            self.__upgradeAllButton.setEnabled(
                self.dependenciesList.topLevelItemCount()
            )
            self.__upgradeSelectedButton.setEnabled(False)

    def __resizeColumns(self):
        """
        Private method to resize the columns of the dependencies list.
        """
        self.dependenciesList.header().setStretchLastSection(True)
        self.dependenciesList.resizeColumnToContents(
            PipxDependenciesDialog.DependencyColumn
        )
        self.dependenciesList.resizeColumnToContents(
            PipxDependenciesDialog.InstalledVersionColumn
        )
        self.dependenciesList.resizeColumnToContents(
            PipxDependenciesDialog.AvailableVersionColumn
        )

    @pyqtSlot(QAbstractButton)
    def on_buttonBox_clicked(self, button):
        """
        Private slot handling a button click of the button box.

        @param button reference to the clicked button
        @type QAbstractButton
        """
        if button == self.__upgradeAllButton:
            self.done(PipxDependenciesDialog.UpgradeAllDependenciesAction)
        elif button == self.__upgradeSelectedButton:
            self.done(PipxDependenciesDialog.UpgradeSelectedDependenciesAction)

    @pyqtSlot()
    def on_dependenciesList_itemSelectionChanged(self):
        """
        Private slot to update the UI when the package selection changes.
        """
        if self.__mode == PipxDependenciesDialog.OutdatedMode:
            self.__upgradeSelectedButton.setEnabled(
                len(self.dependenciesList.selectedItems())
            )

    def getDependencies(self, selectedOnly=True):
        """
        Public method to get the list of selected or all dependencies.

        @param selectedOnly flag indicated to get only the selected dependencies
            (defaults to True)
        @type boolTYPE (optional)
        @return list of names of dependencies
        @rtype list of str
        """
        if selectedOnly:
            return [itm.text(0) for itm in self.dependenciesList.selectedItems()]
        else:
            return [
                self.dependenciesList.topLevelItem(index).text(0)
                for index in range(self.dependenciesList.topLevelItemCount())
            ]

eric ide

mercurial