From 0dce6e3988c5b9fbf6744d4d49f6111c44634186 Mon Sep 17 00:00:00 2001 From: Gerrit Linnemann Date: Sat, 8 Aug 2020 16:33:26 +0200 Subject: [PATCH] Foto-Vorschau --- .../file_jpg.imageset/Contents.json | 21 ++++ .../file_jpg.imageset/file_jpg.png | Bin 0 -> 4259 bytes .../placeholder-image.imageset/Contents.json | 21 ++++ .../placeholder-image.png | Bin 0 -> 4106 bytes YAPS/YAPS/ContentView.swift | 24 ++-- YAPS/YAPS/FinderHelper.swift | 103 +++++++++++------- 6 files changed, 122 insertions(+), 47 deletions(-) create mode 100644 YAPS/YAPS/Assets.xcassets/file_jpg.imageset/Contents.json create mode 100644 YAPS/YAPS/Assets.xcassets/file_jpg.imageset/file_jpg.png create mode 100644 YAPS/YAPS/Assets.xcassets/placeholder-image.imageset/Contents.json create mode 100644 YAPS/YAPS/Assets.xcassets/placeholder-image.imageset/placeholder-image.png diff --git a/YAPS/YAPS/Assets.xcassets/file_jpg.imageset/Contents.json b/YAPS/YAPS/Assets.xcassets/file_jpg.imageset/Contents.json new file mode 100644 index 0000000..52ffe18 --- /dev/null +++ b/YAPS/YAPS/Assets.xcassets/file_jpg.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "file_jpg.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YAPS/YAPS/Assets.xcassets/file_jpg.imageset/file_jpg.png b/YAPS/YAPS/Assets.xcassets/file_jpg.imageset/file_jpg.png new file mode 100644 index 0000000000000000000000000000000000000000..45bb7339352886b76fa3c666bcd12cdfd1b22bbd GIT binary patch literal 4259 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 literal 0 HcmV?d00001 diff --git a/YAPS/YAPS/Assets.xcassets/placeholder-image.imageset/Contents.json b/YAPS/YAPS/Assets.xcassets/placeholder-image.imageset/Contents.json new file mode 100644 index 0000000..4d1655f --- /dev/null +++ b/YAPS/YAPS/Assets.xcassets/placeholder-image.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "placeholder-image.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YAPS/YAPS/Assets.xcassets/placeholder-image.imageset/placeholder-image.png b/YAPS/YAPS/Assets.xcassets/placeholder-image.imageset/placeholder-image.png new file mode 100644 index 0000000000000000000000000000000000000000..52deaa60838b8dcc86ff37f2ec608eb95f76fc52 GIT binary patch literal 4106 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 literal 0 HcmV?d00001 diff --git a/YAPS/YAPS/ContentView.swift b/YAPS/YAPS/ContentView.swift index 92c2708..2301cd8 100644 --- a/YAPS/YAPS/ContentView.swift +++ b/YAPS/YAPS/ContentView.swift @@ -11,14 +11,16 @@ import SwiftUI struct ContentView: View { @State var fileList = [YapsFile]() + @State var previewImg = Image("placeholder-image") var finderHelper: FinderHelper var body: some View { HStack { - VStack { + VStack(alignment: .leading) { HStack { Button(action: { + self.fileList.removeAll() self.fileList.append(contentsOf: self.finderHelper.selectFolder()) }) { Text("Select Folder") @@ -28,21 +30,29 @@ struct ContentView: View { List { ForEach(self.fileList, id: \.self) { yapsFile in HStack { - Image("file_raw").resizable().frame(width: 20, height: 20) + self.finderHelper.getImageByFiletype(file: yapsFile.file).resizable().frame(width: 20, height: 20) Text(yapsFile.name) } .onTapGesture(perform: { + let selectedImageURL: URL = yapsFile.file + print("pressed \(yapsFile.name)") + + self.previewImg = self.finderHelper.getImageByURL(source: selectedImageURL) + .resizable() }) } - } - - Text("THUMBNAIL") + .focusable() } + .frame(width: 150.0) - Text("Hello, World!") - .frame(maxWidth: .infinity, maxHeight: .infinity) + GeometryReader { geo in + self.previewImg.self + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: geo.size.width) + } } } } diff --git a/YAPS/YAPS/FinderHelper.swift b/YAPS/YAPS/FinderHelper.swift index 790ed40..b3e1d54 100644 --- a/YAPS/YAPS/FinderHelper.swift +++ b/YAPS/YAPS/FinderHelper.swift @@ -10,48 +10,71 @@ import Foundation import SwiftUI class FinderHelper { + + func selectFolder() -> [YapsFile] { + let dialog = NSOpenPanel(); + var fileList = [YapsFile]() - func selectFolder() -> [YapsFile] { - let dialog = NSOpenPanel(); - var fileList = [YapsFile]() - - dialog.title = "Select folder of images" - dialog.showsResizeIndicator = true - dialog.showsHiddenFiles = false - dialog.allowsMultipleSelection = false - dialog.canChooseFiles = false - dialog.canChooseDirectories = true - - if(dialog.runModal() == NSApplication.ModalResponse.OK) { - let result = dialog.url - - if(result != nil) { - let path: String = result!.path - print("Use \(path)") - fileList.append(contentsOf: getFilesList(path: result!)) - } - } else { - // User clicked on "Cancel" - } - - return fileList + dialog.title = "Select folder of images" + dialog.showsResizeIndicator = true + dialog.showsHiddenFiles = false + dialog.allowsMultipleSelection = false + dialog.canChooseFiles = false + dialog.canChooseDirectories = true + + if(dialog.runModal() == NSApplication.ModalResponse.OK) { + let result = dialog.url + + if(result != nil) { + let path: String = result!.path + print("Use \(path)") + fileList.append(contentsOf: getFilesList(path: result!)) + } + } else { + // User clicked on "Cancel" } - func getFilesList(path: URL) -> [YapsFile] { - let fm = FileManager.default - var fileList = [YapsFile]() - - do { - let items = try fm.contentsOfDirectory(at: path, includingPropertiesForKeys: nil, options: .skipsHiddenFiles) - - for item in items { - let yapsFile: YapsFile = YapsFile(name: item.lastPathComponent, file: item) - fileList.append(yapsFile) - } - } catch { - // failed to read directory – bad permissions, perhaps? - } - - return fileList + return fileList + } + + func getFilesList(path: URL) -> [YapsFile] { + let fm = FileManager.default + var fileList = [YapsFile]() + + do { + let items = try fm.contentsOfDirectory(at: path, includingPropertiesForKeys: nil, options: .skipsHiddenFiles).filter{ $0.pathExtension == "jpg" || $0.pathExtension == "jpeg" } + + for item in items { + let yapsFile: YapsFile = YapsFile(name: item.lastPathComponent, file: item) + fileList.append(yapsFile) + } + } catch { + // failed to read directory – bad permissions, perhaps? } + + return fileList + } + + func getImageByFiletype(file: URL) -> Image { + let fileExtension = file.pathExtension + var image = Image("file") + + switch fileExtension { + case "jpg": + image = Image("file_jpg") + case "raw": + image = Image("file_raw") + default: + print("No image found for extenstion \(fileExtension)") + } + + return image + } + + func getImageByURL(source: URL) -> Image { + let imageData:NSData = NSData(contentsOf: source)! + let image = NSImage(data: imageData as Data)! + + return Image(nsImage: image) + } }