OSDN Git Service

不要となっていたプロパティを削除
[kcd/KCD.git] / KCD / AppDelegate.swift
1 //
2 //  AppDelegate.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/02/03.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 @NSApplicationMain
12 final class AppDelegate: NSObject {
13     
14     static var shared: AppDelegate {
15         
16         return NSApplication.shared.delegate as! AppDelegate    // swiftlint:disable:this force_cast
17     }
18         
19     let appNameForUserAgent: String = "KCD(1.9b36) is not Safari/604.4.7"
20     private(set) var fleetManager: FleetManager?
21     
22     private let windowManager = WindowManager()
23     
24     private let historyCleanNotifer = PeriodicNotifier(hour: 0, minutes: 7)
25     private let jsonTracker = JSONTracker()
26     private let timeSignalNotifier = TimeSignalNotifier()
27     private let resourceHistory = ResourceHistoryManager()
28     
29     // MARK: - Variable
30     @IBOutlet private var debugMenuItem: NSMenuItem!
31     @IBOutlet private var billingWindowMenuItem: NSMenuItem!
32     
33     var jsonViewWindowController: JSONViewWindowController? {
34         
35         return windowManager.jsonViewWindowController
36     }
37     
38     private var browserWindowControllers: [ExternalBrowserWindowController] = []
39     private var updaters: [() -> Void] = []
40     private var logedJSONViewWindowController: JSONViewWindowController?
41     private var didLoadedMainMenu = false
42     
43     var screenShotSaveDirectory: String {
44         
45         get {
46             
47             return UserDefaults.standard[.screenShotSaveDirectory] ?? ApplicationDirecrories.pictures.path
48         }
49         set {
50             
51             UserDefaults.standard[.screenShotSaveDirectory] = newValue
52         }
53     }
54     
55     var screenShotSaveDirectoryURL: URL {
56         
57         return URL(fileURLWithPath: screenShotSaveDirectory)
58     }
59     
60     @objc dynamic var monospaceSystemFont11: NSFont {
61         
62         return NSFont.monospacedDigitSystemFont(ofSize: 11, weight: .regular)
63     }
64     
65     @objc dynamic var monospaceSystemFont12: NSFont {
66         
67         return NSFont.monospacedDigitSystemFont(ofSize: 12, weight: .regular)
68     }
69     
70     @objc dynamic var monospaceSystemFont13: NSFont {
71         
72         return NSFont.monospacedDigitSystemFont(ofSize: 13, weight: .regular)
73     }
74     
75     // MARK: - Function
76     override func awakeFromNib() {
77         
78         if didLoadedMainMenu {
79             
80             return
81         }
82         
83         didLoadedMainMenu = true
84         
85         fleetManager = FleetManager()
86         
87         ValueTransformerRegister.registerAll()
88         UserDefaults.standard.register(defaults: DefaultKeys.defaults)
89         CustomHTTPProtocol.start()
90         CommandRegister.register()
91         
92         windowManager.prepair()
93         
94         if !UserDefaults.standard[.showsDebugMenu] {
95             
96             debugMenuItem.isHidden = true
97         }
98         
99         NotificationCenter.default
100             .addObserver(forName: .Periodic, object: historyCleanNotifer, queue: nil) { _ in
101                 
102                 HistoryItemCleaner().cleanOldHistoryItems()
103         }
104     }
105     
106     func addCounterUpdate(_ updater: @escaping () -> Void) {
107         
108         updaters.append(updater)
109     }
110     
111     func clearCache() {
112         
113         CustomHTTPProtocol.clearCache()
114     }
115     
116     func createNewBrowser() -> ExternalBrowserWindowController {
117         
118         return windowManager.createNewBrowser()
119     }
120 }
121
122 // MARK: - IBActions
123 extension AppDelegate {
124     
125     @IBAction func showHideHistory(_ sender: AnyObject?) {
126         
127         windowManager.showHideHistory(sender)
128     }
129     
130     @IBAction func showHideSlotItemWindow(_ sender: AnyObject?) {
131         
132         windowManager.showHideSlotItemWindow(sender)
133     }
134     
135     @IBAction func showHideUpgradableShipWindow(_ sender: AnyObject?) {
136         
137         windowManager.showHideUpgradableShipWindow(sender)
138     }
139     
140     @IBAction func showHideScreenshotListWindow(_ sender: AnyObject?) {
141         
142         windowManager.showHideScreenshotListWindow(sender)
143     }
144     
145     @IBAction func showHideAirBaseInfoWindow(_ sender: AnyObject?) {
146         
147         windowManager.showHideAirBaseInfoWindow(sender)
148     }
149     
150     @IBAction func showHidePreferencePanle(_ sender: AnyObject?) {
151         
152         windowManager.showHidePreferencePanle(sender)
153     }
154     
155     @IBAction func showWindowAduster(_ sender: AnyObject?) {
156         
157         windowManager.showWindowAduster(sender)
158     }
159     
160     @IBAction func openNewBrowser(_ sender: AnyObject?) {
161         
162         windowManager.openNewBrowser(sender)
163     }
164     
165     @IBAction func selectBookmark(_ sender: AnyObject?) {
166         
167         windowManager.selectBookmark(sender)
168     }
169     
170     @IBAction func removeDatabaseFile(_ sender: AnyObject?) {
171         
172         guard let path = Bundle.main.path(forResource: "RemoveDatabaseFileAndRestart", ofType: "app") else {
173             
174             Logger.shared.log("Can not find RemoveDatabaseFileAndRestart.app")
175             
176             return
177         }
178         
179         let process = Process()
180         process.launchPath = "/usr/bin/open"
181         process.arguments = [path]
182         process.launch()
183     }
184     
185     @IBAction func showMainBrowser(_ sender: AnyObject?) {
186         
187         windowManager.showMainBrowser(sender)
188     }
189     
190     @IBAction func showShipWindow(_ sender: AnyObject?) {
191         
192         windowManager.showShipWindow(sender)
193     }
194     
195     @IBAction func showEquipmentWindow(_ sender: AnyObject?) {
196         
197         windowManager.showEquipmentWindow(sender)
198     }
199     
200     @IBAction func showMapWindow(_ sender: AnyObject?) {
201         
202         windowManager.showMapWindow(sender)
203     }
204     
205     @IBAction func showOwnershipShipWindow(_ sender: AnyObject?) {
206         
207         windowManager.showOwnershipShipWindow(sender)
208     }
209     
210     @IBAction func saveLocalData(_ sender: AnyObject?) {
211         
212         TSVSupport().save()
213     }
214     
215     @IBAction func loadLocalData(_ sender: AnyObject?) {
216         
217         TSVSupport().load()
218     }
219     
220     @IBAction func saveDocument(_ sender: AnyObject?) {
221         
222         windowManager.saveDocument(sender)
223     }
224     
225     @IBAction func openDocument(_ sender: AnyObject?) {
226         
227         windowManager.openDocument(sender)
228     }
229     
230     @IBAction func openInDeckBuilder(_ sender: Any?) {
231         
232         DeckBuilder().openDeckBuilder()
233     }
234     
235     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
236         
237         guard let action = menuItem.action else {
238             
239             return false
240         }
241         
242         switch action {
243             
244         case #selector(AppDelegate.saveLocalData(_:)),
245              #selector(AppDelegate.loadLocalData(_:)):
246             
247             return true
248             
249         case #selector(AppDelegate.removeDatabaseFile(_:)):
250             
251             return true
252             
253         case #selector(openInDeckBuilder(_:)):
254             
255             return true
256             
257         default:
258             
259             return windowManager.validateMenuItem(menuItem)
260         }
261     }
262 }
263
264 extension AppDelegate: NSApplicationDelegate {
265     
266     func applicationWillFinishLaunching(_ notification: Notification) {
267         
268         if NSEvent.modifierFlags == .option {
269             
270             removeDatabaseFile(nil)
271             
272             exit(0)
273         }
274         
275         Timer.scheduledTimer(withTimeInterval: 0.33, repeats: true) { [weak self] _ in
276             
277             self?.updaters.forEach { $0() }
278         }
279     }
280     
281     func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
282         
283         return true
284     }
285 }
286
287 extension AppDelegate: NSUserNotificationCenterDelegate {
288     
289     func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
290         
291         return true
292     }
293 }
294
295 @available(OSX 10.12.2, *)
296 private var objectForTouchBar: [Int: NSTouchBar] = [:]
297
298 @available(OSX 10.12.2, *)
299 extension AppDelegate: NSTouchBarProvider {
300     
301     @IBOutlet private var mainTouchBar: NSTouchBar? {
302         
303         get { return objectForTouchBar[hash] }
304         set { objectForTouchBar[hash] = newValue }
305     }
306     
307     var touchBar: NSTouchBar? {
308         
309         get {
310             
311             if windowManager.isMainWindowMostFront {
312                 
313                 return nil
314             }
315             if let _ = mainTouchBar {
316                 
317                 return mainTouchBar
318             }
319             
320             var topLevel: NSArray?
321             Bundle.main.loadNibNamed(NSNib.Name("MainTouchBar"), owner: self, topLevelObjects: &topLevel)
322             
323             return mainTouchBar
324         }
325         set {}
326     }
327 }