@@ -133,6 +133,7 @@ @interface DownloadWindowController ()
133133/* filter buttons */
134134@property (weak ) IBOutlet NSButton *allFilterButton;
135135@property (weak ) IBOutlet NSButton *missingFilterButton;
136+ @property (weak ) IBOutlet NSSearchField *searchFilter;
136137
137138@property (strong ) IBOutlet NSArrayController *arrayController;
138139
@@ -152,6 +153,11 @@ @implementation DownloadWindowController {
152153 NSUserDefaults *_defaults;
153154
154155 NSArray <NSButton *> *_filterButtons;
156+
157+ NSPredicate *_missingPredicate;
158+ NSPredicate *_searchPredicate;
159+
160+
155161}
156162
157163+(instancetype )sharedInstance {
@@ -519,30 +525,65 @@ - (IBAction)downloadExtensionChanged:(id)sender {
519525}
520526
521527
528+ -(void )updatePredicate {
529+ if (!_missingPredicate && !_searchPredicate) {
530+ [_arrayController setFilterPredicate: nil ];
531+ return ;
532+ }
533+ if (_missingPredicate && !_searchPredicate) {
534+ [_arrayController setFilterPredicate: _missingPredicate];
535+ return ;
536+ }
537+ if (_searchPredicate && !_missingPredicate) {
538+ [_arrayController setFilterPredicate: _searchPredicate];
539+ return ;
540+ }
541+ NSCompoundPredicate *p = [NSCompoundPredicate andPredicateWithSubpredicates: @[ _missingPredicate, _searchPredicate]];
542+ [_arrayController setFilterPredicate: p];
543+ }
544+
522545- (IBAction )filterButton : (id )sender {
523546
524- NSPredicate *p = nil ;
525547 NSUInteger tag = [sender tag ];
526548 [sender setState: NSControlStateValueOn ];
527549
528-
529550 for (NSButton *b in _filterButtons) {
530551 if (b != sender) [b setState: NSControlStateValueOff ];
531552 }
532553 switch (tag) {
533554 case 1 : // all
534555 default :
535- [_arrayController setFilterPredicate: nil ] ;
556+ _missingPredicate = nil ;
536557 break ;
537558 case 2 : // missing.
538- p = [NSPredicate predicateWithBlock: ^BOOL (DownloadItem *item, NSDictionary *bindings){
559+ _missingPredicate = [NSPredicate predicateWithBlock: ^BOOL (DownloadItem *item, NSDictionary *bindings){
539560 NSURL *localURL = [item localURL ];
540561 return localURL == nil ;
541562 }];
542563
543- [_arrayController setFilterPredicate: p];
544- break ;
545564 }
565+
566+ [self updatePredicate ];
567+ }
568+ - (IBAction )search : (id )sender {
569+ NSString *text = [sender stringValue ];
570+ if (![text length ]) {
571+ _searchPredicate = nil ;
572+ } else {
573+
574+ text = [text lowercaseString ];
575+ NSPredicate *p = [NSPredicate predicateWithBlock: ^(DownloadItem *item, NSDictionary *bindings){
576+
577+ NSString *value = [[item value ] lowercaseString ];
578+ NSString *name = [[item name ] lowercaseString ];
579+
580+ BOOL ok = [name containsString: text] || [value containsString: text];
581+ return ok;
582+ }];
583+ _searchPredicate = p;
584+
585+ }
586+ [self updatePredicate ];
546587}
547588
548589
0 commit comments