From 930ab2c496bd9719085e1e0056239da77e887244 Mon Sep 17 00:00:00 2001 From: Allan Odgaard Date: Sun, 19 Oct 2014 18:50:42 +0200 Subject: [PATCH] Remember sort column when bundles are updated Closes #1268 --- .../Preferences/src/BundlesPreferences.h | 2 + .../Preferences/src/BundlesPreferences.mm | 50 ++++++++++++------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/Frameworks/Preferences/src/BundlesPreferences.h b/Frameworks/Preferences/src/BundlesPreferences.h index cd317339..e8124872 100644 --- a/Frameworks/Preferences/src/BundlesPreferences.h +++ b/Frameworks/Preferences/src/BundlesPreferences.h @@ -12,6 +12,8 @@ IBOutlet NSSearchField* searchField; NSString* filterString; + NSString* sortColumnIdentifier; + BOOL sortAscending; std::vector categories; std::set enabledCategories; diff --git a/Frameworks/Preferences/src/BundlesPreferences.mm b/Frameworks/Preferences/src/BundlesPreferences.mm index 49841f63..e5251a30 100644 --- a/Frameworks/Preferences/src/BundlesPreferences.mm +++ b/Frameworks/Preferences/src/BundlesPreferences.mm @@ -28,6 +28,23 @@ static std::string textify (std::string str) - (NSString*)toolbarItemLabel { return @"Bundles"; } - (NSView*)initialKeyView { return bundlesTableView; } +- (void)sortBundlesByColumnWithIdentifier:(NSString*)anIdentifier ascending:(BOOL)ascendingFlag +{ + text::less_t lessThan; + + if([anIdentifier isEqualToString:@"installed"]) + std::stable_sort(bundles.begin(), bundles.end(), [](bundles_db::bundle_ptr lhs, bundles_db::bundle_ptr rhs){ return lhs.get()->installed() && !rhs.get()->installed(); }); + else if([anIdentifier isEqualToString:@"name"]) + std::sort(bundles.begin(), bundles.end(), [&lessThan](bundles_db::bundle_ptr lhs, bundles_db::bundle_ptr rhs){ return lessThan(lhs.get()->name(), rhs.get()->name()); }); + else if([anIdentifier isEqualToString:@"date"]) + std::sort(bundles.begin(), bundles.end(), [](bundles_db::bundle_ptr lhs, bundles_db::bundle_ptr rhs){ return (rhs.get()->installed() ? rhs.get()->path_updated() : rhs.get()->url_updated()) < (lhs.get()->installed() ? lhs.get()->path_updated() : lhs.get()->url_updated()); }); + else if([anIdentifier isEqualToString:@"description"]) + std::sort(bundles.begin(), bundles.end(), [&lessThan](bundles_db::bundle_ptr lhs, bundles_db::bundle_ptr rhs){ return lessThan(textify(lhs.get()->description()), textify(rhs.get()->description())); }); + + if(!ascendingFlag) + std::reverse(bundles.begin(), bundles.end()); +} + - (void)bundlesDidChange:(id)sender { std::set set; @@ -63,9 +80,8 @@ static std::string textify (std::string str) } } } - for(NSTableColumn* tableColumn in [bundlesTableView tableColumns]) - [bundlesTableView setIndicatorImage:nil inTableColumn:tableColumn]; - [bundlesTableView setIndicatorImage:[NSImage imageNamed:@"NSAscendingSortIndicator"] inTableColumn:[bundlesTableView tableColumnWithIdentifier:@"name"]]; + + [self sortBundlesByColumnWithIdentifier:sortColumnIdentifier ascending:sortAscending]; [bundlesTableView reloadData]; } @@ -75,6 +91,9 @@ static std::string textify (std::string str) { [MGScopeBar class]; // Ensure that we reference the class so that the linker doesn’t strip the framework + sortColumnIdentifier = @"name"; + sortAscending = YES; + self.bundlesManager = [BundlesManager sharedInstance]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bundlesDidChange:) name:BundlesManagerBundlesDidChangeNotification object:_bundlesManager]; [self bundlesDidChange:self]; @@ -152,26 +171,21 @@ static std::string textify (std::string str) - (void)tableView:(NSTableView*)aTableView didClickTableColumn:(NSTableColumn*)aTableColumn { - text::less_t lessThan; + NSArray* const sortableColumns = @[ @"installed", @"name", @"date", @"description" ]; - if([[aTableColumn identifier] isEqualToString:@"installed"]) - std::stable_sort(bundles.begin(), bundles.end(), [](bundles_db::bundle_ptr lhs, bundles_db::bundle_ptr rhs){ return lhs.get()->installed() && !rhs.get()->installed(); }); - else if([[aTableColumn identifier] isEqualToString:@"name"]) - std::sort(bundles.begin(), bundles.end(), [&lessThan](bundles_db::bundle_ptr lhs, bundles_db::bundle_ptr rhs){ return lessThan(lhs.get()->name(), rhs.get()->name()); }); - else if([[aTableColumn identifier] isEqualToString:@"date"]) - std::sort(bundles.begin(), bundles.end(), [](bundles_db::bundle_ptr lhs, bundles_db::bundle_ptr rhs){ return (rhs.get()->installed() ? rhs.get()->path_updated() : rhs.get()->url_updated()) < (lhs.get()->installed() ? lhs.get()->path_updated() : lhs.get()->url_updated()); }); - else if([[aTableColumn identifier] isEqualToString:@"description"]) - std::sort(bundles.begin(), bundles.end(), [&lessThan](bundles_db::bundle_ptr lhs, bundles_db::bundle_ptr rhs){ return lessThan(textify(lhs.get()->description()), textify(rhs.get()->description())); }); - else + NSString* columnIdentifier = [aTableColumn identifier]; + if(![sortableColumns containsObject:columnIdentifier]) return; - BOOL sortDescending = [aTableView indicatorImageInTableColumn:aTableColumn] == [NSImage imageNamed:@"NSAscendingSortIndicator"]; - if(sortDescending) - std::reverse(bundles.begin(), bundles.end()); + BOOL ascending = [columnIdentifier isEqualToString:sortColumnIdentifier] ? !sortAscending : YES; + [self sortBundlesByColumnWithIdentifier:columnIdentifier ascending:ascending]; - for(NSTableColumn* tableColumn in [aTableView tableColumns]) + sortColumnIdentifier = columnIdentifier; + sortAscending = ascending; + + for(NSTableColumn* tableColumn in [bundlesTableView tableColumns]) [aTableView setIndicatorImage:nil inTableColumn:tableColumn]; - [aTableView setIndicatorImage:[NSImage imageNamed:(sortDescending ? @"NSDescendingSortIndicator" : @"NSAscendingSortIndicator")] inTableColumn:aTableColumn]; + [aTableView setIndicatorImage:[NSImage imageNamed:(ascending ? @"NSAscendingSortIndicator" : @"NSDescendingSortIndicator")] inTableColumn:aTableColumn]; [aTableView reloadData]; }