OSDN Git Service

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