OSDN Git Service

Timerをクロージャ方式にした
[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     var screenShotSaveDirectory: String {
41         
42         get {
43             
44             return UserDefaults.standard[.screenShotSaveDirectory] ?? ApplicationDirecrories.pictures.path
45         }
46         set {
47             
48             UserDefaults.standard[.screenShotSaveDirectory] = newValue
49         }
50     }
51     
52     var screenShotSaveDirectoryURL: URL {
53         
54         return URL(fileURLWithPath: screenShotSaveDirectory)
55     }
56     
57     @objc dynamic var monospaceSystemFont11: NSFont {
58         
59         return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
60     }
61     
62     @objc dynamic var monospaceSystemFont12: NSFont {
63         
64         return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
65     }
66     
67     @objc dynamic var monospaceSystemFont13: NSFont {
68         
69         return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
70     }
71     
72     // MARK: - Function
73     override func awakeFromNib() {
74         
75         if didLoadedMainMenu {
76             
77             return
78         }
79         
80         didLoadedMainMenu = true
81         
82         fleetManager = FleetManager()
83         
84         ValueTransformerRegister.registerAll()
85         UserDefaults.standard.register(defaults: DefaultKeys.defaults)
86         CustomHTTPProtocol.start()
87         CommandRegister.register()
88         
89         windowManager.prepair()
90         
91         if !UserDefaults.standard[.showsDebugMenu] {
92             
93             debugMenuItem.isHidden = true
94         }
95         
96         NotificationCenter.default
97             .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
98                 
99                 HistoryItemCleaner().cleanOldHistoryItems()
100         }
101     }
102     
103     func addCounterUpdate(_ updater: @escaping () -> Void) {
104         
105         updaters.append(updater)
106     }
107     
108     func clearCache() {
109         
110         CustomHTTPProtocol.clearCache()
111     }
112     
113     func createNewBrowser() -> ExternalBrowserWindowController {
114         
115         return windowManager.createNewBrowser()
116     }
117 }
118
119 // MARK: - IBActions
120 extension AppDelegate {
121     
122     @IBAction func showHideHistory(_ sender: AnyObject?) {
123         
124         windowManager.showHideHistory(sender)
125     }
126     
127     @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
128         
129         windowManager.showHideSlotItemWindow(sender)
130     }
131     
132     @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
133         
134         windowManager.showHideUpgradableShipWindow(sender)
135     }
136     
137     @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
138         
139         windowManager.showHideScreenshotListWindow(sender)
140     }
141     
142     @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
143         
144         windowManager.showHideAirBaseInfoWindow(sender)
145     }
146     
147     @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
148         
149         windowManager.showHidePreferencePanle(sender)
150     }
151     
152     @IBAction func showWindowAduster(_ sender: AnyObject?) {
153         
154         windowManager.showWindowAduster(sender)
155     }
156     
157     @IBAction func openNewBrowser(_ sender: AnyObject?) {
158         
159         windowManager.openNewBrowser(sender)
160     }
161     
162     @IBAction func selectBookmark(_ sender: AnyObject?) {
163         
164         windowManager.selectBookmark(sender)
165     }
166     
167     @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
168         
169         guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
170             
171             Logger.shared.log("Can not find RemoveDatabaseFileAndRestart.app")
172             
173             return
174         }
175         
176         let process = Process()
177         process.launchPath = "/usr/bin/open"
178         process.arguments = [path]
179         process.launch()
180     }
181     
182     @IBAction func showMainBrowser(_ sender: AnyObject?) {
183         
184         windowManager.showMainBrowser(sender)
185     }
186     
187     @IBAction func showShipWindow(_ sender: AnyObject?) {
188         
189         windowManager.showShipWindow(sender)
190     }
191     
192     @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
193         
194         windowManager.showEquipmentWindow(sender)
195     }
196     
197     @IBAction func showMapWindow(_ sender: AnyObject?) {
198         
199         windowManager.showMapWindow(sender)
200     }
201     
202     @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
203         
204         windowManager.showOwnershipShipWindow(sender)
205     }
206     
207     @IBAction func saveLocalData(_ sender: AnyObject?) {
208         
209         TSVSupport().save()
210     }
211     
212     @IBAction func loadLocalData(_ sender: AnyObject?) {
213         
214         TSVSupport().load()
215     }
216     
217     @IBAction func saveDocument(_ sender: AnyObject?) {
218         
219         windowManager.saveDocument(sender)
220     }
221     
222     @IBAction func openDocument(_ sender: AnyObject?) {
223         
224         windowManager.openDocument(sender)
225     }
226     
227     @IBAction func openInDeckBuilder(_ sender: Any?) {
228         
229         DeckBuilder().openDeckBuilder()
230     }
231     
232     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
233         
234         guard let action = menuItem.action else {
235             
236             return false
237         }
238         
239         switch action {
240             
241         case #selector(AppDelegate.saveLocalData(_:)),
242              #selector(AppDelegate.loadLocalData(_:)):
243             
244             return true
245             
246         case #selector(AppDelegate.removeDatabaseFile(_:)):
247             
248             return true
249             
250         case #selector(openInDeckBuilder(_:)):
251             
252             return true
253             
254         default:
255             
256             return windowManager.validateMenuItem(menuItem)
257         }
258     }
259 }
260
261 extension AppDelegate: NSApplicationDelegate {
262     
263     func applicationWillFinishLaunching(_ notification: Notification) {
264         
265         if NSEvent.modifierFlags == .option {
266             
267             removeDatabaseFile(nil)
268             
269             exit(0)
270         }
271         
272         Timer.scheduledTimer(withTimeInterval: 0.33, repeats: true) { [weak self] _ in
273             
274             self?.updaters.forEach { $0() }
275         }
276     }
277     
278     func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
279         
280         return true
281     }
282 }
283
284 extension AppDelegate: NSUserNotificationCenterDelegate {
285     
286     func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
287         
288         return true
289     }
290 }
291
292 @available(OSX 10.12.2, *)
293 private var objectForTouchBar: [Int: NSTouchBar] = [:]
294
295 @available(OSX 10.12.2, *)
296 extension AppDelegate: NSTouchBarProvider {
297     
298     @IBOutlet private var mainTouchBar: NSTouchBar? {
299         
300         get { return objectForTouchBar[hash] }
301         set { objectForTouchBar[hash] = newValue }
302     }
303     
304     var touchBar: NSTouchBar? {
305         
306         get {
307             
308             if windowManager.isMainWindowMostFront {
309                 
310                 return nil
311             }
312             if let _ = mainTouchBar {
313                 
314                 return mainTouchBar
315             }
316             
317             var topLevel: NSArray?
318             Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)
319             
320             return mainTouchBar
321         }
322         set {}
323     }
324 }