Skip to content

Commit 2bb3fc7

Browse files
DivineDominionsindresorhus
authored andcommitted
Restore active preference when reopening window (#26)
Closes #16
1 parent cdbdea1 commit 2bb3fc7

File tree

3 files changed

+26
-16
lines changed

3 files changed

+26
-16
lines changed

Sources/Preferences/PreferencesStyleController.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ protocol PreferencesStyleController: AnyObject {
1111
}
1212

1313
protocol PreferencesStyleControllerDelegate: AnyObject {
14-
func activateTab(preferenceIdentifier: PreferencePaneIdentifier?, animated: Bool)
14+
func activateTab(preferenceIdentifier: PreferencePaneIdentifier, animated: Bool)
1515
func activateTab(index: Int, animated: Bool)
1616
}

Sources/Preferences/PreferencesTabViewController.swift

+17-12
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Cocoa
22

33
final class PreferencesTabViewController: NSViewController, PreferencesStyleControllerDelegate {
4-
private var activeTab: Int!
4+
private var activeTab: Int?
55
private var preferencePanes = [PreferencePane]()
66
internal var preferencePanesCount: Int {
77
return preferencePanes.count
@@ -54,19 +54,12 @@ final class PreferencesTabViewController: NSViewController, PreferencesStyleCont
5454
window.toolbar = toolbar
5555
}
5656

57-
func activateTab(preferencePane: PreferencePane?, animated: Bool) {
58-
guard let preference = preferencePane else {
59-
return activateTab(index: 0, animated: animated)
60-
}
61-
62-
activateTab(preferenceIdentifier: preference.preferencePaneIdentifier, animated: animated)
57+
func activateTab(preferencePane: PreferencePane, animated: Bool) {
58+
activateTab(preferenceIdentifier: preferencePane.preferencePaneIdentifier, animated: animated)
6359
}
6460

65-
func activateTab(preferenceIdentifier: PreferencePaneIdentifier?, animated: Bool) {
66-
guard
67-
let preferenceIdentifier = preferenceIdentifier,
68-
let index = (preferencePanes.firstIndex { $0.preferencePaneIdentifier == preferenceIdentifier })
69-
else {
61+
func activateTab(preferenceIdentifier: PreferencePaneIdentifier, animated: Bool) {
62+
guard let index = (preferencePanes.firstIndex { $0.preferencePaneIdentifier == preferenceIdentifier }) else {
7063
return activateTab(index: 0, animated: animated)
7164
}
7265

@@ -91,6 +84,12 @@ final class PreferencesTabViewController: NSViewController, PreferencesStyleCont
9184
}
9285
}
9386

87+
func restoreInitialTab() {
88+
if activeTab == nil {
89+
activateTab(index: 0, animated: false)
90+
}
91+
}
92+
9493
private func updateWindowTitle(tabIndex: Int) {
9594
self.window.title = {
9695
if preferencePanes.count > 1 {
@@ -114,6 +113,12 @@ final class PreferencesTabViewController: NSViewController, PreferencesStyleCont
114113
}
115114

116115
private func animateTabTransition(index: Int, animated: Bool) {
116+
guard let activeTab = activeTab else {
117+
assertionFailure("animateTabTransition called before a tab was displayed; transition only works from one tab to another")
118+
immediatelyDisplayTab(index: index)
119+
return
120+
}
121+
117122
let fromViewController = children[activeTab]
118123
let toViewController = children[index]
119124
let options: NSViewController.TransitionOptions = animated && isAnimated

Sources/Preferences/PreferencesWindowController.swift

+8-3
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,20 @@ public final class PreferencesWindowController: NSWindowController {
7474
///
7575
/// - See `close()` to close the window again.
7676
/// - See `showWindow(_:)` to show the window without the convenience of activating the app.
77-
/// - Note: Unless you need to open a specific pane, prefer not to pass a parameter at all
78-
/// - Parameter preferencePane: Identifier of the preference pane to display.
77+
/// - Note: Unless you need to open a specific pane, prefer not to pass a parameter at all or `nil`.
78+
/// - Parameter preferencePane: Identifier of the preference pane to display, or `nil` to show the
79+
/// tab that was open when the user last closed the window.
7980
public func show(preferencePane preferenceIdentifier: PreferencePaneIdentifier? = nil) {
8081
if !window!.isVisible {
8182
window?.center()
8283
}
8384

8485
showWindow(self)
85-
tabViewController.activateTab(preferenceIdentifier: preferenceIdentifier, animated: false)
86+
if let preferenceIdentifier = preferenceIdentifier {
87+
tabViewController.activateTab(preferenceIdentifier: preferenceIdentifier, animated: false)
88+
} else {
89+
tabViewController.restoreInitialTab()
90+
}
8691
NSApp.activate(ignoringOtherApps: true)
8792
}
8893
}

0 commit comments

Comments
 (0)