5 // Created by Hori,Masaki on 2017/02/03.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
12 final class AppDelegate: NSObject {
14 static var shared: AppDelegate {
16 return NSApplication.shared.delegate as! AppDelegate // swiftlint:disable:this force_cast
19 let appNameForUserAgent: String = "KCD(1.9b36) is not Safari/604.4.7"
20 private(set) var fleetManager: FleetManager?
22 private let windowManager = WindowManager()
24 private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
25 private let jsonTracker = JSONTracker()
26 private let timeSignalNotifier = TimeSignalNotifier()
27 private let resourceHistory = ResourceHistoryManager()
30 @IBOutlet private var debugMenuItem: NSMenuItem!
31 @IBOutlet private var billingWindowMenuItem: NSMenuItem!
33 var jsonViewWindowController: JSONViewWindowController? {
35 return windowManager.jsonViewWindowController
38 private var browserWindowControllers: [ExternalBrowserWindowController] = []
39 private var updaters: [() -> Void] = []
40 private var logedJSONViewWindowController: JSONViewWindowController?
41 private var didLoadedMainMenu = false
43 var screenShotSaveDirectory: String {
47 return UserDefaults.standard[.screenShotSaveDirectory] ?? ApplicationDirecrories.pictures.path
51 UserDefaults.standard[.screenShotSaveDirectory] = newValue
55 var screenShotSaveDirectoryURL: URL {
57 return URL(fileURLWithPath: screenShotSaveDirectory)
60 @objc dynamic var monospaceSystemFont11: NSFont {
62 return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
65 @objc dynamic var monospaceSystemFont12: NSFont {
67 return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
70 @objc dynamic var monospaceSystemFont13: NSFont {
72 return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
76 override func awakeFromNib() {
78 if didLoadedMainMenu {
83 didLoadedMainMenu = true
85 fleetManager = FleetManager()
87 ValueTransformerRegister.registerAll()
88 UserDefaults.standard.register(defaults: DefaultKeys.defaults)
89 CustomHTTPProtocol.start()
90 CommandRegister.register()
92 windowManager.prepair()
94 if !UserDefaults.standard[.showsDebugMenu] {
96 debugMenuItem.isHidden = true
99 NotificationCenter.default
100 .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
102 HistoryItemCleaner().cleanOldHistoryItems()
106 func addCounterUpdate(_ updater: @escaping () -> Void) {
108 updaters.append(updater)
113 CustomHTTPProtocol.clearCache()
116 func createNewBrowser() -> ExternalBrowserWindowController {
118 return windowManager.createNewBrowser()
121 @objc func fire(_ timer: Timer) {
123 updaters.forEach { $0() }
128 extension AppDelegate {
130 @IBAction func showHideHistory(_ sender: AnyObject?) {
132 windowManager.showHideHistory(sender)
135 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
137 windowManager.showHideSlotItemWindow(sender)
140 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
142 windowManager.showHideUpgradableShipWindow(sender)
145 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
147 windowManager.showHideScreenshotListWindow(sender)
150 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
152 windowManager.showHideAirBaseInfoWindow(sender)
155 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
157 windowManager.showHidePreferencePanle(sender)
160 @IBAction func showWindowAduster(_ sender: AnyObject?) {
162 windowManager.showWindowAduster(sender)
165 @IBAction func openNewBrowser(_ sender: AnyObject?) {
167 windowManager.openNewBrowser(sender)
170 @IBAction func selectBookmark(_ sender: AnyObject?) {
172 windowManager.selectBookmark(sender)
175 @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
177 guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
179 Logger.shared.log("Can not find RemoveDatabaseFileAndRestart.app")
184 let process = Process()
185 process.launchPath = "/usr/bin/open"
186 process.arguments = [path]
190 @IBAction func showMainBrowser(_ sender: AnyObject?) {
192 windowManager.showMainBrowser(sender)
195 @IBAction func showShipWindow(_ sender: AnyObject?) {
197 windowManager.showShipWindow(sender)
200 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
202 windowManager.showEquipmentWindow(sender)
205 @IBAction func showMapWindow(_ sender: AnyObject?) {
207 windowManager.showMapWindow(sender)
210 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
212 windowManager.showOwnershipShipWindow(sender)
215 @IBAction func saveLocalData(_ sender: AnyObject?) {
220 @IBAction func loadLocalData(_ sender: AnyObject?) {
225 @IBAction func saveDocument(_ sender: AnyObject?) {
227 windowManager.saveDocument(sender)
230 @IBAction func openDocument(_ sender: AnyObject?) {
232 windowManager.openDocument(sender)
235 @IBAction func openInDeckBuilder(_ sender: Any?) {
237 DeckBuilder().openDeckBuilder()
240 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
242 guard let action = menuItem.action else {
249 case #selector(AppDelegate.saveLocalData(_:)),
250 #selector(AppDelegate.loadLocalData(_:)):
254 case #selector(AppDelegate.removeDatabaseFile(_:)):
258 case #selector(openInDeckBuilder(_:)):
264 return windowManager.validateMenuItem(menuItem)
269 extension AppDelegate: NSApplicationDelegate {
271 func applicationWillFinishLaunching(_ notification: Notification) {
273 if NSEvent.modifierFlags == .option {
275 removeDatabaseFile(nil)
280 NSUserNotificationCenter.default.delegate = self
281 Timer.scheduledTimer(timeInterval: 0.33,
283 selector: #selector(AppDelegate.fire(_:)),
288 func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
294 extension AppDelegate: NSUserNotificationCenterDelegate {
296 func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
302 @available(OSX 10.12.2, *)
303 private var objectForTouchBar: [Int: NSTouchBar] = [:]
305 @available(OSX 10.12.2, *)
306 extension AppDelegate: NSTouchBarProvider {
308 @IBOutlet private var mainTouchBar: NSTouchBar? {
310 get { return objectForTouchBar[hash] }
311 set { objectForTouchBar[hash] = newValue }
314 var touchBar: NSTouchBar? {
317 if windowManager.isMainWindowMostFront {
321 if let _ = mainTouchBar {
326 var topLevel: NSArray?
327 Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)