Addon Manager: Add filter on installation status

This commit is contained in:
Chris Hennes
2021-12-29 23:32:20 -06:00
parent 80b95225f8
commit dc1c227ad4

View File

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