PipxInterface/PipxDependenciesDialog.py

changeset 106
dcc8d6b448fa
parent 104
45c88e73e3dd
--- 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())
+            ]

eric ide

mercurial