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 deletionsBlinkReviewer/BlinkReviewer.xcodeproj/project.pbxprojBlinkReviewer/BlinkReviewer/BlinkReviewerApp.swiftBlinkReviewer/BlinkReviewer/ContentView.swiftBlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swiftBlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swiftBlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift
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