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