diff --git a/YAPS/YAPS.xcodeproj/project.pbxproj b/YAPS/YAPS.xcodeproj/project.pbxproj index cb19793..a4a2f01 100644 --- a/YAPS/YAPS.xcodeproj/project.pbxproj +++ b/YAPS/YAPS.xcodeproj/project.pbxproj @@ -15,6 +15,7 @@ EC13306F24DD687F008063CF /* YapsFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC13306E24DD687F008063CF /* YapsFile.swift */; }; EC13307124DDB3F4008063CF /* FinderHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC13307024DDB3F4008063CF /* FinderHelper.swift */; }; EC13307424DF2B2D008063CF /* YapsFileCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC13307324DF2B2D008063CF /* YapsFileCell.swift */; }; + ECF5A75824E070710010A11D /* RawFileExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF5A75724E070710010A11D /* RawFileExtensions.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -29,6 +30,7 @@ EC13306E24DD687F008063CF /* YapsFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YapsFile.swift; sourceTree = ""; }; EC13307024DDB3F4008063CF /* FinderHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinderHelper.swift; sourceTree = ""; }; EC13307324DF2B2D008063CF /* YapsFileCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YapsFileCell.swift; sourceTree = ""; }; + ECF5A75724E070710010A11D /* RawFileExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawFileExtensions.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,6 +97,7 @@ isa = PBXGroup; children = ( EC13307324DF2B2D008063CF /* YapsFileCell.swift */, + ECF5A75724E070710010A11D /* RawFileExtensions.swift */, ); path = Struct; sourceTree = ""; @@ -172,6 +175,7 @@ files = ( EC13305D24DAE92D008063CF /* ContentView.swift in Sources */, EC13307124DDB3F4008063CF /* FinderHelper.swift in Sources */, + ECF5A75824E070710010A11D /* RawFileExtensions.swift in Sources */, EC13306F24DD687F008063CF /* YapsFile.swift in Sources */, EC13307424DF2B2D008063CF /* YapsFileCell.swift in Sources */, EC13305B24DAE92D008063CF /* AppDelegate.swift in Sources */, diff --git a/YAPS/YAPS/AppDelegate.swift b/YAPS/YAPS/AppDelegate.swift index 14aa509..2f56d9a 100644 --- a/YAPS/YAPS/AppDelegate.swift +++ b/YAPS/YAPS/AppDelegate.swift @@ -17,7 +17,7 @@ class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ aNotification: Notification) { // Create the SwiftUI view that provides the window contents. - let contentView = ContentView(finderHelper: FinderHelper()) + let contentView = ContentView() // Create the window and set the content view. window = NSWindow( diff --git a/YAPS/YAPS/ContentView.swift b/YAPS/YAPS/ContentView.swift index 049f61a..89d7dac 100644 --- a/YAPS/YAPS/ContentView.swift +++ b/YAPS/YAPS/ContentView.swift @@ -10,58 +10,84 @@ import SwiftUI struct ContentView: View { @State var fileList = [YapsFile]() + @State var tabbedFile: YapsFile = YapsFile(name: "EMPTY", file: .init(fileURLWithPath: "Y")) @State var previewImg = Image("placeholder-image") + @State var destinationDefined: Bool = false + @State var destinationURL: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] + + let finderHelper: FinderHelper = FinderHelper() - var finderHelper: FinderHelper var body: some View { - HStack { - VStack(alignment: .leading) { - HStack { - Button(action: { - let files = self.finderHelper.selectFolder() + VStack { + HStack { + VStack(alignment: .leading) { + HStack { + Button(action: { + let files = self.finderHelper.askForFolderAndGetFiles() + + if files.count > 0 { + self.fileList.removeAll() + self.fileList.append(contentsOf: files) + } + }) { + Text("Select Folder") + } - if files.count > 0 { - self.fileList.removeAll() - self.fileList.append(contentsOf: files) + Button(action: { + if !self.destinationDefined { + self.destinationURL = self.finderHelper.selectFolder(modalTitle: "Choose destination folder.") + self.destinationDefined = true + } + self.finderHelper.iLikeThisImage(yapsFile: self.tabbedFile, destination: self.destinationURL) + }) { + Text("Get It!") } - }) { - Text("Select Folder") } + + List { + ForEach(self.fileList, id: \.self) { yapsFile in + YapsFileCell(yapsFile: yapsFile) + .focusable(true, onFocusChange: { (focusChanged) in + //self.focused = focusChanged + print("focus changed \(focusChanged)") + }) + .onTapGesture(perform: { + let selectedImageURL: URL = yapsFile.file + + print("pressed \(yapsFile.name)") + + self.previewImg = FinderHelper().getImageByURL(source: selectedImageURL) + .resizable() + + self.tabbedFile = yapsFile + }) + .onMoveCommand { (direction) in + print("direction: \(direction)") + } + } + } + .listStyle(SidebarListStyle()) } + .frame(width: 200.0) - List { - ForEach(self.fileList, id: \.self) { yapsFile in - YapsFileCell(yapsFile: yapsFile) - .focusable() - .onTapGesture(perform: { - let selectedImageURL: URL = yapsFile.file - - print("pressed \(yapsFile.name)") - - self.previewImg = FinderHelper().getImageByURL(source: selectedImageURL) - .resizable() - }) - .onMoveCommand { (direction) in - print("direction: \(direction)") - } - } + GeometryReader { geo in + self.previewImg.self + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: geo.size.width) } } - .frame(width: 150.0) - GeometryReader { geo in - self.previewImg.self - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: geo.size.width) - } + Text("\(self.tabbedFile.file.absoluteString)") + .multilineTextAlignment(.leading) + .lineLimit(1) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { - ContentView(finderHelper: FinderHelper()) + ContentView() } } diff --git a/YAPS/YAPS/FinderHelper.swift b/YAPS/YAPS/FinderHelper.swift index b3e1d54..12abb5e 100644 --- a/YAPS/YAPS/FinderHelper.swift +++ b/YAPS/YAPS/FinderHelper.swift @@ -11,11 +11,11 @@ import SwiftUI class FinderHelper { - func selectFolder() -> [YapsFile] { + func selectFolder(modalTitle: String) -> URL { let dialog = NSOpenPanel(); - var fileList = [YapsFile]() - - dialog.title = "Select folder of images" + var selectedFolder: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] + + dialog.title = modalTitle dialog.showsResizeIndicator = true dialog.showsHiddenFiles = false dialog.allowsMultipleSelection = false @@ -26,15 +26,19 @@ class FinderHelper { let result = dialog.url if(result != nil) { - let path: String = result!.path - print("Use \(path)") - fileList.append(contentsOf: getFilesList(path: result!)) + selectedFolder = result! } } else { // User clicked on "Cancel" } + + return selectedFolder + } + + func askForFolderAndGetFiles() -> [YapsFile] { + let sourceFolder = selectFolder(modalTitle: "Select image folder") - return fileList + return getFilesList(path: sourceFolder) } func getFilesList(path: URL) -> [YapsFile] { @@ -77,4 +81,67 @@ class FinderHelper { return Image(nsImage: image) } + + func iLikeThisImage(yapsFile: YapsFile, destination: URL) { + var srcURL = yapsFile.file + + if isRAWavailable(yapsFile: yapsFile) { + let raw = getRAW(yapsFile: yapsFile) + srcURL = raw + //print("i would like to copy \(raw.absoluteString)") + } else { + //print("no raw file, copy JPG instead") + } + + let dstURL = destination.appendingPathComponent(srcURL.lastPathComponent) + + print("to \(dstURL.absoluteString)") + + do { + try FileManager.default.copyItem(at: srcURL, to: dstURL) + } catch (let error) { + print("Cannot copy item at \(srcURL) to \(dstURL): \(error)") + } + } + + func isRAWavailable(yapsFile: YapsFile) -> Bool { + let fullPathJPG = yapsFile.file.path + var fileFound: Bool = false + + for extensionEntry in RawFileExtensions.allCases { + let fileToCheckFullPath = fullPathJPG.replacingOccurrences(of: yapsFile.file.pathExtension, with: "\(extensionEntry)") + //let fileToCheckURL = URL(fileURLWithPath: fileToCheckFullPath) + let fileManager = FileManager.default + var isDir: ObjCBool = false + + if fileManager.fileExists(atPath: fileToCheckFullPath, isDirectory:&isDir) { + if isDir.boolValue { + // file exists and is a directory + } else { + // file exists and is not a directory + fileFound = true + } + } else { + // file does not exist + } + } + + return fileFound + } + + func getRAW(yapsFile: YapsFile) -> URL { + let fullPathJPG = yapsFile.file.path + var fullPathRAW: String = "" + + for extensionEntry in RawFileExtensions.allCases { + let fileToCheck = fullPathJPG.replacingOccurrences(of: yapsFile.file.pathExtension, with: "\(extensionEntry)") + let fileToCheckURL = URL(fileURLWithPath: fileToCheck) + + if FileManager.default.fileExists(atPath: fileToCheckURL.path) { + fullPathRAW = fileToCheck + } + } + + return URL(fileURLWithPath: fullPathRAW) + } } diff --git a/YAPS/YAPS/Struct/RawFileExtensions.swift b/YAPS/YAPS/Struct/RawFileExtensions.swift new file mode 100644 index 0000000..d55a8cd --- /dev/null +++ b/YAPS/YAPS/Struct/RawFileExtensions.swift @@ -0,0 +1,55 @@ +// +// RawFileExtensionscase swift +// YAPS +// +// Created by Gerrit Linnemann on 09case 08case 20case +// Copyright © 2020 Adawim UG (haftungsbeschränkt)case All rights reservedcase +// + +import Foundation + +enum RawFileExtensions: CaseIterable { + //case 3fr + case ari + case arw + case bay + case braw + case crw + case cr2 + case cr3 + case cap + case data + case dcs + case dcr + case dng + case drf + case eip + case erf + case fff + case gpr + case iiq + case k25 + case kdc + case mdc + case mef + case mos + case mrw + case nef + case nrw + case obm + case orf + case pef + case ptx + case pxn + case r3d + case raf + case raw + case rwl + case rw2 + case rwz + case sr2 + case srf + case srw + case tif + case x3f +} diff --git a/YAPS/YAPS/Struct/YapsFileCell.swift b/YAPS/YAPS/Struct/YapsFileCell.swift index 9831803..a8a09b6 100644 --- a/YAPS/YAPS/Struct/YapsFileCell.swift +++ b/YAPS/YAPS/Struct/YapsFileCell.swift @@ -22,11 +22,7 @@ struct YapsFileCell: View { // Text Text(yapsFile.name) - .foregroundColor(self.focused ? .red : .green) + .foregroundColor(self.focused ? .blue : .gray) } - .focusable(true, onFocusChange: { (focusChanged) in - self.focused = focusChanged - print("focus changed \(focusChanged)") - }) } } diff --git a/YAPS/YAPS/YAPS.entitlements b/YAPS/YAPS/YAPS.entitlements index f2ef3ae..649916d 100644 --- a/YAPS/YAPS/YAPS.entitlements +++ b/YAPS/YAPS/YAPS.entitlements @@ -2,9 +2,11 @@ - com.apple.security.app-sandbox - - com.apple.security.files.user-selected.read-only - + com.apple.security.app-sandbox + + com.apple.security.device.usb + + com.apple.security.files.user-selected.read-write +