OSDN Git Service

分散していたスクリーンショットディレクトリを表すプロパティを集約した
[kcd/KCD.git] / KCD / GameViewController.swift
index 29074a7..a87dc7b 100644 (file)
@@ -15,7 +15,7 @@ final class GameViewController: NSViewController {
     private static let gamePageURL = "http://www.dmm.com/netgame/social/-/gadgets/=/app_id=854854/"
     private static let loginPageURLPrefix = "https://www.dmm.com/my/-/login/=/"
     
-    @IBOutlet var webView: WebView!
+    @IBOutlet private var webView: WebView!
     
     override var nibName: NSNib.Name {
         
@@ -52,6 +52,7 @@ final class GameViewController: NSViewController {
         guard let _ = webView.mainFrameURL else {
             
             webView.mainFrameURL = GameViewController.gamePageURL
+            
             return
         }
         
@@ -94,8 +95,14 @@ final class GameViewController: NSViewController {
         
         let panel = ProgressPanel()
         
-        guard let window = view.window else { return }
-        guard let panelWindow = panel.window else { return }
+        guard let window = view.window else {
+            
+            return
+        }
+        guard let panelWindow = panel.window else {
+            
+            return
+        }
         
         panel.title = ""
         panel.message = LocalizedStrings.deletingCacheInfo.string
@@ -108,22 +115,53 @@ final class GameViewController: NSViewController {
         window.endSheet(panelWindow)
     }
     
-    @IBAction func screenShot(_ sender: AnyObject?) {
+    func screenshotOld() {
         
-        let frame = view.visibleRect
-//        let screenshotBorder = UserDefaults.standard[.screenShotBorderWidth]
-//        let f = frame.insetBy(dx: -screenshotBorder, dy: -screenshotBorder)
+        let frame = webView.visibleRect
+        let screenshotBorder = UserDefaults.standard[.screenShotBorderWidth]
+        let f = frame.insetBy(dx: -screenshotBorder, dy: -screenshotBorder)
         
-        guard let window = view.window else { return Logger.shared.log("Can not get window") }
+        guard let rep = webView.bitmapImageRepForCachingDisplay(in: f) else {
+            
+            return
+        }
         
-        let windowCoordinateFrame = view.convert(frame, to: nil)
+        webView.cacheDisplay(in: frame, to: rep)
         
+        ScreenshotRegister(ApplicationDirecrories.shared.screenshotSaveDirectoryURL)
+            .registerScreenshot(rep, name: localizedAppName())
+    }
+    
+    @available(OSX 10.13, *)
+    func screenshot() {
+        
+        let frame = view.visibleRect
+        let screenshotBorder = UserDefaults.standard[.screenShotBorderWidth]
+        let f = frame.insetBy(dx: -screenshotBorder, dy: -screenshotBorder)
+        let windowCoordinateFrame = view.convert(f, to: nil)
+        
+        guard let window = view.window else {
+            
+            Logger.shared.log("Can not get window")
+            
+            return
+        }
         let screenCoordinsteFrame = window.convertToScreen(windowCoordinateFrame)
         
-        guard let screen = NSScreen.main else { return Logger.shared.log("Can not get Screen") }
+        guard let screen = NSScreen.main else {
+            
+            Logger.shared.log("Can not get Screen")
+            
+            return
+        }
         let scFrame = screen.frame
         
-        guard let cxt = window.graphicsContext?.cgContext else { return Logger.shared.log("Cannot get Context") }
+        guard let cxt = window.graphicsContext?.cgContext else {
+            
+            Logger.shared.log("Cannot get Context")
+            
+            return
+        }
         let deviceCoordinateFrame = cxt.convertToDeviceSpace(screenCoordinsteFrame)
         let raio = deviceCoordinateFrame.size.width / screenCoordinsteFrame.size.width
         
@@ -132,26 +170,65 @@ final class GameViewController: NSViewController {
                               width: raio * screenCoordinsteFrame.size.width,
                               height: raio * screenCoordinsteFrame.size.height)
         
-        guard let fullSizeImage = CGDisplayCreateImage(CGMainDisplayID()) else { return Logger.shared.log("Can not get Image") }
+        guard let fullSizeImage = CGDisplayCreateImage(CGMainDisplayID()) else {
+            
+            Logger.shared.log("Can not get Image")
+            
+            return
+        }
         
-        guard let image = fullSizeImage.cropping(to: trimRect) else { return Logger.shared.log("Can not trim image") }
+        guard let image = fullSizeImage.cropping(to: trimRect) else {
+            
+            Logger.shared.log("Can not trim image")
+            
+            return
+        }
         
         let rep = NSBitmapImageRep(cgImage: image)
         
-        AppDelegate.shared.registerScreenshot(rep, fromOnScreen: .zero)
+        if rep.size != NSSize(width: 800, height: 480) {
+            
+            rep.size = NSSize(width: 800, height: 480)
+        }
+        
+        ScreenshotRegister(ApplicationDirecrories.shared.screenshotSaveDirectoryURL)
+            .registerScreenshot(rep, name: localizedAppName())
+    }
+    
+    @IBAction func screenShot(_ sender: AnyObject?) {
+        
+        if #available(OSX 10.13, *) {
+            
+            screenshot()
+            
+        } else {
+            
+            screenshotOld()
+        }
     }
     
     override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
         
-        guard let action: Selector = menuItem.action else { return false }
+        guard let action: Selector = menuItem.action else {
+            
+            return false
+        }
         
         switch action {
             
         case #selector(GameViewController.reloadContent(_:)):
-            guard let _ = webView.mainFrame else { return true }
-            guard let frameURL = webView.mainFrameURL else { return true }
+            
+            guard let _ = webView.mainFrame else {
+                
+                return true
+            }
+            guard let frameURL = webView.mainFrameURL else {
+                
+                return true
+            }
             
             switch frameURL {
+                
             case GameViewController.gamePageURL:
                 menuItem.title = LocalizedStrings.reload.string
                 
@@ -160,17 +237,21 @@ final class GameViewController: NSViewController {
                 
             default:
                 menuItem.title = LocalizedStrings.backToGame.string
+                
             }
             
             return true
             
         case #selector(GameViewController.deleteCacheAndReload(_:)):
+            
             return true
             
         case #selector(GameViewController.screenShot(_:)):
+            
             return true
             
         default: return false
+            
         }
     }
 }
@@ -190,7 +271,10 @@ extension GameViewController: WebFrameLoadDelegate, WebUIDelegate {
     
     func webView(_ sender: WebView!, didFinishLoadFor frame: WebFrame!) {
         
-        guard let path = frame.dataSource?.initialRequest.url?.path else { return }
+        guard let path = frame.dataSource?.initialRequest.url?.path else {
+            
+            return
+        }
         
         let handler: (JSContext?, JSValue?) -> Void = { (_, exception) in
             
@@ -206,7 +290,10 @@ extension GameViewController: WebFrameLoadDelegate, WebUIDelegate {
         
         if path.hasSuffix("gadgets/ifr") {
             
-            guard let context = frame.javaScriptContext else { return }
+            guard let context = frame.javaScriptContext else {
+                
+                return
+            }
             
             context.exceptionHandler = handler
             context.evaluateScript(
@@ -223,7 +310,10 @@ extension GameViewController: WebFrameLoadDelegate, WebUIDelegate {
         
         if path.hasSuffix("app_id=854854") {
             
-            guard let context = frame.javaScriptContext else { return }
+            guard let context = frame.javaScriptContext else {
+                
+                return
+            }
             
             context.exceptionHandler = handler
             context.evaluateScript(
@@ -239,7 +329,10 @@ extension GameViewController: WebFrameLoadDelegate, WebUIDelegate {
             )
             let validIframe = context.objectForKeyedSubscript("validIframe").toInt32()
             
-            guard validIframe != 0 else { return }
+            guard validIframe != 0 else {
+                
+                return
+            }
             
             let top = context.objectForKeyedSubscript("atop").toDouble()
             let left = context.objectForKeyedSubscript("aleft").toDouble()
@@ -251,7 +344,10 @@ extension GameViewController: WebFrameLoadDelegate, WebUIDelegate {
     
     func webView(_ sender: WebView!, contextMenuItemsForElement element: [AnyHashable: Any]!, defaultMenuItems: [Any]!) -> [Any]! {
         
-        guard let menuItems = defaultMenuItems as? [NSMenuItem] else { return [] }
+        guard let menuItems = defaultMenuItems as? [NSMenuItem] else {
+            
+            return []
+        }
         
         return menuItems.filter { !GameViewController.excludeMenuItemTag.contains($0.tag) }
     }