From eb8c5c4749705f091517de79b533dc8f68262d0b Mon Sep 17 00:00:00 2001 From: Michael Starke Date: Thu, 23 Aug 2018 18:59:43 +0200 Subject: [PATCH] Menu items now correclty toggel search flags, not only buttons. UI is still a bit broken, but functional --- MacPass/Base.lproj/ContextBar.xib | 4 +-- MacPass/MPContextBarViewController.m | 41 ++++++++++++++++++---------- MacPass/MPDocument+Search.m | 19 ++++++++++--- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/MacPass/Base.lproj/ContextBar.xib b/MacPass/Base.lproj/ContextBar.xib index 6c82edd1..6cdba279 100644 --- a/MacPass/Base.lproj/ContextBar.xib +++ b/MacPass/Base.lproj/ContextBar.xib @@ -109,12 +109,12 @@ - + - + diff --git a/MacPass/MPContextBarViewController.m b/MacPass/MPContextBarViewController.m index f939b4f9..5bc13128 100644 --- a/MacPass/MPContextBarViewController.m +++ b/MacPass/MPContextBarViewController.m @@ -95,9 +95,10 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { NSArray *titles = @[ NSLocalizedString(@"SEARCH_DUPLICATE_PASSWORDS", "Search option: Find duplicate passwords"), NSLocalizedString(@"SEARCH_EXPIRED_ENTRIES", "Search option: Find expired entries") ]; NSMenu *specialMenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"CUSTOM_SEARCH_FILTER_MENU", @"Title for menu for custom search filters")]; [specialMenu addItemWithTitle:NSLocalizedString(@"SELECT_FILTER_WITH_DOTS", "Menu displayed as popup selection for search options") action:NULL keyEquivalent:@""]; - [specialMenu itemAtIndex:0].enabled = NO; - [specialMenu itemAtIndex:0].tag = MPEntrySearchNone; - [specialMenu itemAtIndex:0].action = @selector(toggleSearchFlags:); + NSMenuItem *selectItem = specialMenu.itemArray.firstObject; + selectItem.enabled = NO; + selectItem.tag = MPEntrySearchNone; + selectItem.action = @selector(toggleSearchFlags:); for(NSInteger iIndex = 0; iIndex < (sizeof(specialTags)/sizeof(NSInteger)); iIndex++) { NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:titles[iIndex] action:@selector(toggleSearchFlags:) keyEquivalent:@""]; item.tag = specialTags[iIndex]; @@ -138,13 +139,17 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { for(NSView *view in views) { if([view isKindOfClass:NSButton.class]) { NSButton *button = (NSButton *)view; - NSMenuItem *item = [self.specialFilterPopUpButton.menu itemWithTag:button.tag]; + NSMenu *menu = self.specialFilterPopUpButton.menu; + NSMenuItem *item = [menu itemWithTag:button.tag]; if(item) { return; // no duplicates } item = [self _menuItemForButton:button]; if(item) { - [self.specialFilterPopUpButton.menu addItem:item]; + if(menu.itemArray.count == 3) { + [menu addItem:[NSMenuItem separatorItem]]; + } + [menu addItem:item]; } } } @@ -155,9 +160,13 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { for(NSView *view in views) { if([view isKindOfClass:NSButton.class]) { NSButton *button = (NSButton *)view; - NSMenuItem *item = [self.specialFilterPopUpButton.menu itemWithTag:button.tag]; + NSMenu *menu = self.specialFilterPopUpButton.menu; + NSMenuItem *item = [menu itemWithTag:button.tag]; if(item) { - [self.specialFilterPopUpButton.menu removeItem:item]; + [menu removeItem:item]; + if(menu.itemArray.count == 4) { + [menu removeItemAtIndex:3]; + } } } } @@ -175,21 +184,25 @@ typedef NS_ENUM(NSUInteger, MPContextTab) { self.usernameButton.state = HNHUIStateForBool(MPIsFlagSetInOptions(MPEntrySearchUsernames, currentFlags)); self.everywhereButton.state = HNHUIStateForBool(MPIsFlagSetInOptions(MPEntrySearchAllAttributes, currentFlags)); NSInteger selectedTag = MPEntrySearchNone; + NSMutableSet *selectedTags = [[NSMutableSet alloc] init]; for(NSMenuItem *item in self.specialFilterPopUpButton.menu.itemArray) { MPEntrySearchFlags flag = item.tag; if(flag == MPEntrySearchNone) { item.state = NSOffState; item.enabled = NO; + continue; } - else { - BOOL isActive = MPIsFlagSetInOptions(flag, currentFlags); - if(isActive) { - selectedTag = flag; - } - item.state = HNHUIStateForBool(isActive); + + BOOL isActive = MPIsFlagSetInOptions(flag, currentFlags); + if(isActive) { + [selectedTags addObject:@(flag)]; + selectedTag = flag; } + item.state = HNHUIStateForBool(isActive); + } + if(selectedTags.count == 1) { + [self.specialFilterPopUpButton selectItemWithTag:selectedTag]; } - [self.specialFilterPopUpButton selectItemWithTag:selectedTag]; } - (NSMenuItem *)_menuItemForButton:(NSButton *)button { diff --git a/MacPass/MPDocument+Search.m b/MacPass/MPDocument+Search.m index e491f27a..0c3d9fd5 100644 --- a/MacPass/MPDocument+Search.m +++ b/MacPass/MPDocument+Search.m @@ -87,13 +87,24 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul MPEntrySearchFlags toggleFlag = [sender tag]; MPEntrySearchFlags newFlags = MPEntrySearchNone; BOOL isSingleFlag = toggleFlag & MPEntrySearchSingleFlags; - NSButton *button = sender; - switch(button.state) { - case NSOffState: + + NSControlStateValue state; + if([sender isKindOfClass:NSButton.class]) { + state = ((NSButton *)sender).state; + } + else { + NSAssert([sender isKindOfClass:NSMenuItem.class], @"Internal inconsitency. Did expect NSMenuItem expected, but got %@", [sender class]); + state = ((NSMenuItem *)sender).state; + /* Manually toggle the state since the popupbuttoncell doesn't do it like we want it to */ + state = state == NSControlStateValueOn ? NSControlStateValueOff : NSControlStateValueOn; + } + + switch(state) { + case NSControlStateValueOff: toggleFlag ^= MPEntrySearchAllCombineableFlags; newFlags = isSingleFlag ? MPEntrySearchNone : (self.searchContext.searchFlags & toggleFlag); break; - case NSOnState: + case NSControlStateValueOn: if(isSingleFlag ) { newFlags = toggleFlag; // This has to be either expired or double passwords }