Sun, 29 Dec 2024 14:56:04 +0100
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()) ]