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
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)
+ }
+ })
+ }
+ }
+}