OSDN Git Service

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