diff --git a/PBGitHistoryController.h b/PBGitHistoryController.h index 6dac4d4..e96b87a 100644 --- a/PBGitHistoryController.h +++ b/PBGitHistoryController.h @@ -23,6 +23,7 @@ IBOutlet NSArrayController* commitController; IBOutlet NSTreeController* treeController; IBOutlet NSOutlineView* fileBrowser; + NSArray *currentFileBrowserSelectionPath; IBOutlet NSTableView* commitList; IBOutlet PBCollapsibleSplitView *historySplitView; QLPreviewPanel* previewPanel; diff --git a/PBGitHistoryController.m b/PBGitHistoryController.m index 5d04af9..7d35892 100644 --- a/PBGitHistoryController.m +++ b/PBGitHistoryController.m @@ -29,6 +29,8 @@ @interface PBGitHistoryController () - (void) updateBranchFilterMatrix; +- (void) restoreFileBrowserSelection; +- (void) saveFileBrowserSelection; @end @@ -89,8 +91,10 @@ selectedCommit = [[commitController selectedObjects] lastObject]; - if (self.selectedCommitDetailsIndex == kHistoryTreeViewIndex) + if (self.selectedCommitDetailsIndex == kHistoryTreeViewIndex) { self.gitTree = selectedCommit.tree; + [self restoreFileBrowserSelection]; + } else // kHistoryDetailViewIndex self.webCommit = selectedCommit; @@ -153,15 +157,60 @@ self.status = [NSString stringWithFormat:@"%d commits loaded", [[commitController arrangedObjects] count]]; } +- (void) restoreFileBrowserSelection +{ + if (self.selectedCommitDetailsIndex != kHistoryTreeViewIndex) + return; + + NSArray *children = [treeController content]; + if ([children count] == 0) + return; + + NSIndexPath *path = [[NSIndexPath alloc] init]; + if ([currentFileBrowserSelectionPath count] == 0) + path = [path indexPathByAddingIndex:0]; + else { + for (NSString *pathComponent in currentFileBrowserSelectionPath) { + PBGitTree *child = nil; + NSUInteger childIndex = 0; + for (child in children) { + if ([child.path isEqualToString:pathComponent]) { + path = [path indexPathByAddingIndex:childIndex]; + children = child.children; + break; + } + childIndex++; + } + if (!child) + return; + } + } + + [treeController setSelectionIndexPath:path]; +} + +- (void) saveFileBrowserSelection +{ + NSArray *objects = [treeController selectedObjects]; + NSArray *content = [treeController content]; + + if ([objects count] && [content count]) { + PBGitTree *treeItem = [objects objectAtIndex:0]; + currentFileBrowserSelectionPath = [treeItem.fullPath componentsSeparatedByString:@"/"]; + } +} + - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([(NSString *)context isEqualToString: @"commitChange"]) { [self updateKeys]; + [self restoreFileBrowserSelection]; return; } if ([(NSString *)context isEqualToString: @"treeChange"]) { [self updateQuicklookForce: NO]; + [self saveFileBrowserSelection]; return; } diff --git a/PBGitHistoryView.xib b/PBGitHistoryView.xib index 179a855..4085e58 100644 --- a/PBGitHistoryView.xib +++ b/PBGitHistoryView.xib @@ -58,9 +58,7 @@ PBGitTree - YES YES - YES children leaf