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!
32 var jsonViewWindowController: JSONViewWindowController? {
34 return windowManager.jsonViewWindowController
37 private var updaters: [() -> Void] = []
38 private var didLoadedMainMenu = false
40 @objc dynamic var monospaceSystemFont11: NSFont {
42 return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
45 @objc dynamic var monospaceSystemFont12: NSFont {
47 return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
50 @objc dynamic var monospaceSystemFont13: NSFont {
52 return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
56 override func awakeFromNib() {
58 if didLoadedMainMenu {
63 didLoadedMainMenu = true
65 fleetManager = FleetManager()
67 ValueTransformerRegister.registerAll()
68 UserDefaults.standard.register(defaults: DefaultKeys.defaults)
69 CustomHTTPProtocol.start()
70 CommandRegister.register()
72 windowManager.prepair()
74 if !UserDefaults.standard[.showsDebugMenu] {
76 debugMenuItem.isHidden = true
79 NotificationCenter.default
80 .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
82 HistoryItemCleaner().cleanOldHistoryItems()
86 func addCounterUpdate(_ updater: @escaping () -> Void) {
88 updaters.append(updater)
93 CustomHTTPProtocol.clearCache()
96 func createNewBrowser() -> ExternalBrowserWindowController {
98 return windowManager.createNewBrowser()
103 extension AppDelegate {
105 @IBAction func showHideHistory(_ sender: AnyObject?) {
107 windowManager.showHideHistory(sender)
110 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
112 windowManager.showHideSlotItemWindow(sender)
115 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
117 windowManager.showHideUpgradableShipWindow(sender)
120 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
122 windowManager.showHideScreenshotListWindow(sender)
125 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
127 windowManager.showHideAirBaseInfoWindow(sender)
130 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
132 windowManager.showHidePreferencePanle(sender)
135 @IBAction func showWindowAduster(_ sender: AnyObject?) {
137 windowManager.showWindowAduster(sender)
140 @IBAction func openNewBrowser(_ sender: AnyObject?) {
142 windowManager.openNewBrowser(sender)
145 @IBAction func selectBookmark(_ sender: AnyObject?) {
147 windowManager.selectBookmark(sender)
150 @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
152 guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
154 Logger.shared.log("Can not find RemoveDatabaseFileAndRestart.app")
159 let process = Process()
160 process.launchPath = "/usr/bin/open"
161 process.arguments = [path]
165 @IBAction func showMainBrowser(_ sender: AnyObject?) {
167 windowManager.showMainBrowser(sender)
170 @IBAction func showShipWindow(_ sender: AnyObject?) {
172 windowManager.showShipWindow(sender)
175 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
177 windowManager.showEquipmentWindow(sender)
180 @IBAction func showMapWindow(_ sender: AnyObject?) {
182 windowManager.showMapWindow(sender)
185 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
187 windowManager.showOwnershipShipWindow(sender)
190 @IBAction func saveLocalData(_ sender: AnyObject?) {
195 @IBAction func loadLocalData(_ sender: AnyObject?) {
200 @IBAction func saveDocument(_ sender: AnyObject?) {
202 windowManager.saveDocument(sender)
205 @IBAction func openDocument(_ sender: AnyObject?) {
207 windowManager.openDocument(sender)
210 @IBAction func openInDeckBuilder(_ sender: Any?) {
212 DeckBuilder().openDeckBuilder()
215 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
217 guard let action = menuItem.action else {
224 case #selector(AppDelegate.saveLocalData(_:)),
225 #selector(AppDelegate.loadLocalData(_:)):
229 case #selector(AppDelegate.removeDatabaseFile(_:)):
233 case #selector(openInDeckBuilder(_:)):
239 return windowManager.validateMenuItem(menuItem)
244 extension AppDelegate: NSApplicationDelegate {
246 func applicationWillFinishLaunching(_ notification: Notification) {
248 if NSEvent.modifierFlags == .option {
250 removeDatabaseFile(nil)
255 Timer.scheduledTimer(withTimeInterval: 0.33, repeats: true) { [weak self] _ in
257 self?.updaters.forEach { $0() }
261 func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
267 extension AppDelegate: NSUserNotificationCenterDelegate {
269 func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
275 @available(OSX 10.12.2, *)
276 private var objectForTouchBar: [Int: NSTouchBar] = [:]
278 @available(OSX 10.12.2, *)
279 extension AppDelegate: NSTouchBarProvider {
281 @IBOutlet private var mainTouchBar: NSTouchBar? {
283 get { return objectForTouchBar[hash] }
284 set { objectForTouchBar[hash] = newValue }
287 var touchBar: NSTouchBar? {
291 if windowManager.isMainWindowMostFront {
295 if let _ = mainTouchBar {
300 var topLevel: NSArray?
301 Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)