From df876e6a034d99fc0b13894c9914c20e28cbaeb4 Mon Sep 17 00:00:00 2001 From: Ya Mom Date: Sat, 27 Sep 2025 10:17:27 -0500 Subject: [PATCH] Add segmented control style (#6) Fixes #2 --- .../AdvancedPreferenceViewController.swift | 4 - Example/AdvancedPreferenceViewController.xib | 36 + Example/AppDelegate.swift | 53 +- Example/GeneralPreferenceViewController.swift | 18 + Example/GeneralPreferenceViewController.xib | 49 ++ Example/PreferencesStyle+UserDefaults.swift | 39 ++ Preferences.xcodeproj/project.pbxproj | 639 ++++++++++++++++++ Sources/Preferences/PreferencePane.swift | 46 ++ Sources/Preferences/PreferencesStyle.swift | 17 + .../PreferencesStyleController.swift | 16 + .../PreferencesTabViewController.swift | 177 +++++ .../PreferencesWindowController.swift | 70 ++ .../SegmentedControlStyleViewController.swift | 137 ++++ .../ToolbarItemStyleViewController.swift | 60 ++ .../UserInteractionPausableWindow.swift | 31 + Sources/Preferences/util.swift | 47 ++ screenshot.gif => images/screenshot.gif | Bin 3542001 -> 3541931 bytes images/segmented-control.png | Bin 0 -> 67470 bytes images/toolbar-item.png | Bin 0 -> 77705 bytes readme.md | 361 +++++++++- 20 files changed, 1727 insertions(+), 73 deletions(-) create mode 100644 Example/AdvancedPreferenceViewController.xib create mode 100644 Example/GeneralPreferenceViewController.swift create mode 100644 Example/GeneralPreferenceViewController.xib create mode 100644 Example/PreferencesStyle+UserDefaults.swift create mode 100644 Preferences.xcodeproj/project.pbxproj create mode 100644 Sources/Preferences/PreferencePane.swift create mode 100644 Sources/Preferences/PreferencesStyle.swift create mode 100644 Sources/Preferences/PreferencesStyleController.swift create mode 100644 Sources/Preferences/PreferencesTabViewController.swift create mode 100644 Sources/Preferences/PreferencesWindowController.swift create mode 100644 Sources/Preferences/SegmentedControlStyleViewController.swift create mode 100644 Sources/Preferences/ToolbarItemStyleViewController.swift create mode 100644 Sources/Preferences/UserInteractionPausableWindow.swift create mode 100644 Sources/Preferences/util.swift rename screenshot.gif => images/screenshot.gif (99%) create mode 100644 images/segmented-control.png create mode 100644 images/toolbar-item.png diff --git a/Example/AdvancedPreferenceViewController.swift b/Example/AdvancedPreferenceViewController.swift index 59b47f2..da26abb 100644 --- a/Example/AdvancedPreferenceViewController.swift +++ b/Example/AdvancedPreferenceViewController.swift @@ -1,10 +1,6 @@ import Cocoa import Settings -final class AdvancedSettingsViewController: NSViewController, SettingsPane { - let paneIdentifier = Settings.PaneIdentifier.advanced - let paneTitle = "Advanced" - let toolbarItemIcon = NSImage(systemSymbolName: "gearshape.2", accessibilityDescription: "Advanced settings")! @IBOutlet private var fontLabel: NSTextField! private var font = NSFont.systemFont(ofSize: 14) diff --git a/Example/AdvancedPreferenceViewController.xib b/Example/AdvancedPreferenceViewController.xib new file mode 100644 index 0000000..bf28927 --- /dev/null +++ b/Example/AdvancedPreferenceViewController.xib @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/AppDelegate.swift b/Example/AppDelegate.swift index a93e8a5..424c0b5 100644 --- a/Example/AppDelegate.swift +++ b/Example/AppDelegate.swift @@ -1,55 +1,28 @@ import Cocoa import Settings -extension Settings.PaneIdentifier { - static let general = Self("general") - static let accounts = Self("accounts") - static let advanced = Self("advanced") -} - -@main -final class AppDelegate: NSObject, NSApplicationDelegate { - @IBOutlet private var window: NSWindow! - - private var settingsStyle: Settings.Style { - get { .settingsStyleFromUserDefaults() } - set { - newValue.storeInUserDefaults() - } - } - - private lazy var panes: [SettingsPane] = [ - GeneralSettingsViewController(), - AccountsSettingsViewController(), - AdvancedSettingsViewController() - ] - - private lazy var settingsWindowController = SettingsWindowController( - panes: panes, - style: settingsStyle, - animated: true, - hidesToolbarForSingleItem: true - ) func applicationWillFinishLaunching(_ notification: Notification) { window.orderOut(self) } func applicationDidFinishLaunching(_ notification: Notification) { - settingsWindowController.show(pane: .accounts) - } - - @IBAction private func settingsMenuItemActionHandler(_ sender: NSMenuItem) { - settingsWindowController.show() } @IBAction private func switchStyle(_ sender: Any) { - settingsStyle = settingsStyle == .segmentedControl - ? .toolbarItems + self.preferencesStyle = (self.preferencesStyle == .segmentedControl) + ? .toolbarItems : .segmentedControl - - Task { - try! await NSApp.relaunch() // swiftlint:disable:this force_try - } + relaunch() } } + +private func relaunch() { + let appBundleIdentifier = Bundle.main.bundleIdentifier! + NSWorkspace.shared.launchApplication( + withBundleIdentifier: appBundleIdentifier, + options: NSWorkspace.LaunchOptions.newInstance, + additionalEventParamDescriptor: nil, + launchIdentifier: nil) + NSApp.terminate(nil) +} diff --git a/Example/GeneralPreferenceViewController.swift b/Example/GeneralPreferenceViewController.swift new file mode 100644 index 0000000..39d7732 --- /dev/null +++ b/Example/GeneralPreferenceViewController.swift @@ -0,0 +1,18 @@ +import Cocoa +import Preferences + +final class GeneralPreferenceViewController: NSViewController, PreferencePane { + let preferencePaneIdentifier: PreferencePaneIdentifier = .general + let toolbarItemTitle = "General" + let toolbarItemIcon = NSImage(named: NSImage.preferencesGeneralName)! + + override var nibName: NSNib.Name? { + return "GeneralPreferenceViewController" + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Setup stuff here + } +} diff --git a/Example/GeneralPreferenceViewController.xib b/Example/GeneralPreferenceViewController.xib new file mode 100644 index 0000000..a27daf9 --- /dev/null +++ b/Example/GeneralPreferenceViewController.xib @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/PreferencesStyle+UserDefaults.swift b/Example/PreferencesStyle+UserDefaults.swift new file mode 100644 index 0000000..dbc9ec2 --- /dev/null +++ b/Example/PreferencesStyle+UserDefaults.swift @@ -0,0 +1,39 @@ +import Foundation +import Preferences + +// Helpers to write styles to and read them from UserDefaults. + +extension PreferencesStyle: RawRepresentable { + public var rawValue: Int { + switch self { + case .toolbarItems: + return 0 + case .segmentedControl: + return 1 + } + } + + public init?(rawValue: Int) { + switch rawValue { + case 0: + self = .toolbarItems + case 1: + self = .segmentedControl + default: + return nil + } + } +} + +extension PreferencesStyle { + static var userDefaultsKey: String { return "preferencesStyle" } + + static func preferencesStyleFromUserDefaults(_ userDefaults: UserDefaults = .standard) -> PreferencesStyle { + return PreferencesStyle(rawValue: userDefaults.integer(forKey: PreferencesStyle.userDefaultsKey)) + ?? .toolbarItems + } + + func storeInUserDefaults(_ userDefaults: UserDefaults = .standard) { + userDefaults.set(self.rawValue, forKey: PreferencesStyle.userDefaultsKey) + } +} diff --git a/Preferences.xcodeproj/project.pbxproj b/Preferences.xcodeproj/project.pbxproj new file mode 100644 index 0000000..415ad6d --- /dev/null +++ b/Preferences.xcodeproj/project.pbxproj @@ -0,0 +1,639 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 51; + objects = { + +/* Begin PBXBuildFile section */ + 5006F25B22534BE9005F506C /* UserInteractionPausableWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5006F25A22534BE9005F506C /* UserInteractionPausableWindow.swift */; }; + 502B68E72254947B00789D9F /* PreferencesStyle+UserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502B68E52254944600789D9F /* PreferencesStyle+UserDefaults.swift */; }; + 509EC81C22535E0A00760A3C /* PreferencesStyleController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 509EC81B22535E0A00760A3C /* PreferencesStyleController.swift */; }; + 50A412F42196B70100E4A5A8 /* PreferencesStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A412F32196B70100E4A5A8 /* PreferencesStyle.swift */; }; + 50A412F62196E87900E4A5A8 /* SegmentedControlStyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A412F52196E87900E4A5A8 /* SegmentedControlStyleViewController.swift */; }; + 50A412F82196EAF200E4A5A8 /* ToolbarItemStyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A412F72196EAF200E4A5A8 /* ToolbarItemStyleViewController.swift */; }; + E34E9EEA20E6149B002F8F86 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34E9EE920E6149B002F8F86 /* AppDelegate.swift */; }; + E34E9EEC20E6149D002F8F86 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E34E9EEB20E6149D002F8F86 /* Assets.xcassets */; }; + E34E9EEF20E6149D002F8F86 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = E34E9EED20E6149D002F8F86 /* MainMenu.xib */; }; + E34E9EF520E61507002F8F86 /* Preferences.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "Preferences::Preferences::Product" /* Preferences.framework */; }; + E34E9EF620E61507002F8F86 /* Preferences.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = "Preferences::Preferences::Product" /* Preferences.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E34E9EFB20E61557002F8F86 /* PreferencePane.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34E9EFA20E61557002F8F86 /* PreferencePane.swift */; }; + E34E9EFF20E617E7002F8F86 /* GeneralPreferenceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34E9EFE20E617E7002F8F86 /* GeneralPreferenceViewController.swift */; }; + E34E9F0120E61A26002F8F86 /* GeneralPreferenceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E34E9F0020E61A26002F8F86 /* GeneralPreferenceViewController.xib */; }; + E34E9F0320E61BC0002F8F86 /* AdvancedPreferenceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34E9F0220E61BC0002F8F86 /* AdvancedPreferenceViewController.swift */; }; + E34E9F0520E61C06002F8F86 /* AdvancedPreferenceViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E34E9F0420E61C06002F8F86 /* AdvancedPreferenceViewController.xib */; }; + E34E9F0820E62743002F8F86 /* PreferencesTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34E9F0620E62627002F8F86 /* PreferencesTabViewController.swift */; }; + OBJ_19 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_9 /* PreferencesWindowController.swift */; }; + OBJ_20 /* util.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* util.swift */; }; + OBJ_27 /* Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_6 /* Package.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + E34E9EF720E61507002F8F86 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = OBJ_1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = "Preferences::Preferences"; + remoteInfo = Preferences; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + E34E9EF920E61508002F8F86 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + E34E9EF620E61507002F8F86 /* Preferences.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 5006F25A22534BE9005F506C /* UserInteractionPausableWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserInteractionPausableWindow.swift; sourceTree = ""; }; + 502B68E52254944600789D9F /* PreferencesStyle+UserDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PreferencesStyle+UserDefaults.swift"; sourceTree = ""; }; + 509EC81B22535E0A00760A3C /* PreferencesStyleController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesStyleController.swift; sourceTree = ""; }; + 50A412F32196B70100E4A5A8 /* PreferencesStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesStyle.swift; sourceTree = ""; }; + 50A412F52196E87900E4A5A8 /* SegmentedControlStyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegmentedControlStyleViewController.swift; sourceTree = ""; }; + 50A412F72196EAF200E4A5A8 /* ToolbarItemStyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToolbarItemStyleViewController.swift; sourceTree = ""; }; + E34E9EE720E6149B002F8F86 /* PreferencesExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PreferencesExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + E34E9EE920E6149B002F8F86 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AppDelegate.swift; sourceTree = ""; usesTabs = 1; }; + E34E9EEB20E6149D002F8F86 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E34E9EEE20E6149D002F8F86 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + E34E9EF020E6149D002F8F86 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E34E9EFA20E61557002F8F86 /* PreferencePane.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = PreferencePane.swift; sourceTree = ""; usesTabs = 1; }; + E34E9EFE20E617E7002F8F86 /* GeneralPreferenceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralPreferenceViewController.swift; sourceTree = ""; }; + E34E9F0020E61A26002F8F86 /* GeneralPreferenceViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GeneralPreferenceViewController.xib; sourceTree = ""; }; + E34E9F0220E61BC0002F8F86 /* AdvancedPreferenceViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = AdvancedPreferenceViewController.swift; sourceTree = ""; usesTabs = 1; }; + E34E9F0420E61C06002F8F86 /* AdvancedPreferenceViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AdvancedPreferenceViewController.xib; sourceTree = ""; }; + E34E9F0620E62627002F8F86 /* PreferencesTabViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = PreferencesTabViewController.swift; sourceTree = ""; usesTabs = 1; }; + OBJ_10 /* util.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = util.swift; sourceTree = ""; usesTabs = 1; }; + OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = Package.swift; sourceTree = ""; usesTabs = 1; }; + OBJ_9 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = PreferencesWindowController.swift; sourceTree = ""; usesTabs = 1; }; + "Preferences::Preferences::Product" /* Preferences.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Preferences.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + E34E9EE420E6149B002F8F86 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E34E9EF520E61507002F8F86 /* Preferences.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + OBJ_21 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + E34E9EE820E6149B002F8F86 /* Example */ = { + isa = PBXGroup; + children = ( + E34E9EE920E6149B002F8F86 /* AppDelegate.swift */, + 502B68E52254944600789D9F /* PreferencesStyle+UserDefaults.swift */, + E34E9EED20E6149D002F8F86 /* MainMenu.xib */, + E34E9EFE20E617E7002F8F86 /* GeneralPreferenceViewController.swift */, + E34E9F0020E61A26002F8F86 /* GeneralPreferenceViewController.xib */, + E34E9F0220E61BC0002F8F86 /* AdvancedPreferenceViewController.swift */, + E34E9F0420E61C06002F8F86 /* AdvancedPreferenceViewController.xib */, + E34E9EEB20E6149D002F8F86 /* Assets.xcassets */, + E34E9EF020E6149D002F8F86 /* Info.plist */, + ); + path = Example; + sourceTree = ""; + }; + OBJ_12 /* Products */ = { + isa = PBXGroup; + children = ( + "Preferences::Preferences::Product" /* Preferences.framework */, + E34E9EE720E6149B002F8F86 /* PreferencesExample.app */, + ); + name = Products; + sourceTree = BUILT_PRODUCTS_DIR; + }; + OBJ_5 = { + isa = PBXGroup; + children = ( + OBJ_6 /* Package.swift */, + OBJ_7 /* Sources */, + E34E9EE820E6149B002F8F86 /* Example */, + OBJ_12 /* Products */, + ); + sourceTree = ""; + }; + OBJ_7 /* Sources */ = { + isa = PBXGroup; + children = ( + OBJ_8 /* Preferences */, + ); + name = Sources; + sourceTree = SOURCE_ROOT; + }; + OBJ_8 /* Preferences */ = { + isa = PBXGroup; + children = ( + E34E9EFA20E61557002F8F86 /* PreferencePane.swift */, + 50A412F32196B70100E4A5A8 /* PreferencesStyle.swift */, + OBJ_9 /* PreferencesWindowController.swift */, + 5006F25A22534BE9005F506C /* UserInteractionPausableWindow.swift */, + E34E9F0620E62627002F8F86 /* PreferencesTabViewController.swift */, + 509EC81B22535E0A00760A3C /* PreferencesStyleController.swift */, + 50A412F52196E87900E4A5A8 /* SegmentedControlStyleViewController.swift */, + 50A412F72196EAF200E4A5A8 /* ToolbarItemStyleViewController.swift */, + OBJ_10 /* util.swift */, + ); + name = Preferences; + path = Sources/Preferences; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E34E9EE620E6149B002F8F86 /* PreferencesExample */ = { + isa = PBXNativeTarget; + buildConfigurationList = E34E9EF220E6149D002F8F86 /* Build configuration list for PBXNativeTarget "PreferencesExample" */; + buildPhases = ( + E34E9EE320E6149B002F8F86 /* Sources */, + E34E9EE420E6149B002F8F86 /* Frameworks */, + E34E9EE520E6149B002F8F86 /* Resources */, + E34E9EF920E61508002F8F86 /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + E34E9EF820E61507002F8F86 /* PBXTargetDependency */, + ); + name = PreferencesExample; + productName = PreferencesExample; + productReference = E34E9EE720E6149B002F8F86 /* PreferencesExample.app */; + productType = "com.apple.product-type.application"; + }; + "Preferences::Preferences" /* Preferences */ = { + isa = PBXNativeTarget; + buildConfigurationList = OBJ_15 /* Build configuration list for PBXNativeTarget "Preferences" */; + buildPhases = ( + E3BFC67821FBBC8B00C16B1A /* SwiftLint */, + OBJ_18 /* Sources */, + OBJ_21 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Preferences; + productName = Preferences; + productReference = "Preferences::Preferences::Product" /* Preferences.framework */; + productType = "com.apple.product-type.framework"; + }; + "Preferences::SwiftPMPackageDescription" /* PreferencesPackageDescription */ = { + isa = PBXNativeTarget; + buildConfigurationList = OBJ_23 /* Build configuration list for PBXNativeTarget "PreferencesPackageDescription" */; + buildPhases = ( + OBJ_26 /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PreferencesPackageDescription; + productName = PreferencesPackageDescription; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + OBJ_1 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0940; + LastUpgradeCheck = 0940; + TargetAttributes = { + E34E9EE620E6149B002F8F86 = { + CreatedOnToolsVersion = 9.4.1; + LastSwiftMigration = 1020; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 0; + }; + }; + }; + "Preferences::Preferences" = { + LastSwiftMigration = 1020; + }; + }; + }; + buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "Preferences" */; + compatibilityVersion = "Xcode 10.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = OBJ_5; + productRefGroup = OBJ_12 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + "Preferences::Preferences" /* Preferences */, + "Preferences::SwiftPMPackageDescription" /* PreferencesPackageDescription */, + E34E9EE620E6149B002F8F86 /* PreferencesExample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + E34E9EE520E6149B002F8F86 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E34E9EEC20E6149D002F8F86 /* Assets.xcassets in Resources */, + E34E9F0520E61C06002F8F86 /* AdvancedPreferenceViewController.xib in Resources */, + E34E9EEF20E6149D002F8F86 /* MainMenu.xib in Resources */, + E34E9F0120E61A26002F8F86 /* GeneralPreferenceViewController.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + E3BFC67821FBBC8B00C16B1A /* SwiftLint */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = SwiftLint; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed\"\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + E34E9EE320E6149B002F8F86 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E34E9EFF20E617E7002F8F86 /* GeneralPreferenceViewController.swift in Sources */, + E34E9EEA20E6149B002F8F86 /* AppDelegate.swift in Sources */, + E34E9F0320E61BC0002F8F86 /* AdvancedPreferenceViewController.swift in Sources */, + 502B68E72254947B00789D9F /* PreferencesStyle+UserDefaults.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + OBJ_18 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 0; + files = ( + 509EC81C22535E0A00760A3C /* PreferencesStyleController.swift in Sources */, + OBJ_19 /* PreferencesWindowController.swift in Sources */, + E34E9F0820E62743002F8F86 /* PreferencesTabViewController.swift in Sources */, + 5006F25B22534BE9005F506C /* UserInteractionPausableWindow.swift in Sources */, + 50A412F82196EAF200E4A5A8 /* ToolbarItemStyleViewController.swift in Sources */, + 50A412F62196E87900E4A5A8 /* SegmentedControlStyleViewController.swift in Sources */, + 50A412F42196B70100E4A5A8 /* PreferencesStyle.swift in Sources */, + E34E9EFB20E61557002F8F86 /* PreferencePane.swift in Sources */, + OBJ_20 /* util.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + OBJ_26 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 0; + files = ( + OBJ_27 /* Package.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + E34E9EF820E61507002F8F86 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = "Preferences::Preferences" /* Preferences */; + targetProxy = E34E9EF720E61507002F8F86 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + E34E9EED20E6149D002F8F86 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + E34E9EEE20E6149D002F8F86 /* Base */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + E34E9EF320E6149D002F8F86 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = Example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.sindresorhus.PreferencesExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + E34E9EF420E6149D002F8F86 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = ""; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = Example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = com.sindresorhus.PreferencesExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + OBJ_16 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = YG56YK5RN5; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + ); + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Preferences.xcodeproj/Preferences_Info.plist; + OTHER_CFLAGS = "$(inherited)"; + OTHER_LDFLAGS = "$(inherited)"; + OTHER_SWIFT_FLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = Preferences; + PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGET_NAME = Preferences; + }; + name = Debug; + }; + OBJ_17 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = YG56YK5RN5; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + ); + HEADER_SEARCH_PATHS = "$(inherited)"; + INFOPLIST_FILE = Preferences.xcodeproj/Preferences_Info.plist; + OTHER_CFLAGS = "$(inherited)"; + OTHER_LDFLAGS = "$(inherited)"; + OTHER_SWIFT_FLAGS = "$(inherited)"; + PRODUCT_BUNDLE_IDENTIFIER = Preferences; + PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SKIP_INSTALL = YES; + SWIFT_VERSION = 5.0; + TARGET_NAME = Preferences; + }; + name = Release; + }; + OBJ_24 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD = /usr/bin/true; + OTHER_SWIFT_FLAGS = "-swift-version 4 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + OBJ_25 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + LD = /usr/bin/true; + OTHER_SWIFT_FLAGS = "-swift-version 4 -I $(TOOLCHAIN_DIR)/usr/lib/swift/pm/4 -target x86_64-apple-macosx10.10 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk"; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; + OBJ_3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_NS_ASSERTIONS = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + ONLY_ACTIVE_ARCH = YES; + OTHER_SWIFT_FLAGS = "-DXcode"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + USE_HEADERMAP = NO; + VALID_ARCHS = x86_64; + }; + name = Debug; + }; + OBJ_4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = s; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + OTHER_SWIFT_FLAGS = "-DXcode"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + USE_HEADERMAP = NO; + VALID_ARCHS = x86_64; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + E34E9EF220E6149D002F8F86 /* Build configuration list for PBXNativeTarget "PreferencesExample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E34E9EF320E6149D002F8F86 /* Debug */, + E34E9EF420E6149D002F8F86 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + OBJ_15 /* Build configuration list for PBXNativeTarget "Preferences" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + OBJ_16 /* Debug */, + OBJ_17 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + OBJ_2 /* Build configuration list for PBXProject "Preferences" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + OBJ_3 /* Debug */, + OBJ_4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + OBJ_23 /* Build configuration list for PBXNativeTarget "PreferencesPackageDescription" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + OBJ_24 /* Debug */, + OBJ_25 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = OBJ_1 /* Project object */; +} diff --git a/Sources/Preferences/PreferencePane.swift b/Sources/Preferences/PreferencePane.swift new file mode 100644 index 0000000..357d5fb --- /dev/null +++ b/Sources/Preferences/PreferencePane.swift @@ -0,0 +1,46 @@ +import Cocoa + +public struct PreferencePaneIdentifier: Equatable, RawRepresentable { + public let rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} + +public protocol PreferencePane: AnyObject { + var preferencePaneIdentifier: PreferencePaneIdentifier { get } + var toolbarItemTitle: String { get } + var toolbarItemIcon: NSImage { get } + var viewController: NSViewController { get } +} + +extension PreferencePane where Self: NSViewController { + public var viewController: NSViewController { + return self + } +} + +extension PreferencePane { + public var toolbarItemIdentifier: NSToolbarItem.Identifier { + return preferencePaneIdentifier.toolbarItemIdentifier + } + + public var toolbarItemIcon: NSImage { + return NSImage(size: .zero) + } +} + +extension PreferencePaneIdentifier { + public init(_ rawValue: String) { + self.init(rawValue: rawValue) + } + + public init(fromToolbarItemIdentifier itemIdentifier: NSToolbarItem.Identifier) { + self.init(rawValue: itemIdentifier.rawValue) + } + + public var toolbarItemIdentifier: NSToolbarItem.Identifier { + return NSToolbarItem.Identifier(rawValue) + } +} diff --git a/Sources/Preferences/PreferencesStyle.swift b/Sources/Preferences/PreferencesStyle.swift new file mode 100644 index 0000000..6d33ec4 --- /dev/null +++ b/Sources/Preferences/PreferencesStyle.swift @@ -0,0 +1,17 @@ +import Cocoa + +public enum PreferencesStyle { + case toolbarItems + case segmentedControl +} + +extension PreferencesStyle { + var windowTitleVisibility: NSWindow.TitleVisibility { + switch self { + case .toolbarItems: + return .visible + case .segmentedControl: + return .hidden + } + } +} diff --git a/Sources/Preferences/PreferencesStyleController.swift b/Sources/Preferences/PreferencesStyleController.swift new file mode 100644 index 0000000..3342081 --- /dev/null +++ b/Sources/Preferences/PreferencesStyleController.swift @@ -0,0 +1,16 @@ +import Cocoa + +protocol PreferencesStyleController: AnyObject { + var delegate: PreferencesStyleControllerDelegate? { get set } + var isKeepingWindowCentered: Bool { get } + + func toolbarItemIdentifiers() -> [NSToolbarItem.Identifier] + func toolbarItem(preferenceIdentifier: PreferencePaneIdentifier) -> NSToolbarItem? + + func selectTab(index: Int) +} + +protocol PreferencesStyleControllerDelegate: AnyObject { + func activateTab(preferenceIdentifier: PreferencePaneIdentifier?, animated: Bool) + func activateTab(index: Int, animated: Bool) +} diff --git a/Sources/Preferences/PreferencesTabViewController.swift b/Sources/Preferences/PreferencesTabViewController.swift new file mode 100644 index 0000000..58c6d73 --- /dev/null +++ b/Sources/Preferences/PreferencesTabViewController.swift @@ -0,0 +1,177 @@ +import Cocoa + +final class PreferencesTabViewController: NSViewController, PreferencesStyleControllerDelegate { + private var activeTab: Int! + private var preferencePanes: [PreferencePane] = [] + + private var preferencesStyleController: PreferencesStyleController! + + private var isKeepingWindowCentered: Bool { + return preferencesStyleController.isKeepingWindowCentered + } + + private var toolbarItemIdentifiers: [NSToolbarItem.Identifier] { + return preferencesStyleController?.toolbarItemIdentifiers() ?? [] + } + + var window: NSWindow! { + return view.window + } + + var isAnimated: Bool = true + + override func loadView() { + self.view = NSView() + self.view.translatesAutoresizingMaskIntoConstraints = false + } + + func configure(preferencePanes: [PreferencePane]) { + self.preferencePanes = preferencePanes + self.children = preferencePanes.map { $0.viewController } + } + + func changePreferencesStyle(to newStyle: PreferencesStyle) { + changePreferencesStyleController(preferences: self.preferencePanes, style: newStyle) + } + + private func changePreferencesStyleController(preferences: [PreferencePane], style: PreferencesStyle) { + let toolbar = NSToolbar(identifier: "PreferencesToolbar") + toolbar.allowsUserCustomization = false + toolbar.displayMode = .iconAndLabel + toolbar.showsBaselineSeparator = true + toolbar.delegate = self + + switch style { + case .segmentedControl: + self.preferencesStyleController = SegmentedControlStyleViewController(preferences: preferences) + case .toolbarItems: + self.preferencesStyleController = ToolbarItemStyleViewController(preferences: preferences, toolbar: toolbar, centerToolbarItems: false) + } + self.preferencesStyleController.delegate = self + + self.window.toolbar = toolbar // Call latest so that preferencesStyleController can be asked for items + } + + func activateTab(preference: PreferencePane?, animated: Bool) { + guard let preference = preference else { + return activateTab(index: 0, animated: animated) + } + activateTab(preferenceIdentifier: preference.preferencePaneIdentifier, animated: animated) + } + + func activateTab(preferenceIdentifier: PreferencePaneIdentifier?, animated: Bool) { + guard let preferenceIdentifier = preferenceIdentifier, + let index = preferencePanes.firstIndex(where: { $0.preferencePaneIdentifier == preferenceIdentifier }) + else { return activateTab(index: 0, animated: animated) } + activateTab(index: index, animated: animated) + } + + func activateTab(index: Int, animated: Bool) { + defer { + activeTab = index + preferencesStyleController.selectTab(index: index) + } + + if self.activeTab == nil { + immediatelyDisplayTab(index: index) + } else { + guard index != activeTab else { + return + } + animateTabTransition(index: index, animated: animated) + } + } + + /// Cached constraints that pin childViewController views to the content view + private var activeChildViewConstraints: [NSLayoutConstraint] = [] + + private func immediatelyDisplayTab(index: Int) { + let toViewController = children[index] + view.addSubview(toViewController.view) + activeChildViewConstraints = toViewController.view.constrainToSuperviewBounds() + setWindowFrame(for: toViewController, animated: false) + } + + private func animateTabTransition(index: Int, animated: Bool) { + let fromViewController = children[activeTab] + let toViewController = children[index] + let options: NSViewController.TransitionOptions = animated && isAnimated + ? [.crossfade] + : [] + + view.removeConstraints(activeChildViewConstraints) + + transition( + from: fromViewController, + to: toViewController, + options: options) { + self.activeChildViewConstraints = toViewController.view.constrainToSuperviewBounds() + } + } + + override func transition(from fromViewController: NSViewController, to toViewController: NSViewController, options: NSViewController.TransitionOptions = [], completionHandler completion: (() -> Void)? = nil) { + let isAnimated = options + .intersection([.crossfade, .slideUp, .slideDown, .slideForward, .slideBackward, .slideLeft, .slideRight]) + .isEmpty == false + + if isAnimated { + NSAnimationContext.runAnimationGroup({ context in + context.allowsImplicitAnimation = true + context.duration = 0.25 + context.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) + setWindowFrame(for: toViewController, animated: true) + super.transition(from: fromViewController, to: toViewController, options: options, completionHandler: completion) + }, completionHandler: nil) + } else { + super.transition(from: fromViewController, to: toViewController, options: options, completionHandler: completion) + } + } + + private func setWindowFrame(for viewController: NSViewController, animated: Bool = false) { + guard let window = window else { preconditionFailure() } + let contentSize = viewController.view.fittingSize + + let newWindowSize = window.frameRect(forContentRect: CGRect(origin: .zero, size: contentSize)).size + var frame = window.frame + frame.origin.y += frame.height - newWindowSize.height + frame.size = newWindowSize + + if isKeepingWindowCentered { + let horizontalDiff = (window.frame.width - newWindowSize.width) / 2.0 + frame.origin.x += horizontalDiff + } + + let animatableWindow = animated ? window.animator() : window + animatableWindow.setFrame(frame, display: false) + } +} + +extension PreferencesTabViewController: NSToolbarDelegate { + func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { + return toolbarItemIdentifiers + } + + func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { + return toolbarItemIdentifiers + } + + func toolbarSelectableItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { + return toolbarItemIdentifiers + } + + public func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { + if itemIdentifier == .flexibleSpace { + return nil + } + + return preferencesStyleController.toolbarItem(preferenceIdentifier: PreferencePaneIdentifier(fromToolbarItemIdentifier: itemIdentifier)) + } +} + +extension NSWindow { + var effectiveMinSize: NSSize { + return (contentMinSize != .zero) + ? frameRect(forContentRect: NSRect(origin: .zero, size: contentMinSize)).size + : minSize + } +} diff --git a/Sources/Preferences/PreferencesWindowController.swift b/Sources/Preferences/PreferencesWindowController.swift new file mode 100644 index 0000000..c291813 --- /dev/null +++ b/Sources/Preferences/PreferencesWindowController.swift @@ -0,0 +1,70 @@ +import Cocoa + +public final class PreferencesWindowController: NSWindowController { + private let tabViewController = PreferencesTabViewController() + + public var isAnimated: Bool { + get { + return tabViewController.isAnimated + } + set { + tabViewController.isAnimated = newValue + } + } + + public init(preferencePanes: [PreferencePane], style: PreferencesStyle = .toolbarItems, animated: Bool = true) { + precondition(!preferencePanes.isEmpty, "You need to set at least one view controller") + + let window = UserInteractionPausableWindow( + contentRect: preferencePanes[0].viewController.view.bounds, + styleMask: [ + .titled, + .closable + ], + backing: .buffered, + defer: true + ) + super.init(window: window) + + window.title = String(System.localizedString(forKey: "Preferences…").dropLast()) + window.contentViewController = tabViewController + tabViewController.isAnimated = animated + tabViewController.configure(preferencePanes: preferencePanes) + changePreferencesStyle(to: style) + } + + @available(*, unavailable) + override public init(window: NSWindow?) { + fatalError("init(window:) is not supported, use init(preferences:style:animated:)") + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("init(coder:) is not supported, use init(preferences:style:animated:)") + } + + private func changePreferencesStyle(to newStyle: PreferencesStyle) { + window?.titleVisibility = newStyle.windowTitleVisibility + tabViewController.changePreferencesStyle(to: newStyle) + } + + /// Show the preferences window and brings it to front. + /// + /// If you pass a `PreferencePaneIdentifier`, the window will activate the corresponding tab. + /// + /// - Note: Unless you need to open a specific pane, prefer not to pass a parameter at all + /// - Parameter preferencePane: Identifier of the preference pane to display. + public func show(preferencePane preferenceIdentifier: PreferencePaneIdentifier? = nil) { + if !window!.isVisible { + window?.center() + } + + showWindow(self) + tabViewController.activateTab(preferenceIdentifier: preferenceIdentifier, animated: false) + NSApp.activate(ignoringOtherApps: true) + } + + public func hideWindow() { + close() + } +} diff --git a/Sources/Preferences/SegmentedControlStyleViewController.swift b/Sources/Preferences/SegmentedControlStyleViewController.swift new file mode 100644 index 0000000..e1f9361 --- /dev/null +++ b/Sources/Preferences/SegmentedControlStyleViewController.swift @@ -0,0 +1,137 @@ +import Cocoa + +extension NSToolbarItem.Identifier { + static var toolbarSegmentedControlItem: NSToolbarItem.Identifier { + return NSToolbarItem.Identifier(rawValue: "toolbarSegmentedControlItem") + } +} + +extension NSUserInterfaceItemIdentifier { + static var toolbarSegmentedControl: NSUserInterfaceItemIdentifier { + return NSUserInterfaceItemIdentifier(rawValue: "toolbarSegmentedControl") + } +} + +final class SegmentedControlStyleViewController: NSViewController, PreferencesStyleController { + var segmentedControl: NSSegmentedControl! { + get { + return view as? NSSegmentedControl + } + set { + view = newValue + } + } + + var isKeepingWindowCentered: Bool { + return true + } + + weak var delegate: PreferencesStyleControllerDelegate? + + private var preferences: [PreferencePane]! + + required init(preferences: [PreferencePane]) { + super.init(nibName: nil, bundle: nil) + self.preferences = preferences + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + self.view = createSegmentedControl(preferences: self.preferences) + } + + fileprivate func createSegmentedControl(preferences: [PreferencePane]) -> NSSegmentedControl { + let segmentedControl = NSSegmentedControl() + segmentedControl.segmentCount = preferences.count + segmentedControl.segmentStyle = .texturedSquare + segmentedControl.target = self + segmentedControl.action = #selector(SegmentedControlStyleViewController.segmentedControlAction(_:)) + segmentedControl.identifier = .toolbarSegmentedControl + + if let cell = segmentedControl.cell as? NSSegmentedCell { + cell.controlSize = .regular + cell.trackingMode = .selectOne + } + + let segmentSize: NSSize = { + let insets = NSSize(width: 36, height: 12) + var maxSize = NSSize(width: 0, height: 0) + + for preference in preferences { + let title = preference.toolbarItemTitle + let titleSize = title.size(withAttributes: [.font: NSFont.systemFont(ofSize: NSFont.systemFontSize(for: .regular))]) + + maxSize = NSSize(width: max(titleSize.width, maxSize.width), + height: max(titleSize.height, maxSize.height)) + } + + return NSSize(width: maxSize.width + insets.width, + height: maxSize.height + insets.height) + }() + + let segmentBorderWidth = CGFloat(preferences.count) + 1.0 + let segmentWidth = segmentSize.width * CGFloat(preferences.count) + segmentBorderWidth + let segmentHeight = segmentSize.height + segmentedControl.frame = NSRect(x: 0, y: 0, width: segmentWidth, height: segmentHeight) + + for (index, preference) in preferences.enumerated() { + segmentedControl.setLabel(preference.toolbarItemTitle, forSegment: index) + segmentedControl.setWidth(segmentSize.width, forSegment: index) + if let cell = segmentedControl.cell as? NSSegmentedCell { + cell.setTag(index, forSegment: index) + } + } + + return segmentedControl + } + + @IBAction private func segmentedControlAction(_ control: NSSegmentedControl) { + delegate?.activateTab(index: control.selectedSegment, animated: true) + } + + func selectTab(index: Int) { + segmentedControl.selectedSegment = index + } + + func toolbarItemIdentifiers() -> [NSToolbarItem.Identifier] { + return [ + .flexibleSpace, + .toolbarSegmentedControlItem, + .flexibleSpace + ] + } + + func toolbarItem(preferenceIdentifier: PreferencePaneIdentifier) -> NSToolbarItem? { + let toolbarItemIdentifier = preferenceIdentifier.toolbarItemIdentifier + precondition(toolbarItemIdentifier == .toolbarSegmentedControlItem) + + // When the segments outgrow the window, we need to provide a group of + // NSToolbarItems with custom menu item labels and action handling for the + // context menu that pops up at the right edge of the window. + let toolbarItemGroup = NSToolbarItemGroup(itemIdentifier: toolbarItemIdentifier) + toolbarItemGroup.view = segmentedControl + toolbarItemGroup.subitems = preferences.enumerated().map { index, preferenceable -> NSToolbarItem in + let item = NSToolbarItem(itemIdentifier: .init(rawValue: "segment-\(preferenceable.toolbarItemTitle)")) + item.label = preferenceable.toolbarItemTitle + + let menuItem = NSMenuItem( + title: preferenceable.toolbarItemTitle, + action: #selector(segmentedControlMenuAction(_:)), + keyEquivalent: "") + menuItem.tag = index + menuItem.target = self + item.menuFormRepresentation = menuItem + + return item + } + return toolbarItemGroup + } + + @IBAction private func segmentedControlMenuAction(_ menuItem: NSMenuItem) { + delegate?.activateTab(index: menuItem.tag, animated: true) + } +} diff --git a/Sources/Preferences/ToolbarItemStyleViewController.swift b/Sources/Preferences/ToolbarItemStyleViewController.swift new file mode 100644 index 0000000..1d25f17 --- /dev/null +++ b/Sources/Preferences/ToolbarItemStyleViewController.swift @@ -0,0 +1,60 @@ +import Cocoa + +final class ToolbarItemStyleViewController: NSObject, PreferencesStyleController { + let toolbar: NSToolbar + let centerToolbarItems: Bool + let preferences: [PreferencePane] + + var isKeepingWindowCentered: Bool { + return centerToolbarItems + } + + weak var delegate: PreferencesStyleControllerDelegate? + + init(preferences: [PreferencePane], toolbar: NSToolbar, centerToolbarItems: Bool) { + self.preferences = preferences + self.toolbar = toolbar + self.centerToolbarItems = centerToolbarItems + } + + func toolbarItemIdentifiers() -> [NSToolbarItem.Identifier] { + var toolbarItemIdentifiers: [NSToolbarItem.Identifier] = [] + + if centerToolbarItems { + toolbarItemIdentifiers.append(.flexibleSpace) + } + + for preference in preferences { + toolbarItemIdentifiers.append(preference.toolbarItemIdentifier) + } + + if centerToolbarItems { + toolbarItemIdentifiers.append(.flexibleSpace) + } + + return toolbarItemIdentifiers + } + + func toolbarItem(preferenceIdentifier: PreferencePaneIdentifier) -> NSToolbarItem? { + guard let preference = preferences.first(where: { $0.preferencePaneIdentifier == preferenceIdentifier }) else { + preconditionFailure() + } + + let toolbarItem = NSToolbarItem(itemIdentifier: preferenceIdentifier.toolbarItemIdentifier) + toolbarItem.label = preference.toolbarItemTitle + toolbarItem.image = preference.toolbarItemIcon + toolbarItem.target = self + toolbarItem.action = #selector(ToolbarItemStyleViewController.toolbarItemSelected(_:)) + return toolbarItem + } + + @IBAction private func toolbarItemSelected(_ toolbarItem: NSToolbarItem) { + delegate?.activateTab( + preferenceIdentifier: PreferencePaneIdentifier(fromToolbarItemIdentifier: toolbarItem.itemIdentifier), + animated: true) + } + + func selectTab(index: Int) { + toolbar.selectedItemIdentifier = preferences[index].toolbarItemIdentifier + } +} diff --git a/Sources/Preferences/UserInteractionPausableWindow.swift b/Sources/Preferences/UserInteractionPausableWindow.swift new file mode 100644 index 0000000..65c9659 --- /dev/null +++ b/Sources/Preferences/UserInteractionPausableWindow.swift @@ -0,0 +1,31 @@ +import Cocoa + +/// A window that allows you to disable all user interactions via `isUserInteractionEnabled`. +/// +/// Used to avoid breaking animations when the user clicks too fast. Disable user interactions during +/// animations and you're set. +class UserInteractionPausableWindow: NSWindow { + var isUserInteractionEnabled: Bool = true + + let pausableUserEventTypes: [NSEvent.EventType] = { + var result: [NSEvent.EventType] = [ + .leftMouseDown, .leftMouseUp, .rightMouseDown, .rightMouseUp, .leftMouseDragged, .rightMouseDragged, + .keyDown, .keyUp, .scrollWheel, .tabletPoint, .otherMouseDown, .otherMouseUp, .otherMouseDragged, + .gesture, .magnify, .swipe, .rotate, .beginGesture, .endGesture, .smartMagnify, .quickLook, .directTouch + ] + + if #available(macOS 10.10.3, *) { + result.append(.pressure) + } + + return result + }() + + override func sendEvent(_ event: NSEvent) { + if !isUserInteractionEnabled && pausableUserEventTypes.contains(event.type) { + return + } + + super.sendEvent(event) + } +} diff --git a/Sources/Preferences/util.swift b/Sources/Preferences/util.swift new file mode 100644 index 0000000..1f261ec --- /dev/null +++ b/Sources/Preferences/util.swift @@ -0,0 +1,47 @@ +import Cocoa + +struct System { + /// Get a system localized string + /// Use https://itunes.apple.com/no/app/system-strings/id570467776 to find strings + static func localizedString(forKey key: String) -> String { + return Bundle(for: NSApplication.self).localizedString(forKey: key, value: nil, table: nil) + } +} + +extension NSObject { + /// Returns the class name without module name + class var simpleClassName: String { + return String(describing: self) + } + + /// Returns the class name of the instance without module name + var simpleClassName: String { + return type(of: self).simpleClassName + } +} + +extension Collection { + func map(_ transform: (Element) throws -> (key: T, value: U)) rethrows -> [T: U] { + var result: [T: U] = [:] + for element in self { + let transformation = try transform(element) + result[transformation.key] = transformation.value + } + return result + } +} + +extension NSView { + @discardableResult + func constrainToSuperviewBounds() -> [NSLayoutConstraint] { + guard let superview = self.superview else { preconditionFailure("superview has to be set first") } + + var result: [NSLayoutConstraint] = [] + result.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) + result.append(contentsOf: NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self])) + self.translatesAutoresizingMaskIntoConstraints = false + superview.addConstraints(result) + + return result + } +} diff --git a/screenshot.gif b/images/screenshot.gif similarity index 99% rename from screenshot.gif rename to images/screenshot.gif index 586897a104c3371c877be9748d2d2d4f099d9f19..f89922b1bd026044377da745cbeb74b513028538 100644 GIT binary patch delta 524 zcmWN=TTGH+00!U@Ac`jhekp+<0R=%zk!G~oAYs&ObXZPZrO3?krkRb&>c)|Mx@;pF zdBJo|mu+dy4cfb*ZB1)wj>W=3tIe%)qQymJInieQ&-VNr{JRD;WN;~6+1BrRY);8Y1-ZdJ9>j87?2s#&;)eejqSOFc(t*qKskXNj`d4!6wK*iY3 zCb-KpHp95Kn$bCf>{(J!bLp)tRnX&OOV=L%Bj>Eo!a1S;F{P9(c z{N>BD$Shkx7h;x88Bb%Uo|@t#e1*D`L#!@}UI?p86fY&xVG(^dq{Dl@-UdTebn-jw zJh8b1zJp?MFP=?_f45*%B1tX5yDe#ajBg{-dOtDM?1iaDb}WS6l&qG6x9hTL2FM?o z&4Q>={-p^)zue&jm6lVBL>t)$ZKRmPgg#oF;zItZc;GpndKDkdq%WqRE72EI-JAt` zu%vn$MqlYb9B(eGZv{!6M1wj>*$q9JvzKAct{ob~r44ObftDiOjtR}@buSAc@6z4> zMM7=m2(?vQ?SV2`!R#dJhW$`C9B7&*9$_Us!m4}M3DsW(s$cJ{B<`>t?r`HO5ormT znV~^431ua%3t`m@)1d4N%i+glgck;CskET7Vs4TB&&8kL^FGgW-i!D6?|!6yAfpxy z#RM#xQ7zc2S;?W8tILgKxsm#Arx+5Rq~Zw}db4eK2A=EZ#1BB%Jjck+2Tj}oJuGYB zRyM%PuemqVDCRmH<`O#0bJ);pE=-CAp>r*%WdcSXCEM%aelEW!8NN&5Z{3G)AM*!d z(C!ng=flI(f;KmtsG^TCP;8~2OL6zCi$+qARD>b3uC&b!%-^3(Uq1)~-t@@<=qVHG z)3HBNEhHn=8ErM_DSI=5SKxvu)4v8g{$?r#*zxg1h?w|zlJcYIf2x&?Wx{)BBsWqq z*SaN07SXz;kvyCeUMaGjB)mJ8uVHUdlYQhX)Cpx3xv+VkOx6KA$7H`wLyue@U4%^u zdHqB9aww;^5BEq*cM@r-;?NWHY*9re`yPWEigAiP|5j92!J%^H68nzreM-9nevT<6 z^Y}JCwTr~3RLLCls2Nq1hTj%cT~Fb~9`!;6cC2AFq9N9>*7FMe>Hb_J`#(9od0i2B zt7&(80DB^NJ`u?aE*VgFTM9_GMdy8hx$ci{Qw=rQ`hRAqI-!4&1((k2@BGAWtFw@_ zI*ZP-Z@TiOh|_}JYTX{PTDR9Wj@m3PCT4NT?F*>qI!nl0r@>K-+7vVpQ_%R~IK?~@ OnnLXF3i(Zor~U(6E%x64 diff --git a/images/segmented-control.png b/images/segmented-control.png new file mode 100644 index 0000000000000000000000000000000000000000..32edc58e92d5796722ceae9d3c6300fe187ebc26 GIT binary patch literal 67470 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

bgN2=X5VCGZ|C#A~51Hte5So`r){&q9~j!9_AC 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 Wh`wpD{a@(o=t0+C3iqG=<39l(G^ro} literal 0 HcmV?d00001 diff --git a/images/toolbar-item.png b/images/toolbar-item.png new file mode 100644 index 0000000000000000000000000000000000000000..2a9c0e4194f9fca7fd37e9858f15e71c71b70e19 GIT binary patch literal 77705 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 literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index 46fcfcc..114d4e9 100644 --- a/readme.md +++ b/readme.md @@ -33,26 +33,61 @@ extension Settings.PaneIdentifier { } ``` -Second, create a couple of view controllers for the settings panes you want. The only difference from implementing a normal view controller is that you have to add the `SettingsPane` protocol and implement the `paneIdentifier`, `toolbarItemTitle`, and `toolbarItemIcon` properties, as shown below. You can leave out `toolbarItemIcon` if you're using the `.segmentedControl` style. +<<<>>>>>>-main +=== + + + + + +## Usage + +*Run the `PreferencesExample` target in Xcode to try a live example.* + +First, create a collection of preference pane identifiers: ```swift +import Preferences + +extension PreferencePaneIdentifier { + static let general = PreferencePaneIdentifier("general") + static let advanced = PreferencePaneIdentifier("advanced") +} +``` + +Second, create a couple of view controllers for the preference panes you want. The only difference from implementing a normal view controller is that you have to add the `Preferenceable` protocol and implement the `toolbarItemTitle` and `toolbarItemIcon` getters, as shown below. + +`GeneralPreferenceViewController.swift` +>>>>>>>-3b62df8 +swift import Cocoa import Settings -final class GeneralSettingsViewController: NSViewController, SettingsPane { +<<<>>>>>>-main +=== +finafinal class GeneralPreferenceViewController: NSViewController, PreferencePane { + let preferencePaneIdentifier: PreferencePaneIdentifier = .general + let toolbarItemTitle = "General" + let toolbarItemIcon = NSImage(named: NSImage.preferencesGeneralName)! + + override var nibName: NSNib.Name? { + return "GeneralPreferenceViewController" + } +>>>>>>>-3b62df8 + override func viewDidLoad() { + super.viewDidLoad() + + // Setup stuff here + } } ``` @@ -64,21 +99,240 @@ Note: If you need to support macOS versions older than macOS 11, you have to add import Cocoa import Settings -final class AdvancedSettingsViewController: NSViewController, SettingsPane { +<<<>>>>>>+main +=== +finafinal class AdvancedPreferenceViewController: NSViewController, PreferencePane { + let preferencePaneIdentifier: PreferencePaneIdentifier = .advanced + let toolbarItemTitle = "Advanced" + let toolbarItemIcon = NSImage(named: NSImage.advancedName)! + + override var nibName: NSNib.Name? { + return "AdvancedPreferenceViewController" + } +>>>>>>>-3b62df8 + override func viewDidLoad() { + super.viewDidLoad() + + // Setup stuff here + } +} +``` + +If you need to respond actions indirectly, the settings window controller will forward responder chain actions to the active pane if it responds to that selector. - override func viewDidLoad() { - super.viewDidLoad() +```swift +final class AdvancedSettingsViewController: NSViewController, SettingsPane { + @IBOutlet private var fontLabel: NSTextField! + private var selectedFont = NSFont.systemFont(ofSize: 14) - // Setup stuff here + @IBAction private func changeFont(_ sender: NSFontManager) { + font = sender.convert(font) } } ``` +In the `AppDelegate`, initialize a new `SettingsWindowController` and pass it the view controllers. Then add an action outlet for the `Settings…` menu item to show the settings window. + +`AppDelegate.swift` + +```swift +import Cocoa +import Settings + +@main +final class AppDelegate: NSObject, NSApplicationDelegate { + @IBOutlet private var window: NSWindow! + +<<<<<< private lazy var settingsWindowController = SettingsWindowController( + panes: [ + GeneralSettingsViewController(), + AdvancedSettingsViewController() + ] + ) +>>>>>>>-main += + le let preferencesWindowController = PreferencesWindowController( + preferences: [ + GeneralPreferenceViewController(), + AdvancedPreferenceViewController() + ] + ) +>>>>>>>-3b62df8 +unc applicationDidFinishLaunching(_ notification: Notification) {} + +<<<<<< @IBAction + func settingsMenuItemActionHandler(_ sender: NSMenuItem) { + settingsWindowController.show() + } +} +``` + +### Settings Tab Styles + +When you create the `SettingsWindowController`, you can choose between the `NSToolbarItem`-based style (default) and the `NSSegmentedControl`: + +```swift +// … +private lazy var settingsWindowController = SettingsWindowController( + panes: [ + GeneralSettingsViewController(), + AdvancedSettingsViewController() + ], + style: .segmentedControl +) +// … +>>>>>>>-main + @IBAct @IBAction + func preferencesMenuItemActionHandler(_ sender: NSMenuItem) { + preferencesWindowController.showWindow() + } +} +``` + +### Preferences Tab Styles + +When you create the `PreferencesWindowController`, you can also switch between the `NSToolbarItem`-based style (default) and the `NSSegmentedControl`: + +```swift + // ... + let preferencesWindowController = PreferencesWindowController( + preferences: [ + GeneralPreferenceViewController(), + AdvancedPreferenceViewController() + ], + style: .segmentedControl + ) + // ... +>>>>>>>-3b62df8 +lbarItem` style: + + +Just pass in some view controllers and this package will take care of the rest. Built-in SwiftUI support. + +*This package is compatible with macOS 13 and automatically uses `Settings` instead of `Preferences` in the window title on macOS 13 and later.* + +*This project was previously known as `Preferences`.* + +## Requirements + +macOS 10.13 and later. + +## Install + +Add `https://github.com/sindresorhus/Settings` in the [“Swift Package Manager” tab in Xcode](https://developer.apple.com/documentation/xcode/adding_package_dependencies_to_your_app). + +## Usage + +*Run the `Example` Xcode project to try a live example (requires macOS 11 or later).* + +First, create some settings pane identifiers: + +```swift +import Settings + +extension Settings.PaneIdentifier { + static let general = Self("general") + static let advanced = Self("advanced") +} +``` + +<<<>>>>>>-main +=== + + + + + +## Usage + +*Run the `PreferencesExample` target in Xcode to try a live example.* + +First, create a collection of preference pane identifiers: + +```swift +import Preferences + +extension PreferencePaneIdentifier { + static let general = PreferencePaneIdentifier("general") + static let advanced = PreferencePaneIdentifier("advanced") +} +``` + +Second, create a couple of view controllers for the preference panes you want. The only difference from implementing a normal view controller is that you have to add the `Preferenceable` protocol and implement the `toolbarItemTitle` and `toolbarItemIcon` getters, as shown below. + +`GeneralPreferenceViewController.swift` +>>>>>>>-3b62df8 +swift +import Cocoa +import Settings + +<<<>>>>>>-main +=== +finafinal class GeneralPreferenceViewController: NSViewController, PreferencePane { + let preferencePaneIdentifier: PreferencePaneIdentifier = .general + let toolbarItemTitle = "General" + let toolbarItemIcon = NSImage(named: NSImage.preferencesGeneralName)! + + override var nibName: NSNib.Name? { + return "GeneralPreferenceViewController" + } +>>>>>>>-3b62df8 + override func viewDidLoad() { + super.viewDidLoad() + + // Setup stuff here + } +} +``` + +Note: If you need to support macOS versions older than macOS 11, you have to add a [fallback for the `toolbarItemIcon`](#backwards-compatibility). + +`AdvancedSettingsViewController.swift` + +```swift +import Cocoa +import Settings + +<<<>>>>>>+main +=== +finafinal class AdvancedPreferenceViewController: NSViewController, PreferencePane { + let preferencePaneIdentifier: PreferencePaneIdentifier = .advanced + let toolbarItemTitle = "Advanced" + let toolbarItemIcon = NSImage(named: NSImage.advancedName)! + + override var nibName: NSNib.Name? { + return "AdvancedPreferenceViewController" + } +>>>>>>>-3b62df8 + override func viewDidLoad() { + super.viewDidLoad() + + // Setup stuff here + } +} +``` + If you need to respond actions indirectly, the settings window controller will forward responder chain actions to the active pane if it responds to that selector. ```swift @@ -102,18 +356,26 @@ import Settings @main final class AppDelegate: NSObject, NSApplicationDelegate { - @IBOutlet private var window: NSWindow! + @IBOutlet private var window: NSWindow! - private lazy var settingsWindowController = SettingsWindowController( +<<<<<< private lazy var settingsWindowController = SettingsWindowController( panes: [ GeneralSettingsViewController(), AdvancedSettingsViewController() ] ) - - func applicationDidFinishLaunching(_ notification: Notification) {} - - @IBAction +>>>>>>>-main += + le let preferencesWindowController = PreferencesWindowController( + preferences: [ + GeneralPreferenceViewController(), + AdvancedPreferenceViewController() + ] + ) +>>>>>>>-3b62df8 +unc applicationDidFinishLaunching(_ notification: Notification) {} + +<<<<<< @IBAction func settingsMenuItemActionHandler(_ sender: NSMenuItem) { settingsWindowController.show() } @@ -134,20 +396,44 @@ private lazy var settingsWindowController = SettingsWindowController( style: .segmentedControl ) // … +>>>>>>>-main + @IBAct @IBAction + func preferencesMenuItemActionHandler(_ sender: NSMenuItem) { + preferencesWindowController.showWindow() + } +} ``` -`.toolbarItem` style: +### Preferences Tab Styles -![NSToolbarItem based (default)](toolbar-item.png) +When you create the `PreferencesWindowController`, you can also switch between the `NSToolbarItem`-based style (default) and the `NSSegmentedControl`: +```swift + // ... + let preferencesWindowController = PreferencesWindowController( + preferences: [ + GeneralPreferenceViewController(), + AdvancedPreferenceViewController() + ], + style: .segmentedControl + ) + // ... +>>>>>>>-3b62df8 +lbarItem` style: + +<<<<<<< ma `.segmentedControl` style: ![NSSegmentedControl based](segmented-control.png) +>>>>>>>-main +NSToolba![NSToolbarItem based (default)](images/toolbar-item.png) -## API +`.segmentedControl` style: -```swift -public enum Settings {} +![NSSegmentedControl based](images/segmented-control.png) +>>>>>>>-3b62df8 +``swift +<<<<<<< mapublic enum Settings {} extension Settings { public enum Style { @@ -178,10 +464,28 @@ public final class SettingsWindowController: NSWindowController { ) func show(pane: Settings.PaneIdentifier? = nil) +>>>>>>>-main +blic propublic protocol PreferencePane: AnyObject { + var preferencePaneIdentifier: PreferencePaneIdentifier { get } + var toolbarItemTitle: String { get } + // Defaults to an empty image + var toolbarItemIcon: NSImage { get } + var viewController: NSViewController { get } } -``` -As with any `NSWindowController`, call `NSWindowController#close()` to close the settings window. +public enum PreferencesStyle { + case toolbarItems + case segmentedControl +} + +class PreferencesWindowController: NSWindowController { + init(preferencePanes: [PreferencePane], + style: PreferencesStyle = .toolbarItems, + animated: Bool = true) + func show(preferencePane: PreferencePaneIdentifier? = nil) + func hideWindow() +>>>>>>>-3b62df8 +with any `NSWindowController`, call `NSWindowController#close()` to close the settings window. ## Recommendation @@ -322,10 +626,9 @@ It can't be that hard right? Well, turns out it is: - Fully documented. - Adheres to the [macOS Human Interface Guidelines](https://developer.apple.com/design/human-interface-guidelines/patterns/settings/). - The window title is automatically localized by using the system string. - -## Related - -- [Defaults](https://github.com/sindresorhus/Defaults) - Swifty and modern UserDefaults +<<<<<<< main +>>>>>>>-ma![NSToolbarIt +[Defaults](https://github.com/sindresorhus/Defaults) - Swifty and modern UserDefaults - [LaunchAtLogin](https://github.com/sindresorhus/LaunchAtLogin) - Add "Launch at Login" functionality to your macOS app - [KeyboardShortcuts](https://github.com/sindresorhus/KeyboardShortcuts) - Add user-customizable global keyboard shortcuts to your macOS app - [DockProgress](https://github.com/sindresorhus/DockProgress) - Show progress in your app's Dock icon