OSDN Git Service

guard の書き方を統一した
[kcd/KCD.git] / KCD / PreferencePanelController.swift
1 //
2 //  PreferencePanelController.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2016/12/19.
6 //  Copyright © 2016年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 enum PreferencesPaneType: Int {
12     
13     case general = 1
14     case notification = 2
15 }
16
17 enum ScreenshotSaveDirectoryPopupMenuItemTag: Int {
18     
19     case saveDirectory = 1000
20     case selectDiretory = 2000
21 }
22
23 private extension Selector {
24     
25     static let didChangeSelection = #selector(PreferencePanelController.didChangeSelection(_:))
26 }
27
28 final class PreferencePanelController: NSWindowController {
29     
30     @IBOutlet var screenShotSaveDirectoryPopUp: NSPopUpButton!
31     @IBOutlet var generalPane: NSView!
32     @IBOutlet var notificationPane: NSView!
33     
34     override var windowNibName: NSNib.Name {
35         
36         return .nibName(instanceOf: self)
37     }
38     
39     private(set) var screenShotSaveDirectory: String {
40         
41         get { return AppDelegate.shared.screenShotSaveDirectory }
42         set {
43             AppDelegate.shared.screenShotSaveDirectory = newValue
44             
45             let index = screenShotSaveDirectoryPopUp
46                 .indexOfItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
47             
48             guard let item = screenShotSaveDirectoryPopUp.item(at: index) else { return }
49             
50             let icon = NSWorkspace.shared.icon(forFile: newValue)
51             let iconSize = icon.size
52             let height: Double = 16
53             icon.size = NSSize(width: Double(iconSize.width) * height / Double(iconSize.height), height: height)
54             
55             item.image = icon
56             item.title = FileManager.default.displayName(atPath: newValue)
57         }
58     }
59     
60     override func windowDidLoad() {
61         
62         super.windowDidLoad()
63         
64         screenShotSaveDirectory = AppDelegate.shared.screenShotSaveDirectory
65         
66         guard let window = window else { return }
67         guard let item = window.toolbar?.items.first else { return }
68         
69         window.toolbar?.selectedItemIdentifier = item.itemIdentifier
70         NSApplication.shared.sendAction(.didChangeSelection,
71                                           to: self,
72                                           from: item)
73         
74         window.center()
75     }
76     
77     @IBAction func selectScreenShotSaveDirectoryPopUp(_ sender: AnyObject?) {
78         
79         guard let window = window else { return }
80         guard let tag = sender?.tag else { return }
81         guard let itemTag = ScreenshotSaveDirectoryPopupMenuItemTag(rawValue: tag) else { return }
82         guard itemTag == .selectDiretory else { return }
83         
84         let panel = NSOpenPanel()
85         panel.canChooseDirectories = true
86         panel.canChooseFiles = false
87         panel.beginSheetModal(for: window) {
88             
89             self.screenShotSaveDirectoryPopUp
90                 .selectItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
91             
92             guard $0 != .cancel else { return }
93             guard let path = panel.url?.path else { return }
94             
95             self.screenShotSaveDirectory = path
96         }
97     }
98     
99     @IBAction func didChangeSelection(_ sender: AnyObject?) {
100         
101         guard let tag = sender?.tag else { return }
102         guard let paneType = PreferencesPaneType(rawValue: tag) else { return }
103         
104         let pane: NSView = {
105             
106             switch paneType {
107             case .general: return generalPane
108             case .notification: return notificationPane
109             }
110         }()
111
112         guard let item = sender as? NSToolbarItem else { return }
113         guard let window = self.window else { return }
114         
115         window.title = item.label
116         window.contentView?.subviews.forEach { $0.removeFromSuperview() }
117         
118         let windowRect = window.frame
119         var newWindowRect = window.frameRect(forContentRect: pane.frame)
120         newWindowRect.origin.x = windowRect.origin.x
121         newWindowRect.origin.y = windowRect.origin.y + windowRect.size.height - newWindowRect.size.height
122         window.setFrame(newWindowRect, display: true, animate: true)
123         window.contentView?.addSubview(pane)
124     }
125 }