Working Skelleton

This commit is contained in:
Gerrit Linnemann 2020-08-11 16:34:37 +02:00
parent 661f8c7dca
commit b5f062e4b6
7 changed files with 203 additions and 53 deletions

View File

@ -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 = "<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>"; };
ECF5A75724E070710010A11D /* RawFileExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RawFileExtensions.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -95,6 +97,7 @@
isa = PBXGroup;
children = (
EC13307324DF2B2D008063CF /* YapsFileCell.swift */,
ECF5A75724E070710010A11D /* RawFileExtensions.swift */,
);
path = Struct;
sourceTree = "<group>";
@ -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 */,

View File

@ -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(

View File

@ -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()
}
}

View File

@ -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)
}
}

View 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
}

View File

@ -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)")
})
}
}

View File

@ -2,9 +2,11 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.device.usb</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
</dict>
</plist>