diff --git a/Ample/Base.lproj/DownloadWindow.xib b/Ample/Base.lproj/DownloadWindow.xib index 8a55de8..2b97284 100644 --- a/Ample/Base.lproj/DownloadWindow.xib +++ b/Ample/Base.lproj/DownloadWindow.xib @@ -13,6 +13,7 @@ + @@ -251,7 +252,6 @@ - + + + + + + + + + + + + + + + + + + diff --git a/Ample/DownloadWindowController.m b/Ample/DownloadWindowController.m index 5eb0ca1..6afc0c3 100644 --- a/Ample/DownloadWindowController.m +++ b/Ample/DownloadWindowController.m @@ -133,6 +133,7 @@ enum { /* filter buttons */ @property (weak) IBOutlet NSButton *allFilterButton; @property (weak) IBOutlet NSButton *missingFilterButton; +@property (weak) IBOutlet NSSearchField *searchFilter; @property (strong) IBOutlet NSArrayController *arrayController; @@ -152,6 +153,11 @@ enum { NSUserDefaults *_defaults; NSArray *_filterButtons; + + NSPredicate *_missingPredicate; + NSPredicate *_searchPredicate; + + } +(instancetype)sharedInstance { @@ -519,30 +525,65 @@ enum { } +-(void)updatePredicate { + if (!_missingPredicate && !_searchPredicate) { + [_arrayController setFilterPredicate: nil]; + return; + } + if (_missingPredicate && !_searchPredicate) { + [_arrayController setFilterPredicate: _missingPredicate]; + return; + } + if (_searchPredicate && !_missingPredicate) { + [_arrayController setFilterPredicate: _searchPredicate]; + return; + } + NSCompoundPredicate *p = [NSCompoundPredicate andPredicateWithSubpredicates: @[ _missingPredicate, _searchPredicate]]; + [_arrayController setFilterPredicate: p]; +} + - (IBAction)filterButton:(id)sender { - NSPredicate *p = nil; NSUInteger tag = [sender tag]; [sender setState: NSControlStateValueOn]; - for (NSButton *b in _filterButtons) { if (b != sender) [b setState: NSControlStateValueOff]; } switch (tag) { case 1: // all default: - [_arrayController setFilterPredicate: nil]; + _missingPredicate = nil; break; case 2: // missing. - p = [NSPredicate predicateWithBlock: ^BOOL(DownloadItem *item, NSDictionary *bindings){ + _missingPredicate = [NSPredicate predicateWithBlock: ^BOOL(DownloadItem *item, NSDictionary *bindings){ NSURL *localURL = [item localURL]; return localURL == nil; }]; - [_arrayController setFilterPredicate: p]; - break; } + + [self updatePredicate]; +} +- (IBAction)search:(id)sender { + NSString *text = [sender stringValue]; + if (![text length]) { + _searchPredicate = nil; + } else { + + text = [text lowercaseString]; + NSPredicate *p = [NSPredicate predicateWithBlock: ^(DownloadItem *item, NSDictionary *bindings){ + + NSString *value = [[item value] lowercaseString]; + NSString *name = [[item name] lowercaseString]; + + BOOL ok = [name containsString: text] || [value containsString: text]; + return ok; + }]; + _searchPredicate = p; + + } + [self updatePredicate]; }