From 9cf1c236e0d3f35a543d13f0925f09e13465f6a9 Mon Sep 17 00:00:00 2001 From: Christoph Hagen Date: Sun, 19 Feb 2023 00:38:52 +0100 Subject: [PATCH] Add view of all images for a cap --- Caps.xcodeproj/project.pbxproj | 10 ++- .../xcshareddata/swiftpm/Package.resolved | 4 +- .../UserInterfaceState.xcuserstate | Bin 38266 -> 51164 bytes Caps/ContentView.swift | 27 ++++++- Caps/Data/Cap.swift | 10 ++- Caps/Data/CapImage.swift | 5 ++ Caps/Data/Database.swift | 13 ++- Caps/Views/CapImagesView.swift | 75 ++++++++++++++++++ 8 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 Caps/Views/CapImagesView.swift diff --git a/Caps.xcodeproj/project.pbxproj b/Caps.xcodeproj/project.pbxproj index 84eec13..63e342c 100644 --- a/Caps.xcodeproj/project.pbxproj +++ b/Caps.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 88C1511C29A11ADF0080EF4F /* CapImagesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88C1511B29A11ADF0080EF4F /* CapImagesView.swift */; }; 88DBE72E285495B100D1573B /* FancyTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88DBE72D285495B100D1573B /* FancyTextField.swift */; }; E20D104A285612AF0019BD91 /* ImageGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = E20D1049285612AF0019BD91 /* ImageGrid.swift */; }; E20D104C28563DB10019BD91 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E20D104B28563DB10019BD91 /* ImageCache.swift */; }; @@ -50,6 +51,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 88C1511B29A11ADF0080EF4F /* CapImagesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CapImagesView.swift; sourceTree = ""; }; 88DBE72D285495B100D1573B /* FancyTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FancyTextField.swift; sourceTree = ""; }; E20D1049285612AF0019BD91 /* ImageGrid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageGrid.swift; sourceTree = ""; }; E20D104B28563DB10019BD91 /* ImageCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageCache.swift; sourceTree = ""; }; @@ -187,6 +189,7 @@ E2EA00E0283F658E00F7B269 /* SettingsView.swift */, E2EA00CB283EB43E00F7B269 /* SortCaseRowView.swift */, E2EA00C6283EAA0100F7B269 /* SortSelectionView.swift */, + 88C1511B29A11ADF0080EF4F /* CapImagesView.swift */, ); path = Views; sourceTree = ""; @@ -285,6 +288,7 @@ files = ( E20D10582858CEBD0019BD91 /* IconButton.swift in Sources */, E25AAC7E283D855D006E9E7F /* ContentView.swift in Sources */, + 88C1511C29A11ADF0080EF4F /* CapImagesView.swift in Sources */, E2EA00F328438E6B00F7B269 /* CapNameEntryView.swift in Sources */, E25AAC8B283D868D006E9E7F /* Classifier.swift in Sources */, E20D10562858CDFA0019BD91 /* View+Extensions.swift in Sources */, @@ -457,7 +461,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.4; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -489,7 +493,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 15.4; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -532,7 +536,7 @@ repositoryURL = "https://github.com/SFSafeSymbols/SFSafeSymbols"; requirement = { kind = upToNextMajorVersion; - minimumVersion = 3.0.0; + minimumVersion = 4.0.0; }; }; E2EA00C8283EACB200F7B269 /* XCRemoteSwiftPackageReference "bottom-sheet" */ = { diff --git a/Caps.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Caps.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 3547906..9d32ecf 100644 --- a/Caps.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Caps.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -14,8 +14,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/SFSafeSymbols/SFSafeSymbols", "state" : { - "revision" : "c8c33d947d8a1c883aa19fd24e14fd738b06e369", - "version" : "3.3.2" + "revision" : "7cca2d60925876b5953a2cf7341cd80fbeac983c", + "version" : "4.1.1" } } ], diff --git a/Caps.xcodeproj/project.xcworkspace/xcuserdata/imac.xcuserdatad/UserInterfaceState.xcuserstate b/Caps.xcodeproj/project.xcworkspace/xcuserdata/imac.xcuserdatad/UserInterfaceState.xcuserstate index acccddaf09616400de8368ad875a6281f9dff0d0..0bedba21cbf0ffdfdce0231c53169cd1ccb9b5cc 100644 GIT binary patch literal 51164 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 literal 38266 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 String { + String(format: "images/%04d/%04d-%02d.jpg", id, id, version) } var image: CapImage { .init(cap: id, version: mainImage) } + + func image(version: Int) -> CapImage { + .init(cap: id, version: version) + } /** Create a new cap. diff --git a/Caps/Data/CapImage.swift b/Caps/Data/CapImage.swift index 836e495..efaa68c 100644 --- a/Caps/Data/CapImage.swift +++ b/Caps/Data/CapImage.swift @@ -6,3 +6,8 @@ struct CapImage: Codable, Equatable, Hashable { let version: Int } + +extension CapImage: Identifiable { + + var id: Int { version } +} diff --git a/Caps/Data/Database.swift b/Caps/Data/Database.swift index 04b131d..1d9bc81 100644 --- a/Caps/Data/Database.swift +++ b/Caps/Data/Database.swift @@ -241,7 +241,7 @@ final class Database: ObservableObject { @discardableResult func downloadCaps() async -> Bool { - print("Downloading cap data") + print("Downloading cap data from \(serverDbUrl)") let data: Data let response: URLResponse do { @@ -250,7 +250,11 @@ final class Database: ObservableObject { print("Failed to download classifier version: \(error)") return false } - guard (response as? HTTPURLResponse)?.statusCode == 200 else { + guard let httpResponse = response as? HTTPURLResponse else { + return false + } + guard httpResponse.statusCode == 200 else { + print("Failed to download caps: \(httpResponse.statusCode)") return false } @@ -261,6 +265,7 @@ final class Database: ObservableObject { print("Failed to decode server database: \(error)") return false } + print("Downloaded \(capData) caps") var inserts = 0 var updates = 0 for cap in capData { @@ -358,6 +363,10 @@ final class Database: ObservableObject { func hasPendingOperations(for cap: Int) -> Bool { return false } + + func cap(for id: Int) -> Cap? { + caps[id] + } // MARK: Adding new data diff --git a/Caps/Views/CapImagesView.swift b/Caps/Views/CapImagesView.swift new file mode 100644 index 0000000..a926ad5 --- /dev/null +++ b/Caps/Views/CapImagesView.swift @@ -0,0 +1,75 @@ +import SwiftUI + +struct CapImagesView: View { + + private let imageSize: CGFloat = 70 + + @Binding + var cap: Cap? + + @Binding + var isPresented: Bool + + init(cap: Binding, database: Database, isPresented: Binding) { + self.database = database + self._cap = cap + self._isPresented = isPresented + } + + let database: Database + + var images: [CapImage] { + guard let cap else { + return [] + } + return (0..