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 // swiftlint:disable:next force_cast
17 return NSApplication.shared.delegate as! AppDelegate
20 let appNameForUserAgent: String = "KCD(1.9b36) is not Safari/604.4.7"
21 private(set) var fleetManager: FleetManager?
23 private let windowManager = WindowManager()
25 private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
26 private let jsonTracker = JSONTracker()
27 private let timeSignalNotifier = TimeSignalNotifier()
28 private let resourceHistory = ResourceHistoryManager()
31 @IBOutlet var debugMenuItem: NSMenuItem!
32 @IBOutlet var billingWindowMenuItem: NSMenuItem!
34 var jsonViewWindowController: JSONViewWindowController? {
36 return windowManager.jsonViewWindowController
39 private var browserWindowControllers: [ExternalBrowserWindowController] = []
40 private var updaters: [() -> Void] = []
41 private var logedJSONViewWindowController: JSONViewWindowController?
42 private var didLoadedMainMenu = false
44 var screenShotSaveDirectory: String {
47 return UserDefaults.standard[.screenShotSaveDirectory] ?? ApplicationDirecrories.pictures.path
50 UserDefaults.standard[.screenShotSaveDirectory] = newValue
54 var screenShotSaveDirectoryURL: URL {
56 return URL(fileURLWithPath: screenShotSaveDirectory)
59 @objc dynamic var monospaceSystemFont11: NSFont {
61 return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
64 @objc dynamic var monospaceSystemFont12: NSFont {
66 return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
69 @objc dynamic var monospaceSystemFont13: NSFont {
71 return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
75 override func awakeFromNib() {
77 if didLoadedMainMenu { return }
79 didLoadedMainMenu = true
81 fleetManager = FleetManager()
83 ValueTransformerRegister.registerAll()
84 UserDefaults.standard.register(defaults: DefaultKeys.defaults)
85 CustomHTTPProtocol.start()
86 CommandRegister.register()
88 windowManager.prepair()
90 if !UserDefaults.standard[.showsDebugMenu] { debugMenuItem.isHidden = true }
92 NotificationCenter.default
93 .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
95 HistoryItemCleaner().cleanOldHistoryItems()
99 func addCounterUpdate(_ updater: @escaping () -> Void) {
101 updaters.append(updater)
106 CustomHTTPProtocol.clearCache()
109 func createNewBrowser() -> ExternalBrowserWindowController {
111 return windowManager.createNewBrowser()
114 func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
116 windowManager.registerScreenshot(image, fromOnScreen: fromOnScreen)
119 @objc func fire(_ timer: Timer) {
121 updaters.forEach { $0() }
126 extension AppDelegate {
128 @IBAction func showHideHistory(_ sender: AnyObject?) {
130 windowManager.showHideHistory(sender)
133 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
135 windowManager.showHideSlotItemWindow(sender)
138 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
140 windowManager.showHideUpgradableShipWindow(sender)
143 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
145 windowManager.showHideScreenshotListWindow(sender)
148 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
150 windowManager.showHideAirBaseInfoWindow(sender)
153 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
155 windowManager.showHidePreferencePanle(sender)
158 @IBAction func showWindowAduster(_ sender: AnyObject?) {
160 windowManager.showWindowAduster(sender)
163 @IBAction func openNewBrowser(_ sender: AnyObject?) {
165 windowManager.openNewBrowser(sender)
168 @IBAction func selectBookmark(_ sender: AnyObject?) {
170 windowManager.selectBookmark(sender)
173 @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
175 guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
177 return Logger.shared.log("Can not find RemoveDatabaseFileAndRestart.app")
180 let process = Process()
181 process.launchPath = "/usr/bin/open"
182 process.arguments = [path]
186 @IBAction func showMainBrowser(_ sender: AnyObject?) {
188 windowManager.showMainBrowser(sender)
191 @IBAction func showShipWindow(_ sender: AnyObject?) {
193 windowManager.showShipWindow(sender)
196 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
198 windowManager.showEquipmentWindow(sender)
201 @IBAction func showMapWindow(_ sender: AnyObject?) {
203 windowManager.showMapWindow(sender)
206 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
208 windowManager.showOwnershipShipWindow(sender)
211 @IBAction func saveLocalData(_ sender: AnyObject?) {
216 @IBAction func loadLocalData(_ sender: AnyObject?) {
221 @IBAction func saveDocument(_ sender: AnyObject?) {
223 windowManager.saveDocument(sender)
226 @IBAction func openDocument(_ sender: AnyObject?) {
228 windowManager.openDocument(sender)
231 @IBAction func openInDeckBuilder(_ sender: Any?) {
233 DeckBuilder().openDeckBuilder()
236 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
238 guard let action = menuItem.action else { return false }
242 case #selector(AppDelegate.saveLocalData(_:)),
243 #selector(AppDelegate.loadLocalData(_:)):
247 case #selector(AppDelegate.removeDatabaseFile(_:)):
250 case #selector(openInDeckBuilder(_:)):
254 return windowManager.validateMenuItem(menuItem)
259 extension AppDelegate: NSApplicationDelegate {
261 func applicationWillFinishLaunching(_ notification: Notification) {
263 if NSEvent.modifierFlags == .option {
265 removeDatabaseFile(nil)
270 NSUserNotificationCenter.default.delegate = self
271 Timer.scheduledTimer(timeInterval: 0.33,
273 selector: #selector(AppDelegate.fire(_:)),
278 func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
284 extension AppDelegate: NSUserNotificationCenterDelegate {
286 func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
292 @available(OSX 10.12.2, *)
293 private var objectForTouchBar: [Int: NSTouchBar] = [:]
295 @available(OSX 10.12.2, *)
296 extension AppDelegate: NSTouchBarProvider {
298 @IBOutlet private var mainTouchBar: NSTouchBar? {
300 get { return objectForTouchBar[hash] }
301 set { objectForTouchBar[hash] = newValue }
304 var touchBar: NSTouchBar? {
307 if windowManager.isMainWindowMostFront { return nil }
308 if let _ = mainTouchBar { return mainTouchBar }
310 var topLevel: NSArray?
311 Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)