diff --git a/src/Mod/AddonManager/package_list.py b/src/Mod/AddonManager/package_list.py index ffb6e15180..383cd54eb1 100644 --- a/src/Mod/AddonManager/package_list.py +++ b/src/Mod/AddonManager/package_list.py @@ -42,6 +42,12 @@ class ListDisplayStyle(IntEnum): COMPACT = 0 EXPANDED = 1 +class StatusFilter(IntEnum): + ANY = 0 + INSTALLED = 1 + NOT_INSTALLED = 2 + UPDATE_AVAILABLE = 3 + class PackageList(QWidget): """A widget that shows a list of packages and various widgets to control the display of the list""" @@ -60,6 +66,7 @@ class PackageList(QWidget): self.ui.listPackages.clicked.connect(self.on_listPackages_clicked) self.ui.comboPackageType.currentIndexChanged.connect(self.update_type_filter) + self.ui.comboStatus.currentIndexChanged.connect(self.update_status_filter) self.ui.lineEditFilter.textChanged.connect(self.update_text_filter) self.ui.buttonCompactLayout.clicked.connect( lambda: self.set_view_style(ListDisplayStyle.COMPACT) @@ -75,6 +82,8 @@ class PackageList(QWidget): pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") package_type = pref.GetInt("PackageTypeSelection", 1) self.ui.comboPackageType.setCurrentIndex(package_type) + status = pref.GetInt("StatusSelection", 0) + self.ui.comboStatus.setCurrentIndex(status) def setModel(self, model): self.item_model = model @@ -105,6 +114,17 @@ class PackageList(QWidget): pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") pref.SetInt("PackageTypeSelection", type_filter) + def update_status_filter(self, status_filter: int) -> None: + """hide/show rows corresponding to the status filter + + status_filter is an integer: 0 for any, 1 for installed, 2 for not installed, and 3 for update available + + """ + + self.item_filter.setStatusFilter(status_filter) + pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons") + pref.SetInt("StatusSelection", status_filter) + def update_text_filter(self, text_filter: str) -> None: """filter name and description by the regex specified by text_filter""" @@ -429,6 +449,7 @@ class PackageListFilter(QSortFilterProxyModel): def __init__(self): super().__init__() self.package_type = 0 # Default to showing everything + self.status = 0 # Default to showing any self.setSortCaseSensitivity(Qt.CaseInsensitive) def setPackageFilter( @@ -437,6 +458,12 @@ class PackageListFilter(QSortFilterProxyModel): self.package_type = type self.invalidateFilter() + def setStatusFilter( + self, status: int + ) -> None: # 0=Any, 1=Installed, 2=Not installed, 3=Update available + self.status = status + self.invalidateFilter() + def lessThan(self, left, right) -> bool: l = self.sourceModel().data(left, PackageListItemModel.DataAccessRole) r = self.sourceModel().data(right, PackageListItemModel.DataAccessRole) @@ -456,6 +483,16 @@ class PackageListFilter(QSortFilterProxyModel): if not data.contains_preference_pack(): return False + if self.status == StatusFilter.INSTALLED: + if data.update_status == AddonManagerRepo.UpdateStatus.NOT_INSTALLED: + return False + elif self.status == StatusFilter.NOT_INSTALLED: + if data.update_status != AddonManagerRepo.UpdateStatus.NOT_INSTALLED: + return False + elif self.status == StatusFilter.UPDATE_AVAILABLE: + if data.update_status != AddonManagerRepo.UpdateStatus.UPDATE_AVAILABLE: + return False + name = data.display_name desc = data.description if hasattr(self, "filterRegularExpression"): # Added in Qt 5.12 @@ -527,6 +564,20 @@ class Ui_PackageList(object): self.horizontalLayout_6.addWidget(self.comboPackageType) + self.labelStatus = QLabel(Form) + self.labelStatus.setObjectName("labelStatus") + + self.horizontalLayout_6.addWidget(self.labelStatus) + + self.comboStatus = QComboBox(Form) + self.comboStatus.addItem("") + self.comboStatus.addItem("") + self.comboStatus.addItem("") + self.comboStatus.addItem("") + self.comboStatus.setObjectName("comboStatus") + + self.horizontalLayout_6.addWidget(self.comboStatus) + self.lineEditFilter = QLineEdit(Form) self.lineEditFilter.setObjectName("lineEditFilter") self.lineEditFilter.setClearButtonEnabled(True) @@ -576,7 +627,21 @@ class Ui_PackageList(object): self.comboPackageType.setItemText( 3, QCoreApplication.translate("AddonsInstaller", "Preference Packs", None) ) - + self.labelStatus.setText( + QCoreApplication.translate("AddonsInstaller", "Status:", None) + ) + self.comboStatus.setItemText( + StatusFilter.ANY, QCoreApplication.translate("AddonsInstaller", "Any", None) + ) + self.comboStatus.setItemText( + StatusFilter.INSTALLED, QCoreApplication.translate("AddonsInstaller", "Installed", None) + ) + self.comboStatus.setItemText( + StatusFilter.NOT_INSTALLED, QCoreApplication.translate("AddonsInstaller", "Not installed", None) + ) + self.comboStatus.setItemText( + StatusFilter.UPDATE_AVAILABLE, QCoreApplication.translate("AddonsInstaller", "Update available", None) + ) self.lineEditFilter.setPlaceholderText( QCoreApplication.translate("AddonsInstaller", "Filter", None) )