PipxInterface/PipxWidget.py

changeset 61
163461aefed6
parent 59
a5e7feb2310c
child 67
e73ea3ec62cc
--- a/PipxInterface/PipxWidget.py	Sat Aug 24 15:36:20 2024 +0200
+++ b/PipxInterface/PipxWidget.py	Wed Aug 28 15:26:50 2024 +0200
@@ -211,11 +211,27 @@
         """
         Private slot to set the action enabled status.
         """
-        selectedPackages = self.__selectedPackages()
+        selectedPackageItems = self.__selectedPackageItems()
 
-        self.__reinstallPackagesAct.setEnabled(len(selectedPackages) == 1)
-        self.__upgradePackagesAct.setEnabled(bool(selectedPackages))
-        self.__uninstallPackagesAct.setEnabled(len(selectedPackages) == 1)
+        self.__reinstallPackagesAct.setEnabled(len(selectedPackageItems) == 1)
+        self.__upgradePackagesAct.setEnabled(
+            len(selectedPackageItems) == 1
+            and bool(selectedPackageItems[0].data(0, PipxWidget.LatestVersionRole))
+        )
+        self.__uninstallPackagesAct.setEnabled(len(selectedPackageItems) == 1)
+        self.__dependenciseSubmenuAct.setEnabled(len(selectedPackageItems) == 1)
+        self.__showOutdatedDependenciesAct.setEnabled(
+            len(selectedPackageItems) == 1
+            and bool(
+                selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole)
+            )
+        )
+        self.__upgradeDependenciesAct.setEnabled(
+            len(selectedPackageItems) == 1
+            and bool(
+                selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole)
+            )
+        )
 
     @pyqtSlot()
     def __installPackages(self):
@@ -355,35 +371,47 @@
                 )
             self.on_refreshButton_clicked()
 
+    def __checkPackageOutdated(self, itm):
+        """
+        Private method to check, if a package item is outdated or has outdated
+        dependencies.
+
+        @param itm reference to the package item
+        @type QTreeWidgetItem
+        @return flag indicating the outdated status
+        @rtype bool
+        """
+        package = itm.text(PipxWidget.PackageColumn)
+        latestVersion, outdatedDependencies = self.__pipx.checkPackageOutdated(package)
+        if latestVersion is not None:
+            self.__markPackageOutdated(itm, latestVersion, outdatedDependencies)
+            isOutdated = True
+        elif (
+            self.__plugin.getPreferences("IncludeOutdatedDependencies")
+            and outdatedDependencies
+        ):
+            self.__markPackageDependenciesOutdated(itm)
+            isOutdated = True
+        else:
+            self.__markPackageClean(itm)
+            isOutdated = False
+        return isOutdated
+
     @pyqtSlot()
     def __checkOutdatedPackages(self):
         """
         Private slot to check, if there are any outdated packages.
         """
-        hasOutdated = False
+        outdatedItems = []
 
         with EricOverrideCursor():
             for row in range(self.packagesList.topLevelItemCount()):
                 itm = self.packagesList.topLevelItem(row)
-                package = itm.text(PipxWidget.PackageColumn)
-                latestVersion, outdatedDependencies = self.__pipx.checkPackageOutdated(
-                    package
-                )
-                if latestVersion is not None:
-                    self.__markPackageOutdated(itm, latestVersion, outdatedDependencies)
-                    hasOutdated = True
-                elif (
-                    self.__plugin.getPreferences("IncludeOutdatedDependencies")
-                    and outdatedDependencies
-                ):
-                    self.__markPackageDependenciesOutdated(itm)
-                    hasOutdated = True
-                else:
-                    self.__markPackageClean(itm)
-                    hasOutdated = False
+                if self.__checkPackageOutdated(itm):
+                    outdatedItems.append(itm)
 
         self.__resizePackagesColumns()
-        self.__plugin.setOutdatedIndicator(hasOutdated)
+        self.__plugin.setOutdatedIndicator(bool(outdatedItems))
 
     @pyqtSlot()
     def __upgradePackage(self):
@@ -405,7 +433,12 @@
         else:
             package = packageItem.text(PipxWidget.PackageColumn)
             self.__pipx.upgradePackage(package)
-            self.on_refreshButton_clicked()
+            packageItem = self.__getItemForPackage(package)
+            if packageItem:
+                self.__checkPackageOutdated(packageItem)
+
+            self.__resizePackagesColumns()
+            self.__plugin.setOutdatedIndicator(self.__hasOutdatedItems())
 
     @pyqtSlot()
     def __upgradeAllPackages(self):
@@ -433,7 +466,6 @@
         Private slot to upgrade the shared libraries.
         """
         self.__pipx.upgradeSharedLibraries()
-        self.on_refreshButton_clicked()
 
     @pyqtSlot()
     def __uninstallPackage(self):
@@ -545,7 +577,12 @@
         """
         package = self.__selectedPackages()[0]
         self.__pipx.upgradePackageDependencies(package=package)
-        self.on_refreshButton_clicked()
+        packageItem = self.__getItemForPackage(package)
+        if packageItem:
+            self.__checkPackageOutdated(packageItem)
+
+        self.__resizePackagesColumns()
+        self.__plugin.setOutdatedIndicator(self.__hasOutdatedItems())
 
     #######################################################################
     ## Main widget related methods below
@@ -690,6 +727,7 @@
                     self.__markPackageDependenciesOutdated(itm)
 
         self.__resizePackagesColumns()
+        self.__plugin.setOutdatedIndicator(bool(outdatedPackages))
 
     @pyqtSlot(QTreeWidgetItem, int)
     def on_packagesList_itemActivated(self, item, column):
@@ -711,25 +749,13 @@
         """
         Private slot to handle a change of selected packages and apps.
         """
-        selectedPackages = self.__selectedPackages()
         selectedPackageItems = self.__selectedPackageItems()
 
-        self.upgradeButton.setEnabled(bool(selectedPackages))
-        self.uninstallButton.setEnabled(len(selectedPackages) == 1)
-
-        self.__dependenciseSubmenuAct.setEnabled(len(selectedPackages) == 1)
-        self.__showOutdatedDependenciesAct.setEnabled(
-            len(selectedPackages) == 1
-            and bool(
-                selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole)
-            )
+        self.upgradeButton.setEnabled(
+            len(selectedPackageItems) == 1
+            and bool(selectedPackageItems[0].data(0, PipxWidget.LatestVersionRole))
         )
-        self.__upgradeDependenciesAct.setEnabled(
-            len(selectedPackages) == 1
-            and bool(
-                selectedPackageItems[0].data(0, PipxWidget.OutdatedDependenciesRole)
-            )
-        )
+        self.uninstallButton.setEnabled(len(selectedPackageItems) == 1)
 
     def __selectedPackages(self):
         """
@@ -814,3 +840,36 @@
             allApps.extend(self.__packageApps(topItm))
 
         return self.__getRunningApps(allApps)
+
+    def __getItemForPackage(self, package):
+        """
+        Private method to get a reference to the item of a given package.
+
+        @param package package name
+        @type str
+        @return reference to the associated item
+        @rtype QTreeWidgetItem
+        """
+        for row in range(self.packagesList.topLevelItemCount()):
+            itm = self.packagesList.topLevelItem(row)
+            if itm.text(PipxWidget.PackageColumn) == package:
+                return itm
+
+        return None
+
+    def __hasOutdatedItems(self):
+        """
+        Private method to check, if the list of packages contains any entries
+        which is outdated or has outdated dependencies.
+
+        @return flag indicating outdated items
+        @rtype bool
+        """
+        for row in range(self.packagesList.topLevelItemCount()):
+            itm = self.packagesList.topLevelItem(row)
+            if itm.data(0, PipxWidget.LatestVersionRole) or itm.data(
+                0, PipxWidget.OutdatedDependenciesRole
+            ):
+                return True
+
+        return False

eric ide

mercurial