@@ -42,6 +42,12 @@ class ListDisplayStyle(IntEnum):
42
42
COMPACT = 0
43
43
EXPANDED = 1
44
44
45
+ class StatusFilter (IntEnum ):
46
+ ANY = 0
47
+ INSTALLED = 1
48
+ NOT_INSTALLED = 2
49
+ UPDATE_AVAILABLE = 3
50
+
45
51
46
52
class PackageList (QWidget ):
47
53
"""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):
60
66
61
67
self .ui .listPackages .clicked .connect (self .on_listPackages_clicked )
62
68
self .ui .comboPackageType .currentIndexChanged .connect (self .update_type_filter )
69
+ self .ui .comboStatus .currentIndexChanged .connect (self .update_status_filter )
63
70
self .ui .lineEditFilter .textChanged .connect (self .update_text_filter )
64
71
self .ui .buttonCompactLayout .clicked .connect (
65
72
lambda : self .set_view_style (ListDisplayStyle .COMPACT )
@@ -75,6 +82,8 @@ def __init__(self, parent=None):
75
82
pref = FreeCAD .ParamGet ("User parameter:BaseApp/Preferences/Addons" )
76
83
package_type = pref .GetInt ("PackageTypeSelection" , 1 )
77
84
self .ui .comboPackageType .setCurrentIndex (package_type )
85
+ status = pref .GetInt ("StatusSelection" , 0 )
86
+ self .ui .comboStatus .setCurrentIndex (status )
78
87
79
88
def setModel (self , model ):
80
89
self .item_model = model
@@ -105,6 +114,17 @@ def update_type_filter(self, type_filter: int) -> None:
105
114
pref = FreeCAD .ParamGet ("User parameter:BaseApp/Preferences/Addons" )
106
115
pref .SetInt ("PackageTypeSelection" , type_filter )
107
116
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
+
108
128
def update_text_filter (self , text_filter : str ) -> None :
109
129
"""filter name and description by the regex specified by text_filter"""
110
130
@@ -429,6 +449,7 @@ class PackageListFilter(QSortFilterProxyModel):
429
449
def __init__ (self ):
430
450
super ().__init__ ()
431
451
self .package_type = 0 # Default to showing everything
452
+ self .status = 0 # Default to showing any
432
453
self .setSortCaseSensitivity (Qt .CaseInsensitive )
433
454
434
455
def setPackageFilter (
@@ -437,6 +458,12 @@ def setPackageFilter(
437
458
self .package_type = type
438
459
self .invalidateFilter ()
439
460
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
+
440
467
def lessThan (self , left , right ) -> bool :
441
468
l = self .sourceModel ().data (left , PackageListItemModel .DataAccessRole )
442
469
r = self .sourceModel ().data (right , PackageListItemModel .DataAccessRole )
@@ -456,6 +483,16 @@ def filterAcceptsRow(self, row, parent=QModelIndex()):
456
483
if not data .contains_preference_pack ():
457
484
return False
458
485
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
+
459
496
name = data .display_name
460
497
desc = data .description
461
498
if hasattr (self , "filterRegularExpression" ): # Added in Qt 5.12
@@ -527,6 +564,20 @@ def setupUi(self, Form):
527
564
528
565
self .horizontalLayout_6 .addWidget (self .comboPackageType )
529
566
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
+
530
581
self .lineEditFilter = QLineEdit (Form )
531
582
self .lineEditFilter .setObjectName ("lineEditFilter" )
532
583
self .lineEditFilter .setClearButtonEnabled (True )
@@ -576,7 +627,21 @@ def retranslateUi(self, Form):
576
627
self .comboPackageType .setItemText (
577
628
3 , QCoreApplication .translate ("AddonsInstaller" , "Preference Packs" , None )
578
629
)
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
+ )
580
645
self .lineEditFilter .setPlaceholderText (
581
646
QCoreApplication .translate ("AddonsInstaller" , "Filter" , None )
582
647
)
0 commit comments