diff --git a/PBGitHistoryController.m b/PBGitHistoryController.m index b1ad88e..03e5c9e 100644 --- a/PBGitHistoryController.m +++ b/PBGitHistoryController.m @@ -30,11 +30,14 @@ #define kHistoryDetailViewIndex 0 #define kHistoryTreeViewIndex 1 +#define kHistorySplitViewPositionDefault @"History SplitView Position" + @interface PBGitHistoryController () - (void) updateBranchFilterMatrix; - (void) restoreFileBrowserSelection; - (void) saveFileBrowserSelection; +- (void)saveSplitViewPosition; @end @@ -77,13 +80,14 @@ [[commitList tableColumnWithIdentifier:@"SubjectColumn"] setSortDescriptorPrototype:[[NSSortDescriptor alloc] initWithKey:@"subject" ascending:YES]]; // Add a menu that allows a user to select which columns to view [[commitList headerView] setMenu:[self tableColumnMenu]]; + [historySplitView setTopMin:58.0 andBottomMin:100.0]; - [historySplitView uncollapse]; + [historySplitView setHidden:YES]; + [self performSelector:@selector(restoreSplitViewPositiion) withObject:nil afterDelay:0]; [upperToolbarView setTopShade:237/255.0 bottomShade:216/255.0]; [scopeBarView setTopColor:[NSColor colorWithCalibratedHue:0.579 saturation:0.068 brightness:0.898 alpha:1.000] bottomColor:[NSColor colorWithCalibratedHue:0.579 saturation:0.119 brightness:0.765 alpha:1.000]]; - //[scopeBarView setTopShade:207/255.0 bottomShade:180/255.0]; [self updateBranchFilterMatrix]; [super awakeFromNib]; @@ -419,13 +423,6 @@ [self updateKeys]; } -- (void)viewLoaded -{ - float position = [[NSUserDefaults standardUserDefaults] floatForKey:@"PBGitSplitViewPosition"]; - if (position) - [historySplitView setPosition:position ofDividerAtIndex:0]; -} - - (NSResponder *)firstResponder; { return commitList; @@ -488,9 +485,7 @@ - (void)closeView { - float position = [[[historySplitView subviews] objectAtIndex:0] frame].size.height; - [[NSUserDefaults standardUserDefaults] setFloat:position forKey:@"PBGitSplitViewPosition"]; - [[NSUserDefaults standardUserDefaults] synchronize]; + [self saveSplitViewPosition]; if (commitController) { [commitController removeObserver:self forKeyPath:@"selection"]; @@ -620,12 +615,17 @@ return menuItems; } -- (BOOL)splitView:(NSSplitView *)sender canCollapseSubview:(NSView *)subview { + +#pragma mark NSSplitView delegate methods + +- (BOOL)splitView:(NSSplitView *)splitView canCollapseSubview:(NSView *)subview +{ return TRUE; } -- (BOOL)splitView:(NSSplitView *)splitView shouldCollapseSubview:(NSView *)subview forDoubleClickOnDividerAtIndex:(NSInteger)dividerIndex { - int index = [[splitView subviews] indexOfObject:subview]; +- (BOOL)splitView:(NSSplitView *)splitView shouldCollapseSubview:(NSView *)subview forDoubleClickOnDividerAtIndex:(NSInteger)dividerIndex +{ + NSUInteger index = [[splitView subviews] indexOfObject:subview]; // this method (and canCollapse) are called by the splitView to decide how to collapse on double-click // we compare our two subviews, so that always the smaller one is collapsed. if([[[splitView subviews] objectAtIndex:index] frame].size.height < [[[splitView subviews] objectAtIndex:((index+1)%2)] frame].size.height) { @@ -634,14 +634,59 @@ return FALSE; } -- (CGFloat)splitView:(NSSplitView *)sender constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)offset { - return proposedMin + historySplitView.topViewMin; +- (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)dividerIndex +{ + return historySplitView.topViewMin; } -- (CGFloat)splitView:(NSSplitView *)sender constrainMaxCoordinate:(CGFloat)proposedMax ofSubviewAt:(NSInteger)offset { - if(offset == 1) - return proposedMax - historySplitView.bottomViewMin; - return [sender frame].size.height; +- (CGFloat)splitView:(NSSplitView *)splitView constrainMaxCoordinate:(CGFloat)proposedMax ofSubviewAt:(NSInteger)dividerIndex +{ + return [splitView frame].size.height - [splitView dividerThickness] - historySplitView.bottomViewMin; +} + +// while the user resizes the window keep the upper (history) view constant and just resize the lower view +// unless the lower view gets too small +- (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize +{ + NSRect newFrame = [splitView frame]; + + float dividerThickness = [splitView dividerThickness]; + + NSView *upperView = [[splitView subviews] objectAtIndex:0]; + NSRect upperFrame = [upperView frame]; + upperFrame.size.width = newFrame.size.width; + + if ((newFrame.size.height - upperFrame.size.height - dividerThickness) < historySplitView.bottomViewMin) { + upperFrame.size.height = newFrame.size.height - historySplitView.bottomViewMin - dividerThickness; + } + + NSView *lowerView = [[splitView subviews] objectAtIndex:1]; + NSRect lowerFrame = [lowerView frame]; + lowerFrame.origin.y = upperFrame.size.height + dividerThickness; + lowerFrame.size.height = newFrame.size.height - lowerFrame.origin.y; + lowerFrame.size.width = newFrame.size.width; + + [upperView setFrame:upperFrame]; + [lowerView setFrame:lowerFrame]; +} + +// NSSplitView does not save and restore the position of the SplitView correctly so do it manually +- (void)saveSplitViewPosition +{ + float position = [[[historySplitView subviews] objectAtIndex:0] frame].size.height; + [[NSUserDefaults standardUserDefaults] setFloat:position forKey:kHistorySplitViewPositionDefault]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +// make sure this happens after awakeFromNib +- (void)restoreSplitViewPositiion +{ + float position = [[NSUserDefaults standardUserDefaults] floatForKey:kHistorySplitViewPositionDefault]; + if (position < 1.0) + position = 175; + + [historySplitView setPosition:position ofDividerAtIndex:0]; + [historySplitView setHidden:NO]; } diff --git a/PBGitHistoryView.xib b/PBGitHistoryView.xib index ab66632..aa1dd9b 100644 --- a/PBGitHistoryView.xib +++ b/PBGitHistoryView.xib @@ -1197,7 +1197,6 @@ {955, 405} 2 - HistoryViewSplitView {955, 434}