5 // Created by Hori,Masaki on 2017/02/03.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 private extension Selector {
13 static let fireInAppDelegate = #selector(AppDelegate.fire(_:))
15 static let saveLocalData = #selector(AppDelegate.saveLocalData(_:))
16 static let loadLocalData = #selector(AppDelegate.loadLocalData(_:))
18 static let removeDatabaseFile = #selector(AppDelegate.removeDatabaseFile(_:))
22 final class AppDelegate: NSObject {
24 static var shared: AppDelegate {
26 // swiftlint:disable force_cast
27 return NSApplication.shared.delegate as! AppDelegate
30 let appNameForUserAgent: String = "KCD(1.9b17) is not Safari/603.3.8"
31 let fleetManager: FleetManager = FleetManager()
33 let windowManager = WindowManager()
35 private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
36 private let jsonTracker = JSONTracker()
37 private let timeSignalNotifier = TimeSignalNotifier()
38 private let resourceHistory = ResourceHistoryManager()
41 @IBOutlet var debugMenuItem: NSMenuItem!
42 @IBOutlet var billingWindowMenuItem: NSMenuItem!
44 var jsonViewWindowController: JSONViewWindowController? {
46 return windowManager.jsonViewWindowController
49 private var browserWindowControllers: [ExternalBrowserWindowController] = []
50 private var updaters: [() -> Void] = []
51 private var logedJSONViewWindowController: JSONViewWindowController?
52 private var didLoadedMainMenu = false
54 var screenShotSaveDirectory: String {
57 return UserDefaults.standard[.screenShotSaveDirectory] ?? ApplicationDirecrories.pictures.path
60 UserDefaults.standard[.screenShotSaveDirectory] = newValue
64 var screenShotSaveDirectoryURL: URL {
66 return URL(fileURLWithPath: screenShotSaveDirectory)
69 @objc dynamic var monospaceSystemFont11: NSFont {
71 return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
74 @objc dynamic var monospaceSystemFont12: NSFont {
76 return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
79 @objc dynamic var monospaceSystemFont13: NSFont {
81 return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
85 override func awakeFromNib() {
87 if didLoadedMainMenu { return }
89 didLoadedMainMenu = true
91 ValueTransformerRegister.registerAll()
92 UserDefaults.standard.register(defaults: DefaultKeys.defaults)
93 CustomHTTPProtocol.start()
94 CommandRegister.register()
96 windowManager.prepair()
98 if !UserDefaults.standard[.showsDebugMenu] { debugMenuItem.isHidden = true }
100 NotificationCenter.default
101 .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
103 HistoryItemCleaner().cleanOldHistoryItems()
107 func addCounterUpdate(_ updater: @escaping () -> Void) {
109 updaters.append(updater)
114 CustomHTTPProtocol.clearCache()
117 func createNewBrowser() -> ExternalBrowserWindowController {
119 return windowManager.createNewBrowser()
122 func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
124 windowManager.registerScreenshot(image, fromOnScreen: fromOnScreen)
127 @objc func fire(_ timer: Timer) {
129 updaters.forEach { $0() }
134 extension AppDelegate {
136 @IBAction func showHideHistory(_ sender: AnyObject?) {
138 windowManager.showHideHistory(sender)
141 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
143 windowManager.showHideSlotItemWindow(sender)
146 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
148 windowManager.showHideUpgradableShipWindow(sender)
151 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
153 windowManager.showHideScreenshotListWindow(sender)
156 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
158 windowManager.showHideAirBaseInfoWindow(sender)
161 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
163 windowManager.showHidePreferencePanle(sender)
166 @IBAction func showWindowAduster(_ sender: AnyObject?) {
168 windowManager.showWindowAduster(sender)
171 @IBAction func openNewBrowser(_ sender: AnyObject?) {
173 windowManager.openNewBrowser(sender)
176 @IBAction func selectBookmark(_ sender: AnyObject?) {
178 windowManager.selectBookmark(sender)
181 @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
183 guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
185 print("Can not find RemoveDatabaseFileAndRestart.app")
189 let process = Process()
190 process.launchPath = "/usr/bin/open"
191 process.arguments = [path]
195 @IBAction func showMainBrowser(_ sender: AnyObject?) {
197 windowManager.showMainBrowser(sender)
200 @IBAction func showShipWindow(_ sender: AnyObject?) {
202 windowManager.showShipWindow(sender)
205 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
207 windowManager.showEquipmentWindow(sender)
210 @IBAction func showMapWindow(_ sender: AnyObject?) {
212 windowManager.showMapWindow(sender)
215 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
217 windowManager.showOwnershipShipWindow(sender)
220 @IBAction func saveLocalData(_ sender: AnyObject?) {
225 @IBAction func loadLocalData(_ sender: AnyObject?) {
230 @IBAction func saveDocument(_ sender: AnyObject?) {
232 windowManager.saveDocument(sender)
235 @IBAction func openDocument(_ sender: AnyObject?) {
237 windowManager.openDocument(sender)
240 @IBAction func openInDeckBuilder(_ sender: Any?) {
242 DeckBuilder().openDeckBuilder()
245 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
247 guard let action = menuItem.action else { return false }
250 case Selector.saveLocalData, Selector.loadLocalData:
253 case Selector.removeDatabaseFile:
256 case #selector(openInDeckBuilder(_:)):
260 return windowManager.validateMenuItem(menuItem)
265 extension AppDelegate: NSApplicationDelegate {
267 func applicationWillFinishLaunching(_ notification: Notification) {
269 if NSEvent.modifierFlags == .option {
271 removeDatabaseFile(nil)
276 NSUserNotificationCenter.default.delegate = self
277 Timer.scheduledTimer(timeInterval: 0.33,
279 selector: .fireInAppDelegate,
284 func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
290 extension AppDelegate: NSUserNotificationCenterDelegate {
292 func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
298 @available(OSX 10.12.2, *)
299 private var objectForTouchBar: [Int: NSTouchBar] = [:]
301 @available(OSX 10.12.2, *)
302 extension AppDelegate: NSTouchBarProvider {
304 @IBOutlet var mainTouchBar: NSTouchBar? {
306 get { return objectForTouchBar[hash] }
307 set { objectForTouchBar[hash] = newValue }
310 var touchBar: NSTouchBar? {
313 if windowManager.isMainWindowMostFront { return nil }
314 if let _ = mainTouchBar { return mainTouchBar }
316 var topLevel: NSArray?
317 Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)