Skip to content

Commit c545832

Browse files
committed
Fix the Stage view's horizontal split view
It will now remember it's position and the divider will keep its position relative to the bottom when the window resizes.
1 parent b11d4f7 commit c545832

File tree

3 files changed

+400
-9
lines changed

3 files changed

+400
-9
lines changed

PBGitCommitController.h

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#import "PBViewController.h"
1111

1212
@class PBGitIndexController, PBIconAndTextCell, PBWebChangesController, PBGitIndex;
13+
@class PBNiceSplitView;
1314

1415
@interface PBGitCommitController : PBViewController {
1516
// This might have to transfer over to the PBGitRepository
@@ -23,6 +24,7 @@
2324

2425
IBOutlet PBGitIndexController *indexController;
2526
IBOutlet PBWebChangesController *webController;
27+
IBOutlet PBNiceSplitView *commitSplitView;
2628
}
2729

2830
@property(readonly) PBGitIndex *index;

PBGitCommitController.m

+83
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
#import "PBChangedFile.h"
1212
#import "PBWebChangesController.h"
1313
#import "PBGitIndex.h"
14+
#import "PBNiceSplitView.h"
15+
16+
17+
#define kCommitSplitViewPositionDefault @"Commit SplitView Position"
1418

1519
@interface PBGitCommitController ()
1620
- (void)refreshFinished:(NSNotification *)notification;
@@ -22,6 +26,7 @@ - (void)commitHookFailed:(NSNotification *)notification;
2226
- (void)amendCommit:(NSNotification *)notification;
2327
- (void)indexChanged:(NSNotification *)notification;
2428
- (void)indexOperationFailed:(NSNotification *)notification;
29+
- (void)saveCommitSplitViewPosition;
2530
@end
2631

2732
@implementation PBGitCommitController
@@ -65,10 +70,14 @@ - (void)awakeFromNib
6570

6671
[cachedFilesController setAutomaticallyRearrangesObjects:NO];
6772
[unstagedFilesController setAutomaticallyRearrangesObjects:NO];
73+
74+
[commitSplitView setHidden:YES];
75+
[self performSelector:@selector(restoreCommitSplitViewPositiion) withObject:nil afterDelay:0];
6876
}
6977

7078
- (void)closeView
7179
{
80+
[self saveCommitSplitViewPosition];
7281
[webController closeView];
7382
}
7483

@@ -211,4 +220,78 @@ - (void)indexOperationFailed:(NSNotification *)notification
211220
[[repository windowController] showMessageSheet:@"Index operation failed" infoText:[[notification userInfo] objectForKey:@"description"]];
212221
}
213222

223+
224+
#pragma mark NSSplitView delegate methods
225+
226+
#define kCommitSplitViewTopViewMin 150
227+
#define kCommitSplitViewBottomViewMin 100
228+
229+
- (CGFloat)splitView:(NSSplitView *)splitView constrainMinCoordinate:(CGFloat)proposedMin ofSubviewAt:(NSInteger)dividerIndex
230+
{
231+
if (splitView == commitSplitView)
232+
return kCommitSplitViewTopViewMin;
233+
234+
return proposedMin;
235+
}
236+
237+
- (CGFloat)splitView:(NSSplitView *)splitView constrainMaxCoordinate:(CGFloat)proposedMax ofSubviewAt:(NSInteger)dividerIndex
238+
{
239+
if (splitView == commitSplitView)
240+
return [splitView frame].size.height - [splitView dividerThickness] - kCommitSplitViewBottomViewMin;
241+
242+
return proposedMax;
243+
}
244+
245+
// while the user resizes the window keep the lower (changes/message) view constant and just resize the upper view
246+
// unless the upper view gets too small
247+
- (void)resizeCommitSplitView
248+
{
249+
NSRect newFrame = [commitSplitView frame];
250+
251+
float dividerThickness = [commitSplitView dividerThickness];
252+
253+
NSView *upperView = [[commitSplitView subviews] objectAtIndex:0];
254+
NSRect upperFrame = [upperView frame];
255+
upperFrame.size.width = newFrame.size.width;
256+
257+
NSView *lowerView = [[commitSplitView subviews] objectAtIndex:1];
258+
NSRect lowerFrame = [lowerView frame];
259+
lowerFrame.size.width = newFrame.size.width;
260+
261+
upperFrame.size.height = newFrame.size.height - lowerFrame.size.height - dividerThickness;
262+
if (upperFrame.size.height < kCommitSplitViewTopViewMin)
263+
upperFrame.size.height = kCommitSplitViewTopViewMin;
264+
265+
lowerFrame.size.height = newFrame.size.height - upperFrame.size.height - dividerThickness;
266+
lowerFrame.origin.y = newFrame.size.height - lowerFrame.size.height;
267+
268+
[upperView setFrame:upperFrame];
269+
[lowerView setFrame:lowerFrame];
270+
}
271+
272+
- (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize
273+
{
274+
if (splitView == commitSplitView)
275+
[self resizeCommitSplitView];
276+
}
277+
278+
// NSSplitView does not save and restore the position of the splitView correctly so do it manually
279+
- (void)saveCommitSplitViewPosition
280+
{
281+
float position = [[[commitSplitView subviews] objectAtIndex:0] frame].size.height;
282+
[[NSUserDefaults standardUserDefaults] setFloat:position forKey:kCommitSplitViewPositionDefault];
283+
[[NSUserDefaults standardUserDefaults] synchronize];
284+
}
285+
286+
// make sure this happens after awakeFromNib
287+
- (void)restoreCommitSplitViewPositiion
288+
{
289+
float position = [[NSUserDefaults standardUserDefaults] floatForKey:kCommitSplitViewPositionDefault];
290+
if (position < 1.0)
291+
position = [commitSplitView frame].size.height - 225;
292+
293+
[commitSplitView setPosition:position ofDividerAtIndex:0];
294+
[commitSplitView setHidden:NO];
295+
}
296+
214297
@end

0 commit comments

Comments
 (0)