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