Exclude file browser width from new windows’ width

Closes #679.
This commit is contained in:
Allan Odgaard
2013-02-19 21:54:47 +01:00
parent 0bf5a85a1c
commit 0d8ccd17f0
3 changed files with 40 additions and 15 deletions

View File

@@ -51,7 +51,7 @@ static BOOL IsInShouldTerminateEventLoop = NO;
}
@end
@interface DocumentController () <NSWindowDelegate, OakTabBarViewDelegate, OakTabBarViewDataSource, OakTextViewDelegate, OakFileBrowserDelegate, QLPreviewPanelDelegate, QLPreviewPanelDataSource>
@interface DocumentController () <NSWindowDelegate, OakTabBarViewDelegate, OakTabBarViewDataSource, OakTextViewDelegate, OakFileBrowserDelegate, OakWindowFrameHelperDelegate, QLPreviewPanelDelegate, QLPreviewPanelDataSource>
@property (nonatomic) ProjectLayoutView* layoutView;
@property (nonatomic) OakTabBarView* tabBarView;
@property (nonatomic) OakDocumentView* documentView;
@@ -291,10 +291,11 @@ namespace
- (void)windowWillClose:(NSNotification*)aNotification
{
self.documents = std::vector<document::document_ptr>();
self.selectedDocument = document::document_ptr();
self.window.delegate = nil;
self.identifier = nil; // This removes us from AllControllers and causes a release
self.documents = std::vector<document::document_ptr>();
self.selectedDocument = document::document_ptr();
self.window.delegate = nil;
self.fileBrowserVisible = NO; // Make window frame small as we no longer respond to savableWindowFrame
self.identifier = nil; // This removes us from AllControllers and causes a release
}
- (void)showWindow:(id)sender
@@ -1524,7 +1525,7 @@ namespace
self.fileBrowser.view.nextResponder = self.fileBrowser;
}
if(!self.disableFileBrowserWindowResize && [self.window isVisible] && ([self.window styleMask] & NSFullScreenWindowMask) != NSFullScreenWindowMask)
if(!self.disableFileBrowserWindowResize && ([self.window styleMask] & NSFullScreenWindowMask) != NSFullScreenWindowMask)
{
NSRect windowFrame = self.window.frame;
if(makeVisibleFlag)
@@ -2028,8 +2029,6 @@ static NSUInteger DisableSessionSavingCount = 0;
{
DocumentController* controller = [DocumentController new];
if(NSString* windowFrame = project[@"windowFrame"])
[controller.window setFrame:NSRectFromString(windowFrame) display:NO];
if(NSString* fileBrowserWidth = project[@"fileBrowserWidth"])
controller.fileBrowserWidth = [fileBrowserWidth floatValue];
if(NSString* htmlOutputSize = project[@"htmlOutputSize"])
@@ -2039,6 +2038,9 @@ static NSUInteger DisableSessionSavingCount = 0;
controller.fileBrowserHistory = project[@"fileBrowserState"];
controller.fileBrowserVisible = [project[@"fileBrowserVisible"] boolValue];
if(NSString* windowFrame = project[@"windowFrame"])
[controller.window setFrame:NSRectFromString(windowFrame) display:NO];
std::vector<document::document_ptr> documents;
NSInteger selectedTabIndex = 0;
@@ -2135,6 +2137,18 @@ static NSUInteger DisableSessionSavingCount = 0;
return [session writeToFile:[self sessionPath] atomically:YES];
}
// ================================
// = OakWindowFrameHelperDelegate =
// ================================
- (NSRect)savableWindowFrame
{
NSRect res = [self.window frame];
if(self.fileBrowserVisible)
res.size.width -= self.fileBrowserWidth;
return res;
}
// ==========
// = Legacy =
// ==========

View File

@@ -1,5 +1,9 @@
#import <oak/debug.h>
@protocol OakWindowFrameHelperDelegate <NSObject>
- (NSRect)savableWindowFrame;
@end
PUBLIC @interface OakWindowFrameHelper : NSObject
{
OBJC_WATCH_LEAKS(OakWindowFrameHelper);

View File

@@ -85,10 +85,17 @@ OAK_DEBUG_VAR(WindowFrameHelper);
// = The Actual Logic =
// ====================
- (NSRect)windowFrame:(NSWindow*)aWindow
{
if([[aWindow delegate] conformsToProtocol:@protocol(OakWindowFrameHelperDelegate)])
return [(id <OakWindowFrameHelperDelegate>)[aWindow delegate] savableWindowFrame];
return [aWindow frame];
}
- (void)snapshotWindowFrame
{
if((([window styleMask] & NSFullScreenWindowMask) != NSFullScreenWindowMask))
[[NSUserDefaults standardUserDefaults] setObject:NSStringFromRect([window frame]) forKey:self.autosaveName];
[[NSUserDefaults standardUserDefaults] setObject:NSStringFromRect([self windowFrame:window]) forKey:self.autosaveName];
}
- (BOOL)ignoreWindow:(NSWindow*)aWindow
@@ -115,10 +122,10 @@ OAK_DEBUG_VAR(WindowFrameHelper);
if([self ignoreWindow:win])
continue;
D(DBF_WindowFrameHelper, bug("window @ %s (%s)\n", [NSStringFromRect([win frame]) UTF8String], [[[[win delegate] class] description] UTF8String]););
if(NSMaxY([win frame]) < winYPos)
D(DBF_WindowFrameHelper, bug("window @ %s (%s)\n", [NSStringFromRect([self windowFrame:win) UTF8String], [[[[win delegate] class] description] UTF8String]););
if(NSMaxY([self windowFrame:win]) < winYPos)
{
winYPos = NSMaxY([win frame]);
winYPos = NSMaxY([self windowFrame:win]);
lowerWin = win;
}
}
@@ -126,7 +133,7 @@ OAK_DEBUG_VAR(WindowFrameHelper);
if(lowerWin)
{
D(DBF_WindowFrameHelper, bug("cascade window\n"););
r = [lowerWin frame];
r = [self windowFrame:lowerWin];
[aWindow setFrame:r display:NO];
r.origin = [aWindow cascadeTopLeftFromPoint:NSMakePoint(NSMinX(r), NSMaxY(r))];
r.origin.y -= r.size.height;
@@ -143,7 +150,7 @@ OAK_DEBUG_VAR(WindowFrameHelper);
if([self ignoreWindow:win])
continue;
if(NSEqualPoints([win frame].origin, r.origin))
if(NSEqualPoints([self windowFrame:win].origin, r.origin))
alreadyHasWrappedWindow = true;
}
@@ -152,7 +159,7 @@ OAK_DEBUG_VAR(WindowFrameHelper);
NSWindow* win = [NSApp mainWindow];
if([[win delegate] isKindOfClass:windowDelegateClass])
{
r = [win frame];
r = [self windowFrame:win];
[aWindow setFrame:r display:NO];
r.origin = [aWindow cascadeTopLeftFromPoint:NSMakePoint(NSMinX(r), NSMaxY(r))];
r.origin.y -= r.size.height;