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];
}