OSDN Git Service

分散していたスクリーンショットディレクトリを表すプロパティを集約した
[kcd/KCD.git] / KCD / AppDelegate.swift
1 //
2 //  AppDelegate.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/02/03.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 @NSApplicationMain
12 final class AppDelegate: NSObject {
13     
14     static var shared: AppDelegate {
15         
16         return NSApplication.shared.delegate as! AppDelegate    // swiftlint:disable:this force_cast
17     }
18         
19     let appNameForUserAgent: String = "KCD(1.9b36) is not Safari/604.4.7"
20     private(set) var fleetManager: FleetManager?
21     
22     private let windowManager = WindowManager()
23     
24     private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
25     private let jsonTracker = JSONTracker()
26     private let timeSignalNotifier = TimeSignalNotifier()
27     private let resourceHistory = ResourceHistoryManager()
28     
29     // MARK: - Variable
30     @IBOutlet private var debugMenuItem: NSMenuItem!
31     
32     var jsonViewWindowController: JSONViewWindowController? {
33         
34         return windowManager.jsonViewWindowController
35     }
36     
37     private var updaters: [() -> Void] = []
38     private var didLoadedMainMenu = false
39     
40     @objc dynamic var monospaceSystemFont11: NSFont {
41         
42         return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
43     }
44     
45     @objc dynamic var monospaceSystemFont12: NSFont {
46         
47         return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
48     }
49     
50     @objc dynamic var monospaceSystemFont13: NSFont {
51         
52         return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
53     }
54     
55     // MARK: - Function
56     override func awakeFromNib() {
57         
58         if didLoadedMainMenu {
59             
60             return
61         }
62         
63         didLoadedMainMenu = true
64         
65         fleetManager = FleetManager()
66         
67         ValueTransformerRegister.registerAll()
68         UserDefaults.standard.register(defaults: DefaultKeys.defaults)
69         CustomHTTPProtocol.start()
70         CommandRegister.register()
71         
72         windowManager.prepair()
73         
74         if !UserDefaults.standard[.showsDebugMenu] {
75             
76             debugMenuItem.isHidden = true
77         }
78         
79         NotificationCenter.default
80             .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
81                 
82                 HistoryItemCleaner().cleanOldHistoryItems()
83         }
84     }
85     
86     func addCounterUpdate(_ updater: @escaping () -> Void) {
87         
88         updaters.append(updater)
89     }
90     
91     func clearCache() {
92         
93         CustomHTTPProtocol.clearCache()
94     }
95     
96     func createNewBrowser() -> ExternalBrowserWindowController {
97         
98         return windowManager.createNewBrowser()
99     }
100 }
101
102 // MARK: - IBActions
103 extension AppDelegate {
104     
105     @IBAction func showHideHistory(_ sender: AnyObject?) {
106         
107         windowManager.showHideHistory(sender)
108     }
109     
110     @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
111         
112         windowManager.showHideSlotItemWindow(sender)
113     }
114     
115     @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
116         
117         windowManager.showHideUpgradableShipWindow(sender)
118     }
119     
120     @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
121         
122         windowManager.showHideScreenshotListWindow(sender)
123     }
124     
125     @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
126         
127         windowManager.showHideAirBaseInfoWindow(sender)
128     }
129     
130     @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
131         
132         windowManager.showHidePreferencePanle(sender)
133     }
134     
135     @IBAction func showWindowAduster(_ sender: AnyObject?) {
136         
137         windowManager.showWindowAduster(sender)
138     }
139     
140     @IBAction func openNewBrowser(_ sender: AnyObject?) {
141         
142         windowManager.openNewBrowser(sender)
143     }
144     
145     @IBAction func selectBookmark(_ sender: AnyObject?) {
146         
147         windowManager.selectBookmark(sender)
148     }
149     
150     @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
151         
152         guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
153             
154             Logger.shared.log("Can not find RemoveDatabaseFileAndRestart.app")
155             
156             return
157         }
158         
159         let process = Process()
160         process.launchPath = "/usr/bin/open"
161         process.arguments = [path]
162         process.launch()
163     }
164     
165     @IBAction func showMainBrowser(_ sender: AnyObject?) {
166         
167         windowManager.showMainBrowser(sender)
168     }
169     
170     @IBAction func showShipWindow(_ sender: AnyObject?) {
171         
172         windowManager.showShipWindow(sender)
173     }
174     
175     @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
176         
177         windowManager.showEquipmentWindow(sender)
178     }
179     
180     @IBAction func showMapWindow(_ sender: AnyObject?) {
181         
182         windowManager.showMapWindow(sender)
183     }
184     
185     @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
186         
187         windowManager.showOwnershipShipWindow(sender)
188     }
189     
190     @IBAction func saveLocalData(_ sender: AnyObject?) {
191         
192         TSVSupport().save()
193     }
194     
195     @IBAction func loadLocalData(_ sender: AnyObject?) {
196         
197         TSVSupport().load()
198     }
199     
200     @IBAction func saveDocument(_ sender: AnyObject?) {
201         
202         windowManager.saveDocument(sender)
203     }
204     
205     @IBAction func openDocument(_ sender: AnyObject?) {
206         
207         windowManager.openDocument(sender)
208     }
209     
210     @IBAction func openInDeckBuilder(_ sender: Any?) {
211         
212         DeckBuilder().openDeckBuilder()
213     }
214     
215     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
216         
217         guard let action = menuItem.action else {
218             
219             return false
220         }
221         
222         switch action {
223             
224         case #selector(AppDelegate.saveLocalData(_:)),
225              #selector(AppDelegate.loadLocalData(_:)):
226             
227             return true
228             
229         case #selector(AppDelegate.removeDatabaseFile(_:)):
230             
231             return true
232             
233         case #selector(openInDeckBuilder(_:)):
234             
235             return true
236             
237         default:
238             
239             return windowManager.validateMenuItem(menuItem)
240         }
241     }
242 }
243
244 extension AppDelegate: NSApplicationDelegate {
245     
246     func applicationWillFinishLaunching(_ notification: Notification) {
247         
248         if NSEvent.modifierFlags == .option {
249             
250             removeDatabaseFile(nil)
251             
252             exit(0)
253         }
254         
255         Timer.scheduledTimer(withTimeInterval: 0.33, repeats: true) { [weak self] _ in
256             
257             self?.updaters.forEach { $0() }
258         }
259     }
260     
261     func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
262         
263         return true
264     }
265 }
266
267 extension AppDelegate: NSUserNotificationCenterDelegate {
268     
269     func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
270         
271         return true
272     }
273 }
274
275 @available(OSX 10.12.2, *)
276 private var objectForTouchBar: [Int: NSTouchBar] = [:]
277
278 @available(OSX 10.12.2, *)
279 extension AppDelegate: NSTouchBarProvider {
280     
281     @IBOutlet private var mainTouchBar: NSTouchBar? {
282         
283         get { return objectForTouchBar[hash] }
284         set { objectForTouchBar[hash] = newValue }
285     }
286     
287     var touchBar: NSTouchBar? {
288         
289         get {
290             
291             if windowManager.isMainWindowMostFront {
292                 
293                 return nil
294             }
295             if let _ = mainTouchBar {
296                 
297                 return mainTouchBar
298             }
299             
300             var topLevel: NSArray?
301             Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)
302             
303             return mainTouchBar
304         }
305         set {}
306     }
307 }