Skip to main content

try shoving state around

ID
1c965af
date
2023-06-09 08:07:35+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
6b253b0
message
try shoving state around
changed files
3 files, 32 additions, 15 deletions

Changed files

BlinkReviewer/BlinkReviewer/Views/FullSizeImage.swift (1140) → BlinkReviewer/BlinkReviewer/Views/FullSizeImage.swift (900)

diff --git a/BlinkReviewer/BlinkReviewer/Views/FullSizeImage.swift b/BlinkReviewer/BlinkReviewer/Views/FullSizeImage.swift
index 41385ff..fa74b0f 100644
--- a/BlinkReviewer/BlinkReviewer/Views/FullSizeImage.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/FullSizeImage.swift
@@ -9,12 +9,7 @@ import Photos
 import SwiftUI
 
 struct FullSizeImage: View {
-    @ObservedObject var image: PHAssetImage = PHAssetImage(nil, size: PHImageManagerMaximumSize)
-    
-    init(asset: PHAsset) {
-        print("Calling FullSizeImage.init() for \(asset.localIdentifier)")
-        self.image = PHAssetImage(asset, size: PHImageManagerMaximumSize)
-    }
+    @ObservedObject var image: PHAssetImage
     
     var body: some View {
         ZStack {

BlinkReviewer/BlinkReviewer/Views/PHAssetImage.swift (1919) → BlinkReviewer/BlinkReviewer/Views/PHAssetImage.swift (2136)

diff --git a/BlinkReviewer/BlinkReviewer/Views/PHAssetImage.swift b/BlinkReviewer/BlinkReviewer/Views/PHAssetImage.swift
index 44c254d..486f432 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PHAssetImage.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PHAssetImage.swift
@@ -10,25 +10,38 @@ import Photos
 
 class PHAssetImage: NSObject, ObservableObject {
 
-    var asset: PHAsset?
-    var size: CGSize
-    
     @Published var image = NSImage()
     @Published var isPhotoLibraryAuthorized = false
 
     init(_ asset: PHAsset?, size: CGSize) {
-        self.asset = asset
         self.size = size
         
         super.init()
         
+        self.asset = asset
+    }
+    
+    var _asset: PHAsset?
+    var size: CGSize
+    
+    var asset: PHAsset? {
+        get {
+            self._asset
+        }
+        
+        set {
+            self._asset = newValue
+            regenerateImage()
+        }
+    }
+        
+    private func regenerateImage() {
         if let thisAsset = asset {
             // This implementation is based on code in a Stack Overflow answer
             // by Francois Nadeau: https://stackoverflow.com/a/48755517/1558022
             
             let options = PHImageRequestOptions()
             
-            // do I still need this?
             options.isSynchronous = false
             
             // If i don't set this value, then sometimes I get an error like
@@ -43,14 +56,14 @@ class PHAssetImage: NSObject, ObservableObject {
             // See https://developer.apple.com/documentation/photokit/phphotoserror/phphotoserrornetworkaccessrequired
             options.isNetworkAccessAllowed = true
             
-            PHCachingImageManager()
+            PHCachingImageManager.default()
                 .requestImage(
                     for: thisAsset,
                     targetSize: size,
                     contentMode: .aspectFill,
                     options: options,
                     resultHandler: { (result, info) -> Void in
-                        print("Calling resultHandler for \(thisAsset.localIdentifier)")
+                        print("Calling resultHandler for \(thisAsset.localIdentifier) / \(info)")
                         self.image = result!
                     }
                 )

BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (4063) → BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (4477)

diff --git a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
index 78abb26..abe2aa9 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
@@ -10,23 +10,32 @@ import Photos
 
 struct PhotoReviewer: View {
     @EnvironmentObject var photosLibrary: PhotosLibrary
+    @ObservedObject var fullSizeImage: PHAssetImage = PHAssetImage(nil, size: PHImageManagerMaximumSize)
     
     @State var selectedAssetIndex: Int
     
+    init(selectedAssetIndex: Int) {
+        self.selectedAssetIndex = selectedAssetIndex
+    }
+    
     var body: some View {
         if photosLibrary.isPhotoLibraryAuthorized {
             VStack {
                 ThumbnailList(selectedAssetIndex: $selectedAssetIndex)
                     .environmentObject(photosLibrary)
                 
-                FullSizeImage(asset: photosLibrary.assets[selectedAssetIndex])
+                FullSizeImage(image: fullSizeImage)
                     .background(.black)
             }.onAppear {
+                fullSizeImage.asset = photosLibrary.assets[selectedAssetIndex]
+                
                 NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
                     handleKeyEvent(event)
                     return event
                 }
-            }
+            }.onChange(of: selectedAssetIndex, perform: { newIndex in
+                fullSizeImage.asset = photosLibrary.assets[newIndex]
+            })
         } else {
             Text("Waiting for Photos Library authorization…")
         }