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 */,
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")
return screenshotsController.selectedObjects as? [ScreenshotInformation] ?? []
}
- private var deletedPaths: [CacheVersionInfo] = []
private var dirName: String {
guard let name = Bundle.main.localizedInfoDictionary?["CFBundleName"] as? String,
return url
}
- private var cachURL: URL {
-
- return screenshotSaveDirectoryURL.appendingPathComponent("Cache.db")
- }
-
var indexPathsOfItemsBeingDragged: Set<IndexPath>?
// MARK: - Function
super.viewDidLoad()
- screenshots.screenshots = loadCache()
-
let nib = NSNib(nibNamed: ScreenshotCollectionViewItem.nibName, bundle: nil)
collectionView.register(nib, forItemWithIdentifier: .item)
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)
}
}
}
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
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 }
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)
}
}
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()