Modernize PreferencesController.
authorRobert Sesek <rsesek@bluestatic.org>
Sat, 7 Dec 2019 22:07:28 +0000 (17:07 -0500)
committerRobert Sesek <rsesek@bluestatic.org>
Sun, 15 Dec 2019 17:07:48 +0000 (12:07 -0500)
Source/PreferencesController.h
Source/PreferencesController.m

index c996ed6747d028908f020235f1f0655adb425b91..9c37f1a571f4137604a50237c17b8662bdc71761 100644 (file)
 
 
 @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;
 
index 00ded801ca71a884b1ed7557ff5c58ca46d15d3d..dae6a8f1aaa3d31e0401efe70bea6cf891cf3198 100644 (file)
 
 #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
@@ -33,28 +27,20 @@ NSSize pathsSize;
 {
   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
@@ -64,13 +50,7 @@ NSSize pathsSize;
  */
 - (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];
 }
 
 /**
@@ -78,13 +58,7 @@ NSSize pathsSize;
  */
 - (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
@@ -94,35 +68,41 @@ NSSize pathsSize;
  */
 - (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];
 }