OSDN Git Service

UAをVersion/10.0.3 Safari/602.4.8に変更
[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     case general = 1
13     case notification = 2
14 }
15 enum ScreenshotSaveDirectoryPopupMenuItemTag: Int {
16     case saveDirectory = 1000
17     case selectDiretory = 2000
18 }
19
20 private extension Selector {
21     static let didChangeSelection = #selector(PreferencePanelController.didChangeSelection(_:))
22 }
23
24 class PreferencePanelController: NSWindowController {
25     @IBOutlet var screenShotSaveDirectoryPopUp: NSPopUpButton!
26     @IBOutlet var generalPane: NSView!
27     @IBOutlet var notificationPane: NSView!
28     
29     override var windowNibName: String! {
30         return "PreferencePanelController"
31     }
32     
33     private(set) var screenShotSaveDirectory: String {
34         get { return AppDelegate.shared.screenShotSaveDirectory }
35         set {
36             AppDelegate.shared.screenShotSaveDirectory = newValue
37             
38             let index = screenShotSaveDirectoryPopUp
39                 .indexOfItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
40             guard let item = screenShotSaveDirectoryPopUp.item(at: index)
41                 else { return }
42             
43             let icon = NSWorkspace.shared().icon(forFile: newValue)
44             let iconSize = icon.size
45             let height: Double = 16
46             icon.size = NSSize(width: Double(iconSize.width) * height / Double(iconSize.height), height: height)
47             
48             item.image = icon
49             item.title = FileManager.default.displayName(atPath: newValue)
50         }
51     }
52     
53     override func windowDidLoad() {
54         super.windowDidLoad()
55         
56         screenShotSaveDirectory = AppDelegate.shared.screenShotSaveDirectory
57         guard let window = window,
58             let items = window.toolbar?.items,
59             let item = items.first
60             else { return }
61         window.toolbar?.selectedItemIdentifier = item.itemIdentifier
62         NSApplication.shared().sendAction(.didChangeSelection,
63                                           to: self,
64                                           from: item)
65         
66         window.center()
67     }
68     
69     @IBAction func selectScreenShotSaveDirectoryPopUp(_ sender: AnyObject?) {
70         guard let window = window,
71             let tag = sender?.tag,
72             ScreenshotSaveDirectoryPopupMenuItemTag.selectDiretory.rawValue == tag
73             else { return }
74         
75         let panel = NSOpenPanel()
76         panel.canChooseDirectories = true
77         panel.canChooseFiles = false
78         panel.beginSheetModal(for: window) {
79             self.screenShotSaveDirectoryPopUp
80                 .selectItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
81             guard $0 != NSModalResponseCancel,
82                 let path = panel.url?.path
83                 else { return }
84             self.screenShotSaveDirectory = path
85         }
86     }
87     
88     @IBAction func didChangeSelection(_ sender: AnyObject?) {
89         guard let tag = sender?.tag,
90             let paneType = PreferencesPaneType(rawValue: tag)
91             else { return }
92         let pane: NSView = {
93             switch paneType {
94             case .general: return generalPane
95             case .notification: return notificationPane
96             }
97         }()
98
99         guard let item = sender as? NSToolbarItem,
100             let window = self.window
101             else { return }
102         window.title = item.label
103         window.contentView?.subviews.forEach { $0.removeFromSuperview() }
104         
105         let windowRect = window.frame
106         var newWindowRect = window.frameRect(forContentRect: pane.frame)
107         newWindowRect.origin.x = windowRect.origin.x
108         newWindowRect.origin.y = windowRect.origin.y + windowRect.size.height - newWindowRect.size.height
109         window.setFrame(newWindowRect, display: true, animate: true)
110         window.contentView?.addSubview(pane)
111     }
112 }