add a stats overlay
- ID
80e5bcf- date
2023-06-09 09:13:59+00:00- author
Alex Chan <alex@alexwlchan.net>- parent
3cca041- message
add a stats overlay- changed files
Changed files
BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (26649) → BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj (27079)
diff --git a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
index 05161e6..7f1c8fb 100644
--- a/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
+++ b/BlinkReviewer/BlinkReviewer.xcodeproj/project.pbxproj
@@ -23,6 +23,7 @@
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 */; };
+ 94F7E39E2A331A9E00763DB9 /* Statistics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F7E39D2A331A9E00763DB9 /* Statistics.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -63,6 +64,7 @@
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>"; };
+ 94F7E39D2A331A9E00763DB9 /* Statistics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Statistics.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -166,6 +168,7 @@
94D751212A31BD8E005859E7 /* PhotoReviewer.swift */,
94D7512F2A31DC4A005859E7 /* ThumbnailList.swift */,
94D2C8C02A32FCE300BEE15B /* PHAssetImage.swift */,
+ 94F7E39D2A331A9E00763DB9 /* Statistics.swift */,
);
path = Views;
sourceTree = "<group>";
@@ -320,6 +323,7 @@
94D751302A31DC4A005859E7 /* ThumbnailList.swift in Sources */,
94D751222A31BD8E005859E7 /* PhotoReviewer.swift in Sources */,
94D2C8B92A320E6F00BEE15B /* ReviewState.swift in Sources */,
+ 94F7E39E2A331A9E00763DB9 /* Statistics.swift in Sources */,
94D2C8C12A32FCE300BEE15B /* PHAssetImage.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift (929) → BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift (1449)
diff --git a/BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift b/BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift
index 1b40479..19f3b52 100644
--- a/BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift
+++ b/BlinkReviewer/BlinkReviewer/Photos/PhotosLibrary.swift
@@ -33,4 +33,22 @@ class PhotosLibrary: NSObject, ObservableObject, PHPhotoLibraryChangeObserver {
self.isPhotoLibraryAuthorized = PHPhotoLibrary.authorizationStatus() == .authorized
}
}
+
+ func countApproved() -> Int {
+ let album = getAlbum(withName: "Approved")
+
+ return PHAsset.fetchAssets(in: album, options: nil).count
+ }
+
+ func countRejected() -> Int {
+ let album = getAlbum(withName: "Rejected")
+
+ return PHAsset.fetchAssets(in: album, options: nil).count
+ }
+
+ func countNeedsAction() -> Int {
+ let album = getAlbum(withName: "Needs Action")
+
+ return PHAsset.fetchAssets(in: album, options: nil).count
+ }
}
BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (4912) → BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift (5660)
diff --git a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
index 40ebef5..0fe1897 100644
--- a/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
+++ b/BlinkReviewer/BlinkReviewer/Views/PhotoReviewer.swift
@@ -14,28 +14,48 @@ struct PhotoReviewer: View {
@State var selectedAssetIndex: Int
+ @State var showStatistics: Bool = false
+
init(selectedAssetIndex: Int) {
self.selectedAssetIndex = selectedAssetIndex
}
var body: some View {
if photosLibrary.isPhotoLibraryAuthorized {
- VStack {
- ThumbnailList(selectedAssetIndex: $selectedAssetIndex)
- .environmentObject(photosLibrary)
-
- FullSizeImage(image: fullSizeImage)
- .background(.black)
- }.onAppear {
- fullSizeImage.asset = photosLibrary.assets[selectedAssetIndex]
+ ZStack {
+ VStack {
+ ThumbnailList(selectedAssetIndex: $selectedAssetIndex)
+ .environmentObject(photosLibrary)
+ .background(.gray.opacity(0.3))
+
+ FullSizeImage(image: fullSizeImage)
+ .background(.black)
+ }
+ .background(.black)
+ .onAppear {
+ fullSizeImage.asset = photosLibrary.assets[selectedAssetIndex]
+
+ NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
+ handleKeyEvent(event)
+ return event
+ }
+ }.onChange(of: selectedAssetIndex, perform: { newIndex in
+ fullSizeImage.asset = photosLibrary.assets[newIndex]
+ })
- NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
- handleKeyEvent(event)
- return event
+ if showStatistics {
+ HStack {
+ Spacer()
+
+ VStack {
+ Spacer()
+
+ Statistics().environmentObject(photosLibrary)
+ }
+ .padding()
+ }.padding()
}
- }.onChange(of: selectedAssetIndex, perform: { newIndex in
- fullSizeImage.asset = photosLibrary.assets[newIndex]
- })
+ }
} else {
Text("Waiting for Photos Library authorization…")
}
@@ -125,6 +145,8 @@ struct PhotoReviewer: View {
}
}
+ case 1: // "s"
+ showStatistics.toggle()
default:
print(event)
BlinkReviewer/BlinkReviewer/Views/Statistics.swift (0) → BlinkReviewer/BlinkReviewer/Views/Statistics.swift (611)
diff --git a/BlinkReviewer/BlinkReviewer/Views/Statistics.swift b/BlinkReviewer/BlinkReviewer/Views/Statistics.swift
new file mode 100644
index 0000000..4b2059c
--- /dev/null
+++ b/BlinkReviewer/BlinkReviewer/Views/Statistics.swift
@@ -0,0 +1,22 @@
+//
+// Statistics.swift
+// BlinkReviewer
+//
+// Created by Alex Chan on 09/06/2023.
+//
+
+import SwiftUI
+
+struct Statistics: View {
+ @EnvironmentObject var photosLibrary: PhotosLibrary
+
+ var body: some View {
+ Text("\(photosLibrary.assets.count) photos, \(photosLibrary.countApproved()) approved, \(photosLibrary.countRejected()) rejected, \(photosLibrary.countNeedsAction()) need action")
+ .font(.title)
+ .padding(10)
+ .foregroundColor(.white)
+ .background(.black.opacity(0.7))
+ .cornerRadius(7.0)
+ .shadow(radius: 2.0)
+ }
+}