Skip to main content

get a scrolling list of images

ID
6231083
date
2023-06-08 07:44:19+00:00
author
Alex Chan <alex@alexwlchan.net>
parent
eaa34f3
message
get a scrolling list of images
changed files
5 files, 86 additions, 45 deletions

Changed files

BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (23614) → BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (24062)

diff --git a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
index 4d642b8..2f0f404 100644
--- a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
+++ b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
@@ -17,6 +17,7 @@
 		94D7511C2A31A7B1005859E7 /* ThumbnailItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D7511B2A31A7B1005859E7 /* ThumbnailItem.swift */; };
 		94D7511E2A31B243005859E7 /* PreviewImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D7511D2A31B243005859E7 /* PreviewImage.swift */; };
 		94D751202A31B53E005859E7 /* AlbumInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D7511F2A31B53E005859E7 /* AlbumInfo.swift */; };
+		94D751222A31BD8E005859E7 /* PhotoReviewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D751212A31BD8E005859E7 /* PhotoReviewer.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -51,6 +52,7 @@
 		94D7511B2A31A7B1005859E7 /* ThumbnailItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThumbnailItem.swift; sourceTree = "<group>"; };
 		94D7511D2A31B243005859E7 /* PreviewImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreviewImage.swift; sourceTree = "<group>"; };
 		94D7511F2A31B53E005859E7 /* AlbumInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlbumInfo.swift; sourceTree = "<group>"; };
+		94D751212A31BD8E005859E7 /* PhotoReviewer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhotoReviewer.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -142,6 +144,7 @@
 				94D7511B2A31A7B1005859E7 /* ThumbnailItem.swift */,
 				94D7511D2A31B243005859E7 /* PreviewImage.swift */,
 				94D7511F2A31B53E005859E7 /* AlbumInfo.swift */,
+				94D751212A31BD8E005859E7 /* PhotoReviewer.swift */,
 			);
 			path = Views;
 			sourceTree = "<group>";
@@ -281,6 +284,7 @@
 				94D7511E2A31B243005859E7 /* PreviewImage.swift in Sources */,
 				94D750F02A31A796005859E7 /* BlinkReviewerApp.swift in Sources */,
 				94D751202A31B53E005859E7 /* AlbumInfo.swift in Sources */,
+				94D751222A31BD8E005859E7 /* PhotoReviewer.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

BlinkReviewer/BlinkReviewer/ContentView.swift (1516) → BlinkReviewer/BlinkReviewer/ContentView.swift (512)

diff --git a/BlinkReviewer/BlinkReviewer/ContentView.swift b/BlinkReviewer/BlinkReviewer/ContentView.swift
index 2525587..e8955b6 100644
--- a/BlinkReviewer/BlinkReviewer/ContentView.swift
+++ b/BlinkReviewer/BlinkReviewer/ContentView.swift
@@ -8,16 +8,6 @@
 import SwiftUI
 import Photos
 
-struct AssetData: Codable, Identifiable {
-    var localIdentifier: String
-    var creationDate: String?
-    var isFavorite: Bool
-    
-    var id: String {
-        localIdentifier
-    }
-}
-
 struct ContentView: View {
     var allPhotos: [PHAsset] {
         var photos: [PHAsset] = []
@@ -30,31 +20,7 @@ struct ContentView: View {
         return photos
     }
     
-    @State private var selectedAssetIndex: Int = 0
-    @State private var selectedAsset: PHAsset? = nil
-    
     var body: some View {
-        VStack {
-            Divider()
-            ScrollViewReader { value in
-                ScrollView(.horizontal) {
-                    Button("Jump to #8") {
-                        value.scrollTo(8, anchor: .center)
-                    }
-                    .padding()
-                    
-                    LazyHStack(spacing: 10) {
-                        ForEach(allPhotos, id: \.localIdentifier) { photo in
-                            ThumbnailItem(label: "\(photo.localIdentifier)")
-                        }
-                    }.padding()
-                }.frame(height: 100)
-            }
-            Divider()
-            
-            PreviewImage(asset: allPhotos[selectedAssetIndex])
-            
-            Spacer()
-        }
+        PhotoReviewer(assets: allPhotos)
     }
 }

BlinkReviewer/BlinkReviewer/Views/AlbumInfo.swift (1107) → BlinkReviewer/BlinkReviewer/Views/AlbumInfo.swift (1106)

diff --git a/BlinkReviewer/BlinkReviewer/Views/AlbumInfo.swift b/BlinkReviewer/BlinkReviewer/Views/AlbumInfo.swift
index d758343..9d3fd4f 100644
--- a/BlinkReviewer/BlinkReviewer/Views/AlbumInfo.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/AlbumInfo.swift
@@ -34,7 +34,7 @@ struct AlbumInfo: View {
                         .font(.title2)
                         .padding(5)
                         .background(Color(red: 1.0, green: 1.0, blue: 1.0, opacity: 0.9))
-                        .cornerRadius(10.0)
+                        .cornerRadius(7.0)
                 }
             }
         }.padding()

BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (0) → BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (1794)

diff --git a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
new file mode 100644
index 0000000..e3f6b0f
--- /dev/null
+++ b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
@@ -0,0 +1,63 @@
+//
+//  PhotoReviewer.swift
+//  BlinkReviewer
+//
+//  Created by Alex Chan on 08/06/2023.
+//
+
+import SwiftUI
+import Photos
+
+struct PhotoReviewer: View {
+    var assets: [PHAsset]
+    @State private var selectedAssetIndex: Int = 0
+    
+    var body: some View {
+        VStack {
+            Divider()
+            ScrollViewReader { value in
+                ScrollView(.horizontal) {
+                    LazyHStack(spacing: 10) {
+                        ForEach(assets, id: \.localIdentifier) { photo in
+                            ThumbnailItem(label: "\(photo.localIdentifier)")
+                        }
+                    }.padding()
+                }.frame(height: 100).onAppear {
+                    value.scrollTo(assets[selectedAssetIndex].localIdentifier, anchor: .center)
+                }
+            }
+            Divider()
+            
+            PreviewImage(asset: assets[selectedAssetIndex])
+            
+            Spacer()
+        }.onAppear {
+            NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
+                
+                print("about to handle event \(event)")
+                handleKeyEvent(event)
+                print("finished handling event \(event)")
+                
+                return event
+            }
+        }
+    }
+    
+    private func handleKeyEvent(_ event: NSEvent) {
+        switch event.keyCode {
+            case 123: // Left arrow key
+                if selectedAssetIndex > 0 {
+                    selectedAssetIndex -= 1
+                }
+            
+            case 124: // Right arrow key
+                if selectedAssetIndex < assets.count - 1 {
+                    selectedAssetIndex += 1
+                }
+            
+            default:
+                print(event)
+                break
+        }
+    }
+}

BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift (2218) → BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift (2622)

diff --git a/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift b/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift
index 1f87230..85fc388 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift
@@ -29,8 +29,22 @@ extension PHAsset {
         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()
 
-        PHImageManager.default()
+          print("Time to \(label):\n  \(elapsedInterval) seconds (\(totalInterval) total)")
+        }
+        
+        PHCachingImageManager()
             .requestImage(
                 for: self,
                 targetSize: PHImageManagerMaximumSize,
@@ -40,6 +54,8 @@ extension PHAsset {
                     image = result!
                 }
             )
+        
+        printElapsed("getting image \(self.localIdentifier)")
 
         return image
     }
@@ -64,14 +80,6 @@ struct PreviewImage: View {
                     Spacer()
                 }
             }.padding()
-            
-//            VStack {
-//                Text(asset.localIdentifier)
-//                    .background(.white)
-//                
-//                Spacer()
-//            }
         }
-        
     }
 }