Skip to main content

Merge pull request #8 from alexwlchan/jump-to-image

ID
eb04cac
date
2023-06-08 10:00:19+00:00
author
Alex Chan <alex@alexwlchan.net>
parents
8d90f16, e9b4ed6
message
Merge pull request #8 from alexwlchan/jump-to-image

Implement a way to jump directly to a particular image from the thumbnail list
changed files
4 files, 50 additions, 21 deletions

Changed files

BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (24688) → BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (25136)

diff --git a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
index 80f28a6..fa11309 100644
--- a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
+++ b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
@@ -19,6 +19,7 @@
 		94D751202A31B53E005859E7 /* AlbumInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D7511F2A31B53E005859E7 /* AlbumInfo.swift */; };
 		94D751222A31BD8E005859E7 /* PhotoReviewer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D751212A31BD8E005859E7 /* PhotoReviewer.swift */; };
 		94D7512B2A31D6AC005859E7 /* AssetHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D7512A2A31D6AC005859E7 /* AssetHelpers.swift */; };
+		94D751302A31DC4A005859E7 /* ThumbnailList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94D7512F2A31DC4A005859E7 /* ThumbnailList.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -55,6 +56,7 @@
 		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>"; };
 		94D7512A2A31D6AC005859E7 /* AssetHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AssetHelpers.swift; sourceTree = "<group>"; };
+		94D7512F2A31DC4A005859E7 /* ThumbnailList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThumbnailList.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -148,6 +150,7 @@
 				94D7511D2A31B243005859E7 /* PreviewImage.swift */,
 				94D7511F2A31B53E005859E7 /* AlbumInfo.swift */,
 				94D751212A31BD8E005859E7 /* PhotoReviewer.swift */,
+				94D7512F2A31DC4A005859E7 /* ThumbnailList.swift */,
 			);
 			path = Views;
 			sourceTree = "<group>";
@@ -296,6 +299,7 @@
 				94D7511E2A31B243005859E7 /* PreviewImage.swift in Sources */,
 				94D750F02A31A796005859E7 /* BlinkReviewerApp.swift in Sources */,
 				94D751202A31B53E005859E7 /* AlbumInfo.swift in Sources */,
+				94D751302A31DC4A005859E7 /* ThumbnailList.swift in Sources */,
 				94D751222A31BD8E005859E7 /* PhotoReviewer.swift in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;

BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (2024) → BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (1174)

diff --git a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
index 6b97356..1d92e2b 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
@@ -14,29 +14,10 @@ struct PhotoReviewer: View {
     
     var body: some View {
         VStack {
-            Divider()
-            ScrollViewReader { proxy in
-                ScrollView(.horizontal) {
-                    LazyHStack(spacing: 5) {
-                        // TODO: placeholder images for start/end
-                        // TODO: Allow tapping thumbnails to jump to that
-                        ForEach(assets, id: \.localIdentifier) { asset in
-                            ThumbnailImage(thumbnail: asset.getThumbnail(), isSelected: assets[selectedAssetIndex].localIdentifier == asset.localIdentifier)
-                        }
-                    }.padding()
-                }.frame(height: 70)
-                    .onChange(of: selectedAssetIndex, perform: { newIndex in
-                        withAnimation {
-                            proxy.scrollTo(assets[newIndex].localIdentifier, anchor: .center)
-                        }
-                        
-                    })
-            }
-            Divider()
+            ThumbnailList(assets: assets, selectedAssetIndex: $selectedAssetIndex)
             
             PreviewImage(asset: assets[selectedAssetIndex])
-            
-            Spacer()
+                .background(.black)
         }.onAppear {
             NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
                 handleKeyEvent(event)

BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift (752) → BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift (794)

diff --git a/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift b/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift
index c4444c4..df72bcd 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PreviewImage.swift
@@ -26,6 +26,8 @@ struct PreviewImage: View {
                         
                     Spacer()
                 }
+                
+                Spacer()
             }.padding()
         }
     }

BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift (0) → BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift (1550)

diff --git a/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift b/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift
new file mode 100644
index 0000000..9df6cc4
--- /dev/null
+++ b/BlinkReviewer/BlinkReviewer/Views/ThumbnailList.swift
@@ -0,0 +1,42 @@
+//
+//  ThumbnailList.swift
+//  BlinkReviewer
+//
+//  Created by Alex Chan on 08/06/2023.
+//
+
+import SwiftUI
+import Photos
+
+struct ThumbnailList: View {
+    var assets: [PHAsset]
+    @Binding var selectedAssetIndex: Int
+    
+    var body: some View {
+        ScrollViewReader { proxy in
+            ScrollView(.horizontal) {
+                LazyHStack(spacing: 5) {
+                    // TODO: placeholder images for start/end
+                    
+                    // Implementation note: we use the localIdentifier rather than the
+                    // array index as the id here, because the app gets way slower if
+                    // you use the array index -- it tries to regenerate a bunch of
+                    // the thumbnails every time you change position.
+                    ForEach(Array(assets.enumerated()), id: \.element.localIdentifier) { index, asset in
+                        ThumbnailImage(
+                            thumbnail: asset.getThumbnail(),
+                            isSelected: assets[selectedAssetIndex].localIdentifier == asset.localIdentifier
+                        ).onTapGesture {
+                            selectedAssetIndex = index
+                        }
+                    }
+                }.padding()
+            }.frame(height: 70)
+                .onChange(of: selectedAssetIndex, perform: { newIndex in
+                    withAnimation {
+                        proxy.scrollTo(assets[newIndex].localIdentifier, anchor: .center)
+                    }
+                })
+        }
+    }
+}