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