OSDN Git Service

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