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 var screenShotSaveDirectory: String {
44 return UserDefaults.standard[.screenShotSaveDirectory] ?? ApplicationDirecrories.pictures.path
48 UserDefaults.standard[.screenShotSaveDirectory] = newValue
52 var screenShotSaveDirectoryURL: URL {
54 return URL(fileURLWithPath: screenShotSaveDirectory)
57 @objc dynamic var monospaceSystemFont11: NSFont {
59 return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
62 @objc dynamic var monospaceSystemFont12: NSFont {
64 return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
67 @objc dynamic var monospaceSystemFont13: NSFont {
69 return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
73 override func awakeFromNib() {
75 if didLoadedMainMenu {
80 didLoadedMainMenu = true
82 fleetManager = FleetManager()
84 ValueTransformerRegister.registerAll()
85 UserDefaults.standard.register(defaults: DefaultKeys.defaults)
86 CustomHTTPProtocol.start()
87 CommandRegister.register()
89 windowManager.prepair()
91 if !UserDefaults.standard[.showsDebugMenu] {
93 debugMenuItem.isHidden = true
96 NotificationCenter.default
97 .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
99 HistoryItemCleaner().cleanOldHistoryItems()
103 func addCounterUpdate(_ updater: @escaping () -> Void) {
105 updaters.append(updater)
110 CustomHTTPProtocol.clearCache()
113 func createNewBrowser() -> ExternalBrowserWindowController {
115 return windowManager.createNewBrowser()
120 extension AppDelegate {
122 @IBAction func showHideHistory(_ sender: AnyObject?) {
124 windowManager.showHideHistory(sender)
127 @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
129 windowManager.showHideSlotItemWindow(sender)
132 @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
134 windowManager.showHideUpgradableShipWindow(sender)
137 @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
139 windowManager.showHideScreenshotListWindow(sender)
142 @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
144 windowManager.showHideAirBaseInfoWindow(sender)
147 @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
149 windowManager.showHidePreferencePanle(sender)
152 @IBAction func showWindowAduster(_ sender: AnyObject?) {
154 windowManager.showWindowAduster(sender)
157 @IBAction func openNewBrowser(_ sender: AnyObject?) {
159 windowManager.openNewBrowser(sender)
162 @IBAction func selectBookmark(_ sender: AnyObject?) {
164 windowManager.selectBookmark(sender)
167 @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
169 guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
171 Logger.shared.log("Can not find RemoveDatabaseFileAndRestart.app")
176 let process = Process()
177 process.launchPath = "/usr/bin/open"
178 process.arguments = [path]
182 @IBAction func showMainBrowser(_ sender: AnyObject?) {
184 windowManager.showMainBrowser(sender)
187 @IBAction func showShipWindow(_ sender: AnyObject?) {
189 windowManager.showShipWindow(sender)
192 @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
194 windowManager.showEquipmentWindow(sender)
197 @IBAction func showMapWindow(_ sender: AnyObject?) {
199 windowManager.showMapWindow(sender)
202 @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
204 windowManager.showOwnershipShipWindow(sender)
207 @IBAction func saveLocalData(_ sender: AnyObject?) {
212 @IBAction func loadLocalData(_ sender: AnyObject?) {
217 @IBAction func saveDocument(_ sender: AnyObject?) {
219 windowManager.saveDocument(sender)
222 @IBAction func openDocument(_ sender: AnyObject?) {
224 windowManager.openDocument(sender)
227 @IBAction func openInDeckBuilder(_ sender: Any?) {
229 DeckBuilder().openDeckBuilder()
232 override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
234 guard let action = menuItem.action else {
241 case #selector(AppDelegate.saveLocalData(_:)),
242 #selector(AppDelegate.loadLocalData(_:)):
246 case #selector(AppDelegate.removeDatabaseFile(_:)):
250 case #selector(openInDeckBuilder(_:)):
256 return windowManager.validateMenuItem(menuItem)
261 extension AppDelegate: NSApplicationDelegate {
263 func applicationWillFinishLaunching(_ notification: Notification) {
265 if NSEvent.modifierFlags == .option {
267 removeDatabaseFile(nil)
272 Timer.scheduledTimer(withTimeInterval: 0.33, repeats: true) { [weak self] _ in
274 self?.updaters.forEach { $0() }
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? {
308 if windowManager.isMainWindowMostFront {
312 if let _ = mainTouchBar {
317 var topLevel: NSArray?
318 Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)