2 // PreferencePanelController.swift
5 // Created by Hori,Masaki on 2016/12/19.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 enum PreferencesPaneType: Int {
18 enum ScreenshotSaveDirectoryPopupMenuItemTag: Int {
20 case saveDirectory = 1000
22 case selectDiretory = 2000
25 private extension Selector {
27 static let didChangeSelection = #selector(PreferencePanelController.didChangeSelection(_:))
30 final class PreferencePanelController: NSWindowController {
32 @IBOutlet private var screenShotSaveDirectoryPopUp: NSPopUpButton!
33 @IBOutlet private var generalPane: NSView!
34 @IBOutlet private var notificationPane: NSView!
36 override var windowNibName: NSNib.Name {
38 return .nibName(instanceOf: self)
41 private(set) var screenShotSaveDirectory: String {
43 get { return AppDelegate.shared.screenShotSaveDirectory }
46 AppDelegate.shared.screenShotSaveDirectory = newValue
48 let index = screenShotSaveDirectoryPopUp
49 .indexOfItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
51 guard let item = screenShotSaveDirectoryPopUp.item(at: index) else {
56 let icon = NSWorkspace.shared.icon(forFile: newValue)
57 let iconSize = icon.size
58 let height: Double = 16
59 icon.size = NSSize(width: Double(iconSize.width) * height / Double(iconSize.height), height: height)
62 item.title = FileManager.default.displayName(atPath: newValue)
66 override func windowDidLoad() {
70 screenShotSaveDirectory = AppDelegate.shared.screenShotSaveDirectory
72 guard let window = window else {
76 guard let item = window.toolbar?.items.first else {
81 window.toolbar?.selectedItemIdentifier = item.itemIdentifier
82 NSApplication.shared.sendAction(.didChangeSelection, to: self, from: item)
87 @IBAction func selectScreenShotSaveDirectoryPopUp(_ sender: AnyObject?) {
89 guard let window = window else {
93 guard let tag = sender?.tag else {
97 guard let itemTag = ScreenshotSaveDirectoryPopupMenuItemTag(rawValue: tag) else {
101 guard itemTag == .selectDiretory else {
106 let panel = NSOpenPanel()
107 panel.canChooseDirectories = true
108 panel.canChooseFiles = false
109 panel.beginSheetModal(for: window) {
111 self.screenShotSaveDirectoryPopUp
112 .selectItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
114 guard $0 != .cancel else {
118 guard let path = panel.url?.path else {
123 self.screenShotSaveDirectory = path
127 @IBAction func didChangeSelection(_ sender: AnyObject?) {
129 guard let tag = sender?.tag else {
133 guard let paneType = PreferencesPaneType(rawValue: tag) else {
141 case .general: pane = generalPane
143 case .notification: pane = notificationPane
147 guard let item = sender as? NSToolbarItem else {
151 guard let window = self.window else {
156 window.title = item.label
157 window.contentView?.subviews.forEach { $0.removeFromSuperview() }
159 let windowRect = window.frame
160 var newWindowRect = window.frameRect(forContentRect: pane.frame)
161 newWindowRect.origin.x = windowRect.origin.x
162 newWindowRect.origin.y = windowRect.origin.y + windowRect.size.height - newWindowRect.size.height
163 window.setFrame(newWindowRect, display: true, animate: true)
164 window.contentView?.addSubview(pane)