OSDN Git Service

バージョンを1.9b19に更新
[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: String! {
35         
36         return "PreferencePanelController"
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)
49                 else { return }
50             
51             let icon = NSWorkspace.shared().icon(forFile: newValue)
52             let iconSize = icon.size
53             let height: Double = 16
54             icon.size = NSSize(width: Double(iconSize.width) * height / Double(iconSize.height), height: height)
55             
56             item.image = icon
57             item.title = FileManager.default.displayName(atPath: newValue)
58         }
59     }
60     
61     override func windowDidLoad() {
62         
63         super.windowDidLoad()
64         
65         screenShotSaveDirectory = AppDelegate.shared.screenShotSaveDirectory
66         
67         guard let window = window,
68             let items = window.toolbar?.items,
69             let item = items.first
70             else { return }
71         
72         window.toolbar?.selectedItemIdentifier = item.itemIdentifier
73         NSApplication.shared().sendAction(.didChangeSelection,
74                                           to: self,
75                                           from: item)
76         
77         window.center()
78     }
79     
80     @IBAction func selectScreenShotSaveDirectoryPopUp(_ sender: AnyObject?) {
81         
82         guard let window = window,
83             let tag = sender?.tag,
84             let itemTag = ScreenshotSaveDirectoryPopupMenuItemTag(rawValue: tag),
85             itemTag == .selectDiretory
86             else { return }
87         
88         let panel = NSOpenPanel()
89         panel.canChooseDirectories = true
90         panel.canChooseFiles = false
91         panel.beginSheetModal(for: window) {
92             
93             self.screenShotSaveDirectoryPopUp
94                 .selectItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
95             
96             guard $0 != NSModalResponseCancel,
97                 let path = panel.url?.path
98                 else { return }
99             
100             self.screenShotSaveDirectory = path
101         }
102     }
103     
104     @IBAction func didChangeSelection(_ sender: AnyObject?) {
105         
106         guard let tag = sender?.tag,
107             let paneType = PreferencesPaneType(rawValue: tag)
108             else { return }
109         
110         let pane: NSView = {
111             
112             switch paneType {
113             case .general: return generalPane
114             case .notification: return notificationPane
115             }
116         }()
117
118         guard let item = sender as? NSToolbarItem,
119             let window = self.window
120             else { return }
121         
122         window.title = item.label
123         window.contentView?.subviews.forEach { $0.removeFromSuperview() }
124         
125         let windowRect = window.frame
126         var newWindowRect = window.frameRect(forContentRect: pane.frame)
127         newWindowRect.origin.x = windowRect.origin.x
128         newWindowRect.origin.y = windowRect.origin.y + windowRect.size.height - newWindowRect.size.height
129         window.setFrame(newWindowRect, display: true, animate: true)
130         window.contentView?.addSubview(pane)
131     }
132 }