Skip to content

Commit dc1c227

Browse files
committed
Addon Manager: Add filter on installation status
1 parent 80b9522 commit dc1c227

File tree

1 file changed

+66
-1
lines changed

1 file changed

+66
-1
lines changed

src/Mod/AddonManager/package_list.py

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ class ListDisplayStyle(IntEnum):
4242
COMPACT = 0
4343
EXPANDED = 1
4444

45+
class StatusFilter(IntEnum):
46+
ANY = 0
47+
INSTALLED = 1
48+
NOT_INSTALLED = 2
49+
UPDATE_AVAILABLE = 3
50+
4551

4652
class PackageList(QWidget):
4753
"""A widget that shows a list of packages and various widgets to control the display of the list"""
@@ -60,6 +66,7 @@ def __init__(self, parent=None):
6066

6167
self.ui.listPackages.clicked.connect(self.on_listPackages_clicked)
6268
self.ui.comboPackageType.currentIndexChanged.connect(self.update_type_filter)
69+
self.ui.comboStatus.currentIndexChanged.connect(self.update_status_filter)
6370
self.ui.lineEditFilter.textChanged.connect(self.update_text_filter)
6471
self.ui.buttonCompactLayout.clicked.connect(
6572
lambda: self.set_view_style(ListDisplayStyle.COMPACT)
@@ -75,6 +82,8 @@ def __init__(self, parent=None):
7582
pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons")
7683
package_type = pref.GetInt("PackageTypeSelection", 1)
7784
self.ui.comboPackageType.setCurrentIndex(package_type)
85+
status = pref.GetInt("StatusSelection", 0)
86+
self.ui.comboStatus.setCurrentIndex(status)
7887

7988
def setModel(self, model):
8089
self.item_model = model
@@ -105,6 +114,17 @@ def update_type_filter(self, type_filter: int) -> None:
105114
pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons")
106115
pref.SetInt("PackageTypeSelection", type_filter)
107116

117+
def update_status_filter(self, status_filter: int) -> None:
118+
"""hide/show rows corresponding to the status filter
119+
120+
status_filter is an integer: 0 for any, 1 for installed, 2 for not installed, and 3 for update available
121+
122+
"""
123+
124+
self.item_filter.setStatusFilter(status_filter)
125+
pref = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Addons")
126+
pref.SetInt("StatusSelection", status_filter)
127+
108128
def update_text_filter(self, text_filter: str) -> None:
109129
"""filter name and description by the regex specified by text_filter"""
110130

@@ -429,6 +449,7 @@ class PackageListFilter(QSortFilterProxyModel):
429449
def __init__(self):
430450
super().__init__()
431451
self.package_type = 0 # Default to showing everything
452+
self.status = 0 # Default to showing any
432453
self.setSortCaseSensitivity(Qt.CaseInsensitive)
433454

434455
def setPackageFilter(
@@ -437,6 +458,12 @@ def setPackageFilter(
437458
self.package_type = type
438459
self.invalidateFilter()
439460

461+
def setStatusFilter(
462+
self, status: int
463+
) -> None: # 0=Any, 1=Installed, 2=Not installed, 3=Update available
464+
self.status = status
465+
self.invalidateFilter()
466+
440467
def lessThan(self, left, right) -> bool:
441468
l = self.sourceModel().data(left, PackageListItemModel.DataAccessRole)
442469
r = self.sourceModel().data(right, PackageListItemModel.DataAccessRole)
@@ -456,6 +483,16 @@ def filterAcceptsRow(self, row, parent=QModelIndex()):
456483
if not data.contains_preference_pack():
457484
return False
458485

486+
if self.status == StatusFilter.INSTALLED:
487+
if data.update_status == AddonManagerRepo.UpdateStatus.NOT_INSTALLED:
488+
return False
489+
elif self.status == StatusFilter.NOT_INSTALLED:
490+
if data.update_status != AddonManagerRepo.UpdateStatus.NOT_INSTALLED:
491+
return False
492+
elif self.status == StatusFilter.UPDATE_AVAILABLE:
493+
if data.update_status != AddonManagerRepo.UpdateStatus.UPDATE_AVAILABLE:
494+
return False
495+
459496
name = data.display_name
460497
desc = data.description
461498
if hasattr(self, "filterRegularExpression"): # Added in Qt 5.12
@@ -527,6 +564,20 @@ def setupUi(self, Form):
527564

528565
self.horizontalLayout_6.addWidget(self.comboPackageType)
529566

567+
self.labelStatus = QLabel(Form)
568+
self.labelStatus.setObjectName("labelStatus")
569+
570+
self.horizontalLayout_6.addWidget(self.labelStatus)
571+
572+
self.comboStatus = QComboBox(Form)
573+
self.comboStatus.addItem("")
574+
self.comboStatus.addItem("")
575+
self.comboStatus.addItem("")
576+
self.comboStatus.addItem("")
577+
self.comboStatus.setObjectName("comboStatus")
578+
579+
self.horizontalLayout_6.addWidget(self.comboStatus)
580+
530581
self.lineEditFilter = QLineEdit(Form)
531582
self.lineEditFilter.setObjectName("lineEditFilter")
532583
self.lineEditFilter.setClearButtonEnabled(True)
@@ -576,7 +627,21 @@ def retranslateUi(self, Form):
576627
self.comboPackageType.setItemText(
577628
3, QCoreApplication.translate("AddonsInstaller", "Preference Packs", None)
578629
)
579-
630+
self.labelStatus.setText(
631+
QCoreApplication.translate("AddonsInstaller", "Status:", None)
632+
)
633+
self.comboStatus.setItemText(
634+
StatusFilter.ANY, QCoreApplication.translate("AddonsInstaller", "Any", None)
635+
)
636+
self.comboStatus.setItemText(
637+
StatusFilter.INSTALLED, QCoreApplication.translate("AddonsInstaller", "Installed", None)
638+
)
639+
self.comboStatus.setItemText(
640+
StatusFilter.NOT_INSTALLED, QCoreApplication.translate("AddonsInstaller", "Not installed", None)
641+
)
642+
self.comboStatus.setItemText(
643+
StatusFilter.UPDATE_AVAILABLE, QCoreApplication.translate("AddonsInstaller", "Update available", None)
644+
)
580645
self.lineEditFilter.setPlaceholderText(
581646
QCoreApplication.translate("AddonsInstaller", "Filter", None)
582647
)

0 commit comments

Comments
 (0)