@interface PreferencesController : NSWindowController
-{
- IBOutlet NSToolbar* toolbar;
-
- NSView* blankView;
-
- IBOutlet NSView* generalPreferencesView;
- IBOutlet NSToolbarItem* generalPreferencesItem;
-
- IBOutlet NSView* pathsPreferencesView;
- IBOutlet NSToolbarItem* pathsPreferencesItem;
-}
+
+@property (strong) IBOutlet NSToolbar* toolbar;
+
+@property (strong) IBOutlet NSView* generalPreferencesView;
+@property (strong) IBOutlet NSToolbarItem* generalPreferencesItem;
+
+@property (strong) IBOutlet NSView* pathsPreferencesView;
+@property (strong) IBOutlet NSToolbarItem* pathsPreferencesItem;
- (void)showPreferencesWindow;
#import "PreferencesController.h"
-NSSize generalSize;
-NSSize pathsSize;
-
-@interface PreferencesController (Private)
-- (void)resizeWindowToSize:(NSSize)size;
-@end
-
-
-@implementation PreferencesController
+@implementation PreferencesController {
+ NSView* _blankView;
+}
/**
* Loads the NIB and shows the preferences
{
if (self = [super initWithWindowNibName:@"Preferences"])
{
- blankView = [[NSView alloc] init];
+ _blankView = [[NSView alloc] init];
}
return self;
}
-/**
- * Awake from nib
- */
-- (void)awakeFromNib
-{
- generalSize = [generalPreferencesView frame].size;
- pathsSize = [pathsPreferencesView frame].size;
-}
-
/**
* Shows the preferences controller window
*/
- (void)showPreferencesWindow
{
+ NSWindow* window = self.window; // Force the window to load.
[self showGeneral:self];
- [[self window] center];
- [[self window] makeKeyAndOrderFront:self];
+ [window center];
+ [window makeKeyAndOrderFront:self];
}
#pragma mark Panel Switching
*/
- (IBAction)showGeneral:(id)sender
{
- if ([[self window] contentView] == generalPreferencesView)
- return;
-
- [self resizeWindowToSize:generalSize];
-
- [[self window] setContentView:generalPreferencesView];
- [toolbar setSelectedItemIdentifier:[generalPreferencesItem itemIdentifier]];
+ [self _switchToView:self.generalPreferencesView forToolbarItem:self.generalPreferencesItem];
}
/**
*/
- (IBAction)showPaths:(id)sender
{
- if ([[self window] contentView] == pathsPreferencesView)
- return;
-
- [self resizeWindowToSize:pathsSize];
-
- [[self window] setContentView:pathsPreferencesView];
- [toolbar setSelectedItemIdentifier:[pathsPreferencesItem itemIdentifier]];
+ [self _switchToView:self.pathsPreferencesView forToolbarItem:self.pathsPreferencesItem];
}
#pragma mark NSToolbar Delegate
*/
- (NSArray*)toolbarSelectableItemIdentifiers:(NSToolbar*)toolbar
{
- return [NSArray arrayWithObjects:
- [generalPreferencesItem itemIdentifier],
- [pathsPreferencesItem itemIdentifier],
- nil
+ return @[
+ self.generalPreferencesItem.itemIdentifier,
+ self.pathsPreferencesItem.itemIdentifier,
];
}
#pragma mark Private
+- (void)_switchToView:(NSView*)contentView forToolbarItem:(NSToolbarItem*)item {
+ if (self.window.contentView == contentView)
+ return;
+ [self _resizeWindowToSize:contentView.frame.size];
+ self.window.contentView = contentView;
+ self.toolbar.selectedItemIdentifier = item.itemIdentifier;
+}
+
/**
* Resizes the preferences window to be the size of the given preferences panel
*/
-- (void)resizeWindowToSize:(NSSize)size
+- (void)_resizeWindowToSize:(NSSize)size
{
- [[self window] setContentView:blankView]; // don't want weird redraw artifacts
-
- NSRect newFrame;
-
- newFrame = [NSWindow contentRectForFrameRect:[[self window] frame] styleMask:[[self window] styleMask]];
-
- float height = size.height + 55;
-
+ // Hide the current view when animating, to avoid weird artifacts.
+ self.window.contentView = _blankView;
+
+ NSWindowStyleMask styleMask = self.window.styleMask;
+ NSRect newFrame = [NSWindow contentRectForFrameRect:self.window.frame styleMask:styleMask];
+
+ CGFloat height = size.height + 55;
newFrame.origin.y += newFrame.size.height;
newFrame.origin.y -= height;
newFrame.size.height = height;
newFrame.size.width = size.width;
-
- newFrame = [NSWindow frameRectForContentRect:newFrame styleMask:[[self window] styleMask]];
-
+
+ newFrame = [NSWindow frameRectForContentRect:newFrame styleMask:styleMask];
+
[[self window] setFrame:newFrame display:YES animate:YES];
}