--- a/PipxInterface/PipxDependenciesDialog.py Tue Dec 10 17:43:42 2024 +0100 +++ b/PipxInterface/PipxDependenciesDialog.py Tue Dec 10 17:50:48 2024 +0100 @@ -7,7 +7,13 @@ """ from PyQt6.QtCore import Qt, pyqtSlot -from PyQt6.QtWidgets import QAbstractButton, QDialog, QDialogButtonBox, QTreeWidgetItem +from PyQt6.QtWidgets import ( + QAbstractButton, + QAbstractItemView, + QDialog, + QDialogButtonBox, + QTreeWidgetItem, +) from .Ui_PipxDependenciesDialog import Ui_PipxDependenciesDialog @@ -25,7 +31,10 @@ InstalledVersionColumn = 1 AvailableVersionColumn = 2 - UpgradeDependenciesAction = 10 # sent by done() when dependencies shall be upgraded + 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): """ @@ -43,7 +52,10 @@ super().__init__(parent) self.setupUi(self) - self.__upgradeButton = None + self.__mode = mode + + self.__upgradeAllButton = None + self.__upgradeSelectedButton = None if mode != PipxDependenciesDialog.OutdatedMode: self.dependenciesList.hideColumn( @@ -52,8 +64,16 @@ if mode == PipxDependenciesDialog.OutdatedMode: headerMsg = self.tr("Outdated Dependencies of package <b>{0}</b>") - self.__upgradeButton = self.buttonBox.addButton( - self.tr("Upgrade Dependencies"), QDialogButtonBox.ButtonRole.ActionRole + 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>") @@ -69,6 +89,12 @@ ) 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. @@ -92,5 +118,35 @@ @param button reference to the clicked button @type QAbstractButton """ - if button == self.__upgradeButton: - self.done(PipxDependenciesDialog.UpgradeDependenciesAction) + 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()) + ]