diff --git a/baRSS/Info.plist b/baRSS/Info.plist index 902385f..58e4242 100644 --- a/baRSS/Info.plist +++ b/baRSS/Info.plist @@ -32,7 +32,7 @@ CFBundleVersion - 8018 + 8048 LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement diff --git a/baRSS/Preferences/Feeds Tab/SettingsFeeds.m b/baRSS/Preferences/Feeds Tab/SettingsFeeds.m index 3bab9b9..c4b83ee 100644 --- a/baRSS/Preferences/Feeds Tab/SettingsFeeds.m +++ b/baRSS/Preferences/Feeds Tab/SettingsFeeds.m @@ -254,7 +254,7 @@ static NSString *dragNodeType = @"baRSS-feed-drag"; [self beginCoreDataChange]; NSArray *parentNodes = [self.dataStore.selectedNodes valueForKeyPath:@"parentNode"]; [self.dataStore remove:sender]; - for (NSTreeNode *parent in parentNodes) { + for (NSTreeNode *parent in [self filterOutRedundant:parentNodes]) { [self restoreOrderingAndIndexPathStr:parent]; } [self endCoreDataChangeShouldUndo:NO]; @@ -356,15 +356,13 @@ static NSString *dragNodeType = @"baRSS-feed-drag"; NSUInteger idx = (NSUInteger)index; if (index == -1) // drag items on folder or root drop idx = destParent.childNodes.count; - NSIndexPath *dest = [destParent indexPath]; NSArray *previousParents = [self.currentlyDraggedNodes valueForKeyPath:@"parentNode"]; - [self.dataStore moveNodes:self.currentlyDraggedNodes toIndexPath:[dest indexPathByAddingIndex:idx]]; + [self.dataStore moveNodes:self.currentlyDraggedNodes toIndexPath:[destParent.indexPath indexPathByAddingIndex:idx]]; - for (NSTreeNode *node in previousParents) { + for (NSTreeNode *node in [self filterOutRedundant:[previousParents arrayByAddingObject:destParent]]) { [self restoreOrderingAndIndexPathStr:node]; } - [self restoreOrderingAndIndexPathStr:destParent]; return YES; } @@ -461,26 +459,8 @@ static NSString *dragNodeType = @"baRSS-feed-drag"; /// Copy human readable description of selected nodes to clipboard. - (void)copy:(id)sender { NSMutableString *str = [[NSMutableString alloc] init]; - NSUInteger count = self.dataStore.selectedNodes.count; - NSMutableArray *groups = [NSMutableArray arrayWithCapacity:count]; - - // filter out nodes that are already present in some selected parent node - for (NSTreeNode *node in self.dataStore.selectedNodes) { - BOOL skipItem = NO; - for (NSTreeNode *stored in groups) { - NSIndexPath *p = node.indexPath; - while (p.length > stored.indexPath.length) - p = [p indexPathByRemovingLastIndex]; - if ([p isEqualTo:stored.indexPath]) { - skipItem = YES; - break; - } - } - if (!skipItem) { - [self traverseChildren:node appendString:str prefix:@""]; - if (node.childNodes.count > 0) - [groups addObject:node]; - } + for (NSTreeNode *node in [self filterOutRedundant:self.dataStore.selectedNodes]) { + [self traverseChildren:node appendString:str prefix:@""]; } [[NSPasteboard generalPasteboard] clearContents]; [[NSPasteboard generalPasteboard] setString:str forType:NSPasteboardTypeString]; @@ -500,4 +480,22 @@ static NSString *dragNodeType = @"baRSS-feed-drag"; } } +/// Remove redundant nodes that are already present in some selected parent node +- (NSArray*)filterOutRedundant:(NSArray*)nodes { + NSMutableArray *result = [NSMutableArray arrayWithCapacity:nodes.count]; + for (NSTreeNode *current in nodes) { + BOOL skip = NO; + for (NSTreeNode *stored in result) { + NSIndexPath *p = current.indexPath; + while (p.length > stored.indexPath.length) + p = [p indexPathByRemovingLastIndex]; + if ([p isEqualTo:stored.indexPath]) { + skip = YES; break; + } + } + if (skip == NO) [result addObject:current]; + } + return result; +} + @end