Skip to main content

now put thumbnails in the scrollbar

ID
015884c
date
2023-06-08 07:52:45+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
b7b2d78
message
now put thumbnails in the scrollbar
changed files
2 files, 54 additions, 14 deletions

Changed files

BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (1859) → BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (1838)

diff --git a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
index df0dbe0..3a61540 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
@@ -18,8 +18,8 @@ struct PhotoReviewer: View {
             ScrollViewReader { proxy in
                 ScrollView(.horizontal) {
                     LazyHStack(spacing: 10) {
-                        ForEach(assets, id: \.localIdentifier) { photo in
-                            ThumbnailItem(label: "\(photo.localIdentifier)")
+                        ForEach(assets, id: \.localIdentifier) { asset in
+                            ThumbnailItem(asset: asset)
                         }
                     }.padding()
                 }.frame(height: 100)

BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift (513) → BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift (2010)

diff --git a/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift b/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
index f00eb8c..2febcd5 100644
--- a/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/ThumbnailItem.swift
@@ -6,23 +6,63 @@
 //
 
 import SwiftUI
+import Photos
+
+extension PHAsset {
+    func getThumbnail() -> NSImage {
+        // This implementation is based on code in a Stack Overflow answer
+        // by Francois Nadeau: https://stackoverflow.com/a/48755517/1558022
+
+        let options = PHImageRequestOptions()
+        options.isSynchronous = true
+
+        // If i don't set this value, then sometimes I get an error like
+        // this in the `info` variable:
+        //
+        //      Error Domain=PHPhotosErrorDomain Code=3164 "(null)"
+        //
+        // This means that the asset is in the cloud, and by default Photos
+        // isn't allowed to download assets here.  Apple's documentation
+        // suggests adding this option as the fix.
+        //
+        // See https://developer.apple.com/documentation/photokit/phphotoserror/phphotoserrornetworkaccessrequired
+        options.isNetworkAccessAllowed = true
+
+        var image = NSImage()
+        
+        let start = DispatchTime.now()
+        var elapsed = start
+
+        func printElapsed(_ label: String) -> Void {
+          let now = DispatchTime.now()
+
+          let totalInterval = Double(now.uptimeNanoseconds - start.uptimeNanoseconds) / 1_000_000_000
+          let elapsedInterval = Double(now.uptimeNanoseconds - elapsed.uptimeNanoseconds) / 1_000_000_000
+
+          elapsed = DispatchTime.now()
+        }
+        
+        PHCachingImageManager()
+            .requestImage(
+                for: self,
+                targetSize: CGSize(width: 50, height: 50),
+                contentMode: .aspectFit,
+                options: options,
+                resultHandler: { (result, info) -> Void in
+                    image = result!
+                }
+            )
+
+        return image
+    }
+}
 
 struct ThumbnailItem: View {
-    @State var label: String
+    @State var asset: PHAsset
     
     var body: some View {
         ZStack {
-            Circle()
-                .fill(.yellow)
-                .frame(width: 70, height: 70)
-            Text(label)
-                .font(.title)
+            Image(nsImage: asset.getThumbnail())
         }
     }
 }
-
-struct ThumbnailItem_Previews: PreviewProvider {
-    static var previews: some View {
-        ThumbnailItem(label: "1")
-    }
-}