Working Skelleton
This commit is contained in:
parent
661f8c7dca
commit
b5f062e4b6
@ -15,6 +15,7 @@
|
|||||||
EC13306F24DD687F008063CF /* YapsFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC13306E24DD687F008063CF /* YapsFile.swift */; };
|
EC13306F24DD687F008063CF /* YapsFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC13306E24DD687F008063CF /* YapsFile.swift */; };
|
||||||
EC13307124DDB3F4008063CF /* FinderHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC13307024DDB3F4008063CF /* FinderHelper.swift */; };
|
EC13307124DDB3F4008063CF /* FinderHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC13307024DDB3F4008063CF /* FinderHelper.swift */; };
|
||||||
EC13307424DF2B2D008063CF /* YapsFileCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC13307324DF2B2D008063CF /* YapsFileCell.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 */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
@ -29,6 +30,7 @@
|
|||||||
EC13306E24DD687F008063CF /* YapsFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YapsFile.swift; sourceTree = "<group>"; };
|
EC13306E24DD687F008063CF /* YapsFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YapsFile.swift; sourceTree = "<group>"; };
|
||||||
EC13307024DDB3F4008063CF /* FinderHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinderHelper.swift; sourceTree = "<group>"; };
|
EC13307024DDB3F4008063CF /* FinderHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinderHelper.swift; sourceTree = "<group>"; };
|
||||||
EC13307324DF2B2D008063CF /* YapsFileCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YapsFileCell.swift; sourceTree = "<group>"; };
|
EC13307324DF2B2D008063CF /* YapsFileCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YapsFileCell.swift; sourceTree = "<group>"; };
|
||||||
|
ECF5A75724E070710010A11D /* RawFileExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawFileExtensions.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@ -95,6 +97,7 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
EC13307324DF2B2D008063CF /* YapsFileCell.swift */,
|
EC13307324DF2B2D008063CF /* YapsFileCell.swift */,
|
||||||
|
ECF5A75724E070710010A11D /* RawFileExtensions.swift */,
|
||||||
);
|
);
|
||||||
path = Struct;
|
path = Struct;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -172,6 +175,7 @@
|
|||||||
files = (
|
files = (
|
||||||
EC13305D24DAE92D008063CF /* ContentView.swift in Sources */,
|
EC13305D24DAE92D008063CF /* ContentView.swift in Sources */,
|
||||||
EC13307124DDB3F4008063CF /* FinderHelper.swift in Sources */,
|
EC13307124DDB3F4008063CF /* FinderHelper.swift in Sources */,
|
||||||
|
ECF5A75824E070710010A11D /* RawFileExtensions.swift in Sources */,
|
||||||
EC13306F24DD687F008063CF /* YapsFile.swift in Sources */,
|
EC13306F24DD687F008063CF /* YapsFile.swift in Sources */,
|
||||||
EC13307424DF2B2D008063CF /* YapsFileCell.swift in Sources */,
|
EC13307424DF2B2D008063CF /* YapsFileCell.swift in Sources */,
|
||||||
EC13305B24DAE92D008063CF /* AppDelegate.swift in Sources */,
|
EC13305B24DAE92D008063CF /* AppDelegate.swift in Sources */,
|
||||||
|
|||||||
@ -17,7 +17,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
|||||||
|
|
||||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||||
// Create the SwiftUI view that provides the window contents.
|
// 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.
|
// Create the window and set the content view.
|
||||||
window = NSWindow(
|
window = NSWindow(
|
||||||
|
|||||||
@ -10,16 +10,21 @@ import SwiftUI
|
|||||||
|
|
||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
@State var fileList = [YapsFile]()
|
@State var fileList = [YapsFile]()
|
||||||
|
@State var tabbedFile: YapsFile = YapsFile(name: "EMPTY", file: .init(fileURLWithPath: "Y"))
|
||||||
@State var previewImg = Image("placeholder-image")
|
@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 {
|
var body: some View {
|
||||||
|
VStack {
|
||||||
HStack {
|
HStack {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
HStack {
|
HStack {
|
||||||
Button(action: {
|
Button(action: {
|
||||||
let files = self.finderHelper.selectFolder()
|
let files = self.finderHelper.askForFolderAndGetFiles()
|
||||||
|
|
||||||
if files.count > 0 {
|
if files.count > 0 {
|
||||||
self.fileList.removeAll()
|
self.fileList.removeAll()
|
||||||
@ -28,12 +33,25 @@ struct ContentView: View {
|
|||||||
}) {
|
}) {
|
||||||
Text("Select Folder")
|
Text("Select Folder")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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!")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List {
|
List {
|
||||||
ForEach(self.fileList, id: \.self) { yapsFile in
|
ForEach(self.fileList, id: \.self) { yapsFile in
|
||||||
YapsFileCell(yapsFile: yapsFile)
|
YapsFileCell(yapsFile: yapsFile)
|
||||||
.focusable()
|
.focusable(true, onFocusChange: { (focusChanged) in
|
||||||
|
//self.focused = focusChanged
|
||||||
|
print("focus changed \(focusChanged)")
|
||||||
|
})
|
||||||
.onTapGesture(perform: {
|
.onTapGesture(perform: {
|
||||||
let selectedImageURL: URL = yapsFile.file
|
let selectedImageURL: URL = yapsFile.file
|
||||||
|
|
||||||
@ -41,14 +59,17 @@ struct ContentView: View {
|
|||||||
|
|
||||||
self.previewImg = FinderHelper().getImageByURL(source: selectedImageURL)
|
self.previewImg = FinderHelper().getImageByURL(source: selectedImageURL)
|
||||||
.resizable()
|
.resizable()
|
||||||
|
|
||||||
|
self.tabbedFile = yapsFile
|
||||||
})
|
})
|
||||||
.onMoveCommand { (direction) in
|
.onMoveCommand { (direction) in
|
||||||
print("direction: \(direction)")
|
print("direction: \(direction)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.listStyle(SidebarListStyle())
|
||||||
}
|
}
|
||||||
.frame(width: 150.0)
|
.frame(width: 200.0)
|
||||||
|
|
||||||
GeometryReader { geo in
|
GeometryReader { geo in
|
||||||
self.previewImg.self
|
self.previewImg.self
|
||||||
@ -57,11 +78,16 @@ struct ContentView: View {
|
|||||||
.frame(width: geo.size.width)
|
.frame(width: geo.size.width)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Text("\(self.tabbedFile.file.absoluteString)")
|
||||||
|
.multilineTextAlignment(.leading)
|
||||||
|
.lineLimit(1)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ContentView_Previews: PreviewProvider {
|
struct ContentView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
ContentView(finderHelper: FinderHelper())
|
ContentView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,11 +11,11 @@ import SwiftUI
|
|||||||
|
|
||||||
class FinderHelper {
|
class FinderHelper {
|
||||||
|
|
||||||
func selectFolder() -> [YapsFile] {
|
func selectFolder(modalTitle: String) -> URL {
|
||||||
let dialog = NSOpenPanel();
|
let dialog = NSOpenPanel();
|
||||||
var fileList = [YapsFile]()
|
var selectedFolder: URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
|
||||||
|
|
||||||
dialog.title = "Select folder of images"
|
dialog.title = modalTitle
|
||||||
dialog.showsResizeIndicator = true
|
dialog.showsResizeIndicator = true
|
||||||
dialog.showsHiddenFiles = false
|
dialog.showsHiddenFiles = false
|
||||||
dialog.allowsMultipleSelection = false
|
dialog.allowsMultipleSelection = false
|
||||||
@ -26,15 +26,19 @@ class FinderHelper {
|
|||||||
let result = dialog.url
|
let result = dialog.url
|
||||||
|
|
||||||
if(result != nil) {
|
if(result != nil) {
|
||||||
let path: String = result!.path
|
selectedFolder = result!
|
||||||
print("Use \(path)")
|
|
||||||
fileList.append(contentsOf: getFilesList(path: result!))
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// User clicked on "Cancel"
|
// User clicked on "Cancel"
|
||||||
}
|
}
|
||||||
|
|
||||||
return fileList
|
return selectedFolder
|
||||||
|
}
|
||||||
|
|
||||||
|
func askForFolderAndGetFiles() -> [YapsFile] {
|
||||||
|
let sourceFolder = selectFolder(modalTitle: "Select image folder")
|
||||||
|
|
||||||
|
return getFilesList(path: sourceFolder)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getFilesList(path: URL) -> [YapsFile] {
|
func getFilesList(path: URL) -> [YapsFile] {
|
||||||
@ -77,4 +81,67 @@ class FinderHelper {
|
|||||||
|
|
||||||
return Image(nsImage: image)
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
55
YAPS/YAPS/Struct/RawFileExtensions.swift
Normal file
55
YAPS/YAPS/Struct/RawFileExtensions.swift
Normal file
@ -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
|
||||||
|
}
|
||||||
@ -22,11 +22,7 @@ struct YapsFileCell: View {
|
|||||||
|
|
||||||
// Text
|
// Text
|
||||||
Text(yapsFile.name)
|
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)")
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,7 +4,9 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.security.app-sandbox</key>
|
<key>com.apple.security.app-sandbox</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.security.files.user-selected.read-only</key>
|
<key>com.apple.security.device.usb</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.files.user-selected.read-write</key>
|
||||||
<true/>
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user