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     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, to: self, from: item)
71         
72         window.center()
73     }
74     
75     @IBAction func selectScreenShotSaveDirectoryPopUp(_ sender: AnyObject?) {
76         
77         guard let window = window else { return }
78         guard let tag = sender?.tag else { return }
79         guard let itemTag = ScreenshotSaveDirectoryPopupMenuItemTag(rawValue: tag) else { return }
80         guard itemTag == .selectDiretory else { return }
81         
82         let panel = NSOpenPanel()
83         panel.canChooseDirectories = true
84         panel.canChooseFiles = false
85         panel.beginSheetModal(for: window) {
86             
87             self.screenShotSaveDirectoryPopUp
88                 .selectItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
89             
90             guard $0 != .cancel else { return }
91             guard let path = panel.url?.path else { return }
92             
93             self.screenShotSaveDirectory = path
94         }
95     }
96     
97     @IBAction func didChangeSelection(_ sender: AnyObject?) {
98         
99         guard let tag = sender?.tag else { return }
100         guard let paneType = PreferencesPaneType(rawValue: tag) else { return }
101         
102         let pane: NSView = {
103             
104             switch paneType {
105             case .general: return generalPane
106             case .notification: return notificationPane
107             }
108         }()
109
110         guard let item = sender as? NSToolbarItem else { return }
111         guard let window = self.window else { return }
112         
113         window.title = item.label
114         window.contentView?.subviews.forEach { $0.removeFromSuperview() }
115         
116         let windowRect = window.frame
117         var newWindowRect = window.frameRect(forContentRect: pane.frame)
118         newWindowRect.origin.x = windowRect.origin.x
119         newWindowRect.origin.y = windowRect.origin.y + windowRect.size.height - newWindowRect.size.height
120         window.setFrame(newWindowRect, display: true, animate: true)
121         window.contentView?.addSubview(pane)
122     }
123 }