OSDN Git Service

コーディングスタイルを変更
[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     
15     case notification = 2
16 }
17
18 enum ScreenshotSaveDirectoryPopupMenuItemTag: Int {
19     
20     case saveDirectory = 1000
21     
22     case selectDiretory = 2000
23 }
24
25 private extension Selector {
26     
27     static let didChangeSelection = #selector(PreferencePanelController.didChangeSelection(_:))
28 }
29
30 final class PreferencePanelController: NSWindowController {
31     
32     @IBOutlet private var screenShotSaveDirectoryPopUp: NSPopUpButton!
33     @IBOutlet private var generalPane: NSView!
34     @IBOutlet private var notificationPane: NSView!
35     
36     override var windowNibName: NSNib.Name {
37         
38         return .nibName(instanceOf: self)
39     }
40     
41     private(set) var screenShotSaveDirectory: String {
42         
43         get { return AppDelegate.shared.screenShotSaveDirectory }
44         set {
45             
46             AppDelegate.shared.screenShotSaveDirectory = newValue
47             
48             let index = screenShotSaveDirectoryPopUp
49                 .indexOfItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
50             
51             guard let item = screenShotSaveDirectoryPopUp.item(at: index) else {
52                 
53                 return
54             }
55             
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)
60             
61             item.image = icon
62             item.title = FileManager.default.displayName(atPath: newValue)
63         }
64     }
65     
66     override func windowDidLoad() {
67         
68         super.windowDidLoad()
69         
70         screenShotSaveDirectory = AppDelegate.shared.screenShotSaveDirectory
71         
72         guard let window = window else {
73             
74             return
75         }
76         guard let item = window.toolbar?.items.first else {
77             
78             return
79         }
80         
81         window.toolbar?.selectedItemIdentifier = item.itemIdentifier
82         NSApplication.shared.sendAction(.didChangeSelection, to: self, from: item)
83         
84         window.center()
85     }
86     
87     @IBAction func selectScreenShotSaveDirectoryPopUp(_ sender: AnyObject?) {
88         
89         guard let window = window else {
90             
91             return
92         }
93         guard let tag = sender?.tag else {
94             
95             return
96         }
97         guard let itemTag = ScreenshotSaveDirectoryPopupMenuItemTag(rawValue: tag) else {
98             
99             return
100         }
101         guard itemTag == .selectDiretory else {
102             
103             return
104         }
105         
106         let panel = NSOpenPanel()
107         panel.canChooseDirectories = true
108         panel.canChooseFiles = false
109         panel.beginSheetModal(for: window) {
110             
111             self.screenShotSaveDirectoryPopUp
112                 .selectItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
113             
114             guard $0 != .cancel else {
115                 
116                 return
117             }
118             guard let path = panel.url?.path else {
119                 
120                 return
121             }
122             
123             self.screenShotSaveDirectory = path
124         }
125     }
126     
127     @IBAction func didChangeSelection(_ sender: AnyObject?) {
128         
129         guard let tag = sender?.tag else {
130             
131             return
132         }
133         guard let paneType = PreferencesPaneType(rawValue: tag) else {
134             
135             return
136         }
137         
138         let pane: NSView
139         switch paneType {
140             
141         case .general: pane = generalPane
142             
143         case .notification: pane = notificationPane
144             
145         }
146
147         guard let item = sender as? NSToolbarItem else {
148             
149             return
150         }
151         guard let window = self.window else {
152             
153             return
154         }
155         
156         window.title = item.label
157         window.contentView?.subviews.forEach { $0.removeFromSuperview() }
158         
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)
165     }
166 }