OSDN Git Service

スクリーンショットリストのキャッシュを使用しないようにした
authormasakih <masakih@users.sourceforge.jp>
Wed, 8 Nov 2017 12:01:19 +0000 (21:01 +0900)
committermasakih <masakih@users.sourceforge.jp>
Wed, 8 Nov 2017 12:01:19 +0000 (21:01 +0900)
KCD.xcodeproj/project.pbxproj
KCD/ScreenshotListViewController.swift
KCD/ScreenshotLoader.swift [new file with mode: 0644]
KCD/ScreenshotRegister.swift [new file with mode: 0644]

index 1dc2ec6..ef1c9df 100644 (file)
@@ -59,6 +59,8 @@
                F42CFE281E3D9A02000B4F9B /* MasterMapInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = F42CFE271E3D9A02000B4F9B /* MasterMapInfo.swift */; };
                F43E67B718BE02A10087E5B6 /* STypeShortName.plist in Resources */ = {isa = PBXBuildFile; fileRef = F43E67B618BE02A10087E5B6 /* STypeShortName.plist */; };
                F43E67B918BE060E0087E5B6 /* LevelUpExp.plist in Resources */ = {isa = PBXBuildFile; fileRef = F43E67B818BE060E0087E5B6 /* LevelUpExp.plist */; };
+               F4401B0E1FAF2B5200A1BF29 /* ScreenshotLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4401B0D1FAF2B5200A1BF29 /* ScreenshotLoader.swift */; };
+               F4401B101FAF3C1A00A1BF29 /* ScreenshotRegister.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4401B0F1FAF3C1A00A1BF29 /* ScreenshotRegister.swift */; };
                F44775891EF6AAD900287572 /* SakutekiCalculator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F44775881EF6AAD900287572 /* SakutekiCalculator.swift */; };
                F44AA2671E814A4400EED8BE /* MOCGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F44AA2661E814A4400EED8BE /* MOCGenerator.swift */; };
                F44AA26B1E82AD2E00EED8BE /* NSObjectExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F44AA26A1E82AD2E00EED8BE /* NSObjectExtension.swift */; };
                F42CFE271E3D9A02000B4F9B /* MasterMapInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterMapInfo.swift; sourceTree = "<group>"; };
                F43E67B618BE02A10087E5B6 /* STypeShortName.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = STypeShortName.plist; sourceTree = "<group>"; };
                F43E67B818BE060E0087E5B6 /* LevelUpExp.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = LevelUpExp.plist; sourceTree = "<group>"; };
+               F4401B0D1FAF2B5200A1BF29 /* ScreenshotLoader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotLoader.swift; sourceTree = "<group>"; };
+               F4401B0F1FAF3C1A00A1BF29 /* ScreenshotRegister.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotRegister.swift; sourceTree = "<group>"; };
                F44775881EF6AAD900287572 /* SakutekiCalculator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SakutekiCalculator.swift; sourceTree = "<group>"; };
                F44AA2661E814A4400EED8BE /* MOCGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MOCGenerator.swift; sourceTree = "<group>"; };
                F44AA26A1E82AD2E00EED8BE /* NSObjectExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSObjectExtension.swift; sourceTree = "<group>"; };
                        isa = PBXGroup;
                        children = (
                                F42CFE171E3C12AA000B4F9B /* ScreenshotInformation.swift */,
+                               F4401B0D1FAF2B5200A1BF29 /* ScreenshotLoader.swift */,
+                               F4401B0F1FAF3C1A00A1BF29 /* ScreenshotRegister.swift */,
                                F4E5FF0F1E17A83D0026868C /* ScreenshotListWindowController.swift */,
                                F41465761DB4F1A700D68C97 /* ScreenshotListWindowController.xib */,
                                F4E5FF0B1E1645280026868C /* ScreenshotListViewController.swift */,
                                F4AA59161E1C9C5D001667AF /* ValueTransformerRegister.swift in Sources */,
                                F4CF25DE1E38E06300C02A66 /* EnhancementListItem.swift in Sources */,
                                F42A8FD61E3DE2C60099DC1D /* Material.swift in Sources */,
+                               F4401B0E1FAF2B5200A1BF29 /* ScreenshotLoader.swift in Sources */,
                                F491A4BC1E4B523C00D1E067 /* ApplicationDirecrories.swift in Sources */,
                                F4E5FF141E17F93B0026868C /* BroserWindowController.swift in Sources */,
                                F4FF44D01FA0BAAD00039F21 /* LocalDataStoreAccessor.swift in Sources */,
                                F44BC6E51E23082B004644E3 /* CombinedCommand.swift in Sources */,
                                F4AA59401E1E23EC001667AF /* HistoryMarkTransformer.swift in Sources */,
                                F404AF621F2D8CAE00A006B8 /* DefaultKeys.swift in Sources */,
+                               F4401B101FAF3C1A00A1BF29 /* ScreenshotRegister.swift in Sources */,
                                F44BC7131E28FDC4004644E3 /* MemberShipCommand.swift in Sources */,
                                F49097831E19F7760085A45D /* StrengthenListItemCellView.swift in Sources */,
                                F495462E1B1894DD00E0D8D0 /* Bookmark.xcdatamodeld in Sources */,
index e0639ec..79d2263 100644 (file)
@@ -8,21 +8,6 @@
 
 import Cocoa
 
-private struct CacheVersionInfo {
-    
-    let url: URL
-    
-    init(url: URL, version: Int = 0) {
-        
-        self.url = url
-        self.version = version
-    }
-    
-    private(set) var version: Int
-    
-    mutating func incrementVersion() { version = version + 1 }
-}
-
 extension NSUserInterfaceItemIdentifier {
     
     static let item = NSUserInterfaceItemIdentifier("item")
@@ -67,7 +52,6 @@ final class ScreenshotListViewController: NSViewController {
         return screenshotsController.selectedObjects as? [ScreenshotInformation] ?? []
     }
     
-    private var deletedPaths: [CacheVersionInfo] = []
     private var dirName: String {
         
         guard let name = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String,
@@ -106,11 +90,6 @@ final class ScreenshotListViewController: NSViewController {
         return url
     }
     
-    private var cachURL: URL {
-        
-        return screenshotSaveDirectoryURL.appendingPathComponent("Cache.db")
-    }
-    
     var indexPathsOfItemsBeingDragged: Set<IndexPath>?
     
     // MARK: - Function
@@ -118,8 +97,6 @@ final class ScreenshotListViewController: NSViewController {
         
         super.viewDidLoad()
         
-        screenshots.screenshots = loadCache()
-        
         let nib = NSNib(nibNamed: ScreenshotCollectionViewItem.nibName, bundle: nil)
         collectionView.register(nib, forItemWithIdentifier: .item)
         
@@ -177,40 +154,20 @@ final class ScreenshotListViewController: NSViewController {
     
     func registerScreenshot(_ image: NSBitmapImageRep, fromOnScreen: NSRect) {
         
-        DispatchQueue(label: "Screenshot queue").async {
+        let register = ScreenshotRegister(screenshotSaveDirectoryURL)
+        
+        register.registerScreenshot(image, name: dirName) { url in
             
-            guard let data = image.representation(using: .jpeg, properties: [:]) else { return }
+            let info = ScreenshotInformation(url: url)
             
-            let url = self.screenshotSaveDirectoryURL
-                .appendingPathComponent(self.dirName)
-                .appendingPathExtension("jpg")
-            let pathURL = FileManager.default.uniqueFileURL(url)
+            self.screenshotsController.insert(info, atArrangedObjectIndex: 0)
+            let set: Set<IndexPath> = [NSIndexPath(forItem: 0, inSection: 0) as IndexPath]
+            self.collectionView.selectionIndexPaths = set
             
-            do {
-                
-                try data.write(to: pathURL)
+            self.collectionView.scrollToItems(at: set, scrollPosition: .nearestHorizontalEdge)
+            if UserDefaults.standard[.showsListWindowAtScreenshot] {
                 
-            } catch {
-                
-                print("Can not write image")
-                return
-            }
-            
-            DispatchQueue.main.async {
-                
-                let info = ScreenshotInformation(url: pathURL, version: self.cacheVersion(forUrl: pathURL))
-                
-                self.screenshotsController.insert(info, atArrangedObjectIndex: 0)
-                let set: Set<IndexPath> = [NSIndexPath(forItem: 0, inSection: 0) as IndexPath]
-                self.collectionView.selectionIndexPaths = set
-                
-                self.collectionView.scrollToItems(at: set, scrollPosition: .nearestHorizontalEdge)
-                if UserDefaults.standard[.showsListWindowAtScreenshot] {
-                    
-                    self.view.window?.makeKeyAndOrderFront(nil)
-                }
-                
-                self.saveCache()
+                self.view.window?.makeKeyAndOrderFront(nil)
             }
         }
     }
@@ -240,90 +197,13 @@ final class ScreenshotListViewController: NSViewController {
     
     private func reloadData() {
         
-        guard let f = try? FileManager.default.contentsOfDirectory(at: screenshotSaveDirectoryURL, includingPropertiesForKeys: nil) else {
-            
-            return Logger.shared.log("can not read list of screenshot directory")
-        }
-        
-        let imageTypes = NSImage.imageTypes
-        let ws = NSWorkspace.shared
-        let current = screenshots.screenshots
-        let newFiles: [URL] = f.flatMap {
-            
-            guard let type = try? ws.type(ofFile: $0.path) else { return nil }
-            
-            return imageTypes.contains(type) ? $0 : nil
-        }
-        
-        // なくなっているものを削除
-        let itemWithoutDeleting = current.filter { newFiles.contains($0.url) }
-        
-        // 新しいものを追加
-        let new: [ScreenshotInformation] = newFiles.flatMap { url in
-            
-            if itemWithoutDeleting.contains(where: { url == $0.url }) { return nil }
-            return ScreenshotInformation(url: url)
-        }
-        
-        screenshots.screenshots = itemWithoutDeleting + new
+        screenshots.screenshots = ScreenshotLoader(screenshotSaveDirectoryURL).merge(screenshots: [])
         
         collectionView.selectionIndexPaths = [NSIndexPath(forItem: 0, inSection: 0) as IndexPath]
         
         reloadHandler?()
-        saveCache()
     }
     
-    private func saveCache() {
-        
-        let data = NSKeyedArchiver.archivedData(withRootObject: screenshots.screenshots)
-        
-        do {
-            
-            try data.write(to: cachURL)
-            
-        } catch {
-            
-            print("Can not write cache: \(error)")
-        }
-    }
-    
-    private func loadCache() -> [ScreenshotInformation] {
-        
-        guard let data = try? Data(contentsOf: cachURL) else {
-            
-            return Logger.shared.log("can not load cach \(cachURL)", value: [])
-        }
-        
-        guard let l = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data),
-            let loaded = l as? [ScreenshotInformation] else {
-                
-                return Logger.shared.log("Can not decode \(cachURL)", value: [])
-        }
-        
-        return loaded
-    }
-    
-    private func incrementCacheVersion(forUrl url: URL) {
-        
-        let infos = deletedPaths.filter { $0.url == url }
-        
-        if var info = infos.first {
-            
-            info.incrementVersion()
-            
-        } else {
-            
-            deletedPaths.append(CacheVersionInfo(url: url))
-        }
-    }
-    
-    private func cacheVersion(forUrl url: URL) -> Int {
-        
-        return deletedPaths
-            .filter { $0.url == url }
-            .first?
-            .version ?? 0
-    }
 }
 
 // MARK: - IBAction
@@ -339,24 +219,26 @@ extension ScreenshotListViewController {
         reloadData()
     }
     
-    @IBAction func delete(_ sender: AnyObject?) {
+    private func moveToTrash(_ urls: [URL]) {
         
-        let list = selectionInformations
-            .map { $0.url.path }
+        let list = urls.map { $0.path }
             .map { "(\"\($0)\" as POSIX file)" }
             .joined(separator: " , ")
         let script = "tell application \"Finder\"\n"
-        + "    delete { \(list) }\n"
-        + "end tell"
+            + "    delete { \(list) }\n"
+            + "end tell"
         
         guard let aps = NSAppleScript(source: script) else { return }
         
         aps.executeAndReturnError(nil)
+    }
+    
+    @IBAction func delete(_ sender: AnyObject?) {
+        
+        let selectionURLs = selectionInformations.map { $0.url }
         
         let selectionIndexes = screenshotsController.selectionIndexes
         screenshotsController.remove(atArrangedObjectIndexes: selectionIndexes)
-        selectionInformations.forEach { incrementCacheVersion(forUrl: $0.url) }
-        saveCache()
         reloadHandler?()
         
         guard var index = selectionIndexes.first else { return }
@@ -366,11 +248,13 @@ extension ScreenshotListViewController {
             index = arrangedInformations.count - 1
         }
         collectionView.selectionIndexPaths = [NSIndexPath(forItem: index, inSection: 0) as IndexPath]
+        
+        moveToTrash(selectionURLs)
     }
     
     @IBAction func revealInFinder(_ sender: AnyObject?) {
         
-        let urls = arrangedInformations.map { $0.url }
+        let urls = selectionInformations.map { $0.url }
         NSWorkspace.shared.activateFileViewerSelecting(urls)
     }
 }
@@ -520,7 +404,7 @@ extension ScreenshotListViewController: NSScrubberDataSource, NSScrubberDelegate
     
     func scrubber(_ scrubber: NSScrubber, viewForItemAt index: Int) -> NSScrubberItemView {
         
-        guard arrangedInformations.count > index else { return NSScrubberImageItemView() }
+        guard case 0..<arrangedInformations.count = index else { return NSScrubberImageItemView() }
         
         let info = arrangedInformations[index]
         let itemView = NSScrubberImageItemView()
diff --git a/KCD/ScreenshotLoader.swift b/KCD/ScreenshotLoader.swift
new file mode 100644 (file)
index 0000000..e466ea9
--- /dev/null
@@ -0,0 +1,51 @@
+//
+//  ScreenshotLoader.swift
+//  KCD
+//
+//  Created by Hori,Masaki on 2017/11/05.
+//  Copyright © 2017年 Hori,Masaki. All rights reserved.
+//
+
+import Cocoa
+
+final class ScreenshotLoader {
+    
+    let url: URL
+    
+    init(_ url: URL) {
+        
+        self.url = url
+    }
+    
+    func merge(screenshots: [ScreenshotInformation]) -> [ScreenshotInformation] {
+        
+        let urls = screenshotURLs()
+        
+        // なくなっているものを削除
+        let itemWithoutDeleting = screenshots.filter { urls.contains($0.url) }
+        
+        // 新しいものを追加
+        let newItems = urls
+            .filter { url in !itemWithoutDeleting.contains(where: { url == $0.url }) }
+            .map { ScreenshotInformation(url: $0) }
+        
+        return itemWithoutDeleting + newItems
+    }
+    
+    private func screenshotURLs() -> [URL] {
+        
+        guard let files = try? FileManager.default.contentsOfDirectory(at: url, includingPropertiesForKeys: nil) else {
+            
+            return Logger.shared.log("can not read list of screenshot directory", value: [])
+        }
+        
+        return files.filter(isPicture)
+    }
+    
+    private func isPicture(_ url: URL) -> Bool {
+        
+        guard let type = try? NSWorkspace.shared.type(ofFile: url.path) else { return false }
+        
+        return NSImage.imageTypes.contains(type)
+    }
+}
diff --git a/KCD/ScreenshotRegister.swift b/KCD/ScreenshotRegister.swift
new file mode 100644 (file)
index 0000000..3f63a53
--- /dev/null
@@ -0,0 +1,48 @@
+//
+//  ScreenshotRegister.swift
+//  KCD
+//
+//  Created by Hori,Masaki on 2017/11/05.
+//  Copyright © 2017年 Hori,Masaki. All rights reserved.
+//
+
+import Cocoa
+
+class ScreenshotRegister {
+    
+    
+    let url: URL
+    
+    init(_ url: URL) {
+        
+        self.url = url
+    }
+    
+    func registerScreenshot(_ image: NSBitmapImageRep, name: String, completeHandler: @escaping (URL) -> Void) {
+        
+        DispatchQueue(label: "Screenshot queue").async {
+            
+            guard let data = image.representation(using: .jpeg, properties: [:]) else { return }
+            
+            let url = self.url
+                .appendingPathComponent(name)
+                .appendingPathExtension("jpg")
+            let pathURL = FileManager.default.uniqueFileURL(url)
+            
+            do {
+                
+                try data.write(to: pathURL)
+                
+            } catch {
+                
+                print("Can not write image")
+                return
+            }
+            
+            DispatchQueue.main.async {
+                
+                completeHandler(pathURL)
+            }
+        }
+    }
+}