Skip to main content

get toggling working for favouites

ID
b17a278
date
2023-06-08 23:33:43+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
42064a2
message
get toggling working for favouites
changed files
6 files, 67 additions, 22 deletions

Changed files

BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (26189) → BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (26201)

diff --git a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
index 835d563..8d8a948 100644
--- a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
+++ b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
@@ -9,8 +9,8 @@
 /* Begin PBXBuildFile section */
 		94D2C8B92A320E6F00BEE15B /* ReviewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D2C8B82A320E6F00BEE15B /* ReviewState.swift */; };
 		94D2C8BD2A32796500BEE15B /* AlbumHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D2C8BC2A32796500BEE15B /* AlbumHelpers.swift */; };
+		94D2C8BF2A3299BD00BEE15B /* PhotosLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D2C8BE2A3299BD00BEE15B /* PhotosLibrary.swift */; };
 		94D750F02A31A796005859E7 /* BlinkReviewerApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D750EF2A31A796005859E7 /* BlinkReviewerApp.swift */; };
-		94D750F22A31A796005859E7 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D750F12A31A796005859E7 /* ContentView.swift */; };
 		94D750F42A31A797005859E7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 94D750F32A31A797005859E7 /* Assets.xcassets */; };
 		94D750F72A31A797005859E7 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 94D750F62A31A797005859E7 /* Preview Assets.xcassets */; };
 		94D751022A31A798005859E7 /* BlinkReviewerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D751012A31A798005859E7 /* BlinkReviewerTests.swift */; };
@@ -44,9 +44,9 @@
 /* Begin PBXFileReference section */
 		94D2C8B82A320E6F00BEE15B /* ReviewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReviewState.swift; sourceTree = "<group>"; };
 		94D2C8BC2A32796500BEE15B /* AlbumHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumHelpers.swift; sourceTree = "<group>"; };
+		94D2C8BE2A3299BD00BEE15B /* PhotosLibrary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotosLibrary.swift; sourceTree = "<group>"; };
 		94D750EC2A31A796005859E7 /* BlinkReviewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlinkReviewer.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		94D750EF2A31A796005859E7 /* BlinkReviewerApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlinkReviewerApp.swift; sourceTree = "<group>"; };
-		94D750F12A31A796005859E7 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
 		94D750F32A31A797005859E7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
 		94D750F62A31A797005859E7 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
 		94D750F82A31A797005859E7 /* BlinkReviewer.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = BlinkReviewer.entitlements; sourceTree = "<group>"; };
@@ -123,7 +123,6 @@
 				94D751272A31D61D005859E7 /* Photos */,
 				94D7511A2A31A7A6005859E7 /* Views */,
 				94D750EF2A31A796005859E7 /* BlinkReviewerApp.swift */,
-				94D750F12A31A796005859E7 /* ContentView.swift */,
 				94D750F32A31A797005859E7 /* Assets.xcassets */,
 				94D750F82A31A797005859E7 /* BlinkReviewer.entitlements */,
 				94D750F52A31A797005859E7 /* Preview Content */,
@@ -173,6 +172,7 @@
 			children = (
 				94D7512A2A31D6AC005859E7 /* AssetHelpers.swift */,
 				94D2C8BC2A32796500BEE15B /* AlbumHelpers.swift */,
+				94D2C8BE2A3299BD00BEE15B /* PhotosLibrary.swift */,
 			);
 			path = Photos;
 			sourceTree = "<group>";
@@ -308,9 +308,9 @@
 			buildActionMask = 2147483647;
 			files = (
 				94D7511C2A31A7B1005859E7 /* ThumbnailImage.swift in Sources */,
-				94D750F22A31A796005859E7 /* ContentView.swift in Sources */,
 				94D7512B2A31D6AC005859E7 /* AssetHelpers.swift in Sources */,
 				94D2C8BD2A32796500BEE15B /* AlbumHelpers.swift in Sources */,
+				94D2C8BF2A3299BD00BEE15B /* PhotosLibrary.swift in Sources */,
 				94D7511E2A31B243005859E7 /* PreviewImage.swift in Sources */,
 				94D750F02A31A796005859E7 /* BlinkReviewerApp.swift in Sources */,
 				94D751202A31B53E005859E7 /* AlbumInfo.swift in Sources */,

BlinkReviewer/BlinkReviewer/BlinkReviewerApp.swift (241) → BlinkReviewer/BlinkReviewer/BlinkReviewerApp.swift (347)

diff --git a/BlinkReviewer/BlinkReviewer/BlinkReviewerApp.swift b/BlinkReviewer/BlinkReviewer/BlinkReviewerApp.swift
index db7a252..3406ecd 100644
--- a/BlinkReviewer/BlinkReviewer/BlinkReviewerApp.swift
+++ b/BlinkReviewer/BlinkReviewer/BlinkReviewerApp.swift
@@ -11,7 +11,8 @@ import SwiftUI
 struct BlinkReviewerApp: App {
     var body: some Scene {
         WindowGroup {
-            ContentView()
+            PhotoReviewer(selectedAssetIndex: PhotosLibrary().assets.count - 1)
+                .environmentObject(PhotosLibrary())
         }
     }
 }

BlinkReviewer/BlinkReviewer/ContentView.swift (280) → BlinkReviewer/BlinkReviewer/ContentView.swift (248)

diff --git a/BlinkReviewer/BlinkReviewer/ContentView.swift b/BlinkReviewer/BlinkReviewer/ContentView.swift
index 707e3ca..b3727f7 100644
--- a/BlinkReviewer/BlinkReviewer/ContentView.swift
+++ b/BlinkReviewer/BlinkReviewer/ContentView.swift
@@ -8,7 +8,6 @@
 import SwiftUI
 
 struct ContentView: View {
-    var assets = getAllPhotos()
     
     var body: some View {
         PhotoReviewer(assets: assets, selectedAssetIndex: assets.count - 1)

BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift (0) → BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift (929)

diff --git a/BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift b/BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift
new file mode 100644
index 0000000..1b40479
--- /dev/null
+++ b/BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift
@@ -0,0 +1,36 @@
+//
+//  PhotosLibrary.swift
+//  BlinkReviewer
+//
+//  Created by Alex Chan on 09/06/2023.
+//
+
+import Foundation
+import Photos
+
+class PhotosLibrary: NSObject, ObservableObject, PHPhotoLibraryChangeObserver {
+
+    @Published var assets = getAllPhotos()
+    @Published var isPhotoLibraryAuthorized = false
+
+    override init() {
+        super.init()
+        PHPhotoLibrary.shared().register(self)
+        updateStatus()
+    }
+    
+    func updateAsset(atIndex index: Int) {
+        self.assets[index] = PHAsset.fetchAssets(withLocalIdentifiers: [self.assets[index].localIdentifier], options: nil).firstObject!
+    }
+
+    func photoLibraryDidChange(_ changeInstance: PHChange) {
+        updateStatus()
+    }
+
+    private func updateStatus() {
+        DispatchQueue.main.async {
+//            self.assets = getAllPhotos()
+            self.isPhotoLibraryAuthorized = PHPhotoLibrary.authorizationStatus() == .authorized
+        }
+    }
+}

BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (3339) → BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (3725)

diff --git a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
index 9c8b4b0..c4c98bf 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
@@ -9,25 +9,31 @@ import SwiftUI
 import Photos
 
 struct PhotoReviewer: View {
-    var assets: [PHAsset]
+    @EnvironmentObject var photosLibrary: PhotosLibrary
+    
     @State var selectedAssetIndex: Int
     
     var body: some View {
-        VStack {
-            ThumbnailList(assets: assets, selectedAssetIndex: $selectedAssetIndex)
-            
-            PreviewImage(asset: assets[selectedAssetIndex])
-                .background(.black)
-        }.onAppear {
-            NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
-                handleKeyEvent(event)
-                return event
+        if photosLibrary.isPhotoLibraryAuthorized {
+            VStack {
+                ThumbnailList(selectedAssetIndex: $selectedAssetIndex)
+                    .environmentObject(photosLibrary)
+                
+                PreviewImage(asset: photosLibrary.assets[selectedAssetIndex])
+                    .background(.black)
+            }.onAppear {
+                NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
+                    handleKeyEvent(event)
+                    return event
+                }
             }
+        } else {
+            Text("Waiting for Photos Library authorization…")
         }
     }
     
     private func handleKeyEvent(_ event: NSEvent) {
-        let asset = assets[selectedAssetIndex]
+        let asset = photosLibrary.assets[selectedAssetIndex]
         
         switch event.keyCode {
             case 123: // Left arrow key
@@ -36,7 +42,7 @@ struct PhotoReviewer: View {
                 }
             
             case 124: // Right arrow key
-                if selectedAssetIndex < assets.count - 1 {
+                if selectedAssetIndex < photosLibrary.assets.count - 1 {
                     selectedAssetIndex += 1
                 }
             
@@ -88,6 +94,8 @@ struct PhotoReviewer: View {
                     PHAssetChangeRequest(for: asset).isFavorite = !asset.isFavorite
                 }
             
+                photosLibrary.updateAsset(atIndex: selectedAssetIndex)
+            
             default:
                 print(event)
                 break

BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift (2937) → BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift (3010)

diff --git a/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift b/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift
index 6bacfef..01f2692 100644
--- a/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift
@@ -9,15 +9,16 @@ import SwiftUI
 import Photos
 
 struct ThumbnailList: View {
-    var assets: [PHAsset]
+    @EnvironmentObject var photosLibrary: PhotosLibrary
+
     @Binding var selectedAssetIndex: Int
     
     func displaySelectedAssetIndex() -> Int {
-        assets.count - 1 - selectedAssetIndex
+        photosLibrary.assets.count - 1 - selectedAssetIndex
     }
     
     func displayAssets() -> [PHAsset] {
-        assets.reversed()
+        photosLibrary.assets.reversed()
     }
     
     var body: some View {
@@ -37,7 +38,7 @@ struct ThumbnailList: View {
                             isFavorite: asset.isFavorite,
                             isSelected: displayAssets()[displaySelectedAssetIndex()].localIdentifier == asset.localIdentifier
                         ).onTapGesture {
-                            selectedAssetIndex = assets.count - 1 - index
+                            selectedAssetIndex = photosLibrary.assets.count - 1 - index
                         }
                     }
                     // Note: these two uses of RTL direction are a way to get the LazyHStack