diff --git a/Frameworks/DocumentWindow/src/DocumentController.mm b/Frameworks/DocumentWindow/src/DocumentController.mm index b9c4c6c2..8b25353a 100644 --- a/Frameworks/DocumentWindow/src/DocumentController.mm +++ b/Frameworks/DocumentWindow/src/DocumentController.mm @@ -51,7 +51,7 @@ static BOOL IsInShouldTerminateEventLoop = NO; } @end -@interface DocumentController () +@interface DocumentController () @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(); - 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(); + 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 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 = // ========== diff --git a/Frameworks/OakAppKit/src/OakWindowFrameHelper.h b/Frameworks/OakAppKit/src/OakWindowFrameHelper.h index 1e6e7511..05c23c66 100644 --- a/Frameworks/OakAppKit/src/OakWindowFrameHelper.h +++ b/Frameworks/OakAppKit/src/OakWindowFrameHelper.h @@ -1,5 +1,9 @@ #import +@protocol OakWindowFrameHelperDelegate +- (NSRect)savableWindowFrame; +@end + PUBLIC @interface OakWindowFrameHelper : NSObject { OBJC_WATCH_LEAKS(OakWindowFrameHelper); diff --git a/Frameworks/OakAppKit/src/OakWindowFrameHelper.mm b/Frameworks/OakAppKit/src/OakWindowFrameHelper.mm index 104584a6..a56d011f 100644 --- a/Frameworks/OakAppKit/src/OakWindowFrameHelper.mm +++ b/Frameworks/OakAppKit/src/OakWindowFrameHelper.mm @@ -85,10 +85,17 @@ OAK_DEBUG_VAR(WindowFrameHelper); // = The Actual Logic = // ==================== +- (NSRect)windowFrame:(NSWindow*)aWindow +{ + if([[aWindow delegate] conformsToProtocol:@protocol(OakWindowFrameHelperDelegate)]) + return [(id )[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;