OSDN Git Service

swiftlint 'line_length'の警告を修正
[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 {
35             return AppDelegate.shared.screenShotSaveDirectory
36         }
37         set {
38             AppDelegate.shared.screenShotSaveDirectory = newValue
39             
40             let index = screenShotSaveDirectoryPopUp
41                 .indexOfItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
42             guard let item = screenShotSaveDirectoryPopUp.item(at: index)
43                 else { return }
44             
45             let icon = NSWorkspace.shared().icon(forFile: newValue)
46             let iconSize = icon.size
47             let height: Double = 16
48             icon.size = NSSize(width: Double(iconSize.width) * height / Double(iconSize.height), height: height)
49             
50             item.image = icon
51             item.title = FileManager.default.displayName(atPath: newValue)
52         }
53     }
54     
55     override func windowDidLoad() {
56         super.windowDidLoad()
57         
58         screenShotSaveDirectory = AppDelegate.shared.screenShotSaveDirectory
59         guard let window = window,
60             let items = window.toolbar?.items,
61             items.count != 0,
62             let item = items.first
63             else { return }
64         window.toolbar?.selectedItemIdentifier = item.itemIdentifier
65         NSApplication.shared().sendAction(.didChangeSelection,
66                                           to: self,
67                                           from: item)
68         
69         window.center()
70     }
71     
72     @IBAction func selectScreenShotSaveDirectoryPopUp(_ sender: AnyObject?) {
73         guard let window = window,
74             let tag = sender?.tag,
75             ScreenshotSaveDirectoryPopupMenuItemTag.selectDiretory.rawValue == tag
76             else { return }
77         
78         let panel = NSOpenPanel()
79         panel.canChooseDirectories = true
80         panel.canChooseFiles = false
81         panel.beginSheetModal(for: window) {
82             self.screenShotSaveDirectoryPopUp
83                 .selectItem(withTag: ScreenshotSaveDirectoryPopupMenuItemTag.saveDirectory.rawValue)
84             guard $0 != NSModalResponseCancel,
85                 let path = panel.url?.path
86                 else { return }
87             self.screenShotSaveDirectory = path
88         }
89     }
90     
91     @IBAction func didChangeSelection(_ sender: AnyObject?) {
92         guard let tag = sender?.tag,
93             let paneType = PreferencesPaneType(rawValue: tag)
94             else { return }
95         let pane: NSView = {
96             switch paneType {
97             case .general:
98                 return generalPane
99             case .notification:
100                 return notificationPane
101             }
102         }()
103
104         guard let item = sender as? NSToolbarItem,
105             let window = self.window
106             else { return }
107         window.title = item.label
108         window.contentView?.subviews.forEach {
109             $0.removeFromSuperview()
110         }
111         
112         let windowRect = window.frame
113         var newWindowRect = window.frameRect(forContentRect: pane.frame)
114         newWindowRect.origin.x = windowRect.origin.x
115         newWindowRect.origin.y = windowRect.origin.y + windowRect.size.height - newWindowRect.size.height
116         window.setFrame(newWindowRect, display: true, animate: true)
117         window.contentView?.addSubview(pane)
118     }
119 }