--- 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