diff options
| author | Fuwn <[email protected]> | 2025-02-22 12:26:31 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-02-22 12:26:31 -0800 |
| commit | f527ede88d974271a0c485e297ba9278909f53bb (patch) | |
| tree | 6d6ad0597c80fabe48a1de9981bafa968aaf6e29 | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-f527ede88d974271a0c485e297ba9278909f53bb.tar.xz sora-testing-f527ede88d974271a0c485e297ba9278909f53bb.zip | |
feat: Development commit
| -rw-r--r-- | Sora/Data/Booru/BooruRating.swift | 8 | ||||
| -rw-r--r-- | Sora/Data/Settings/Settings.swift | 36 | ||||
| -rw-r--r-- | Sora/Views/MainView.swift | 8 | ||||
| -rw-r--r-- | Sora/Views/Post/Grid/PostGridThumbnailView.swift | 3 | ||||
| -rw-r--r-- | Sora/Views/Post/Grid/PostGridView.swift | 5 | ||||
| -rw-r--r-- | Sora/Views/Settings/Section/SettingsContentRatingsView.swift | 74 | ||||
| -rw-r--r-- | Sora/Views/Settings/Section/SettingsThumbnailsView.swift | 6 | ||||
| -rw-r--r-- | Sora/Views/Settings/SettingsView.swift | 48 |
8 files changed, 146 insertions, 42 deletions
diff --git a/Sora/Data/Booru/BooruRating.swift b/Sora/Data/Booru/BooruRating.swift index 8327868..f4814e8 100644 --- a/Sora/Data/Booru/BooruRating.swift +++ b/Sora/Data/Booru/BooruRating.swift @@ -1,7 +1,7 @@ -enum BooruRating { - case explicit - case questionable - case safe +enum BooruRating: String, CaseIterable, Decodable, Encodable { + case explicit = "Explicit" + case questionable = "Questionable" + case safe = "Safe" init(_ string: String) { switch string { diff --git a/Sora/Data/Settings/Settings.swift b/Sora/Data/Settings/Settings.swift index 5aac056..d925f62 100644 --- a/Sora/Data/Settings/Settings.swift +++ b/Sora/Data/Settings/Settings.swift @@ -33,6 +33,12 @@ class Settings: ObservableObject { @AppStorage("enableShareShortcut") var enableShareShortcut: Bool = false + @AppStorage("displayRatings") + private var displayRatingsData: Data = Settings.initialiseRatingsData() + + @AppStorage("blurRatings") + private var blurRatingsData: Data = Settings.initialiseRatingsData() + var bookmarks: [Bookmark] { get { if let bookmarks = try? JSONDecoder().decode([Bookmark].self, from: bookmarksData) { @@ -49,6 +55,36 @@ class Settings: ObservableObject { } } + var displayRatings: [BooruRating] { + get { Self.decodeRatings(from: displayRatingsData) } + set { if let data = Self.encodeRatings(newValue) { displayRatingsData = data } } + } + + var blurRatings: [BooruRating] { + get { Self.decodeRatings(from: blurRatingsData) } + set { if let data = Self.encodeRatings(newValue) { blurRatingsData = data } } + } + + private static func initialiseRatingsData() -> Data { + do { + return try JSONEncoder().encode(BooruRating.allCases) + } catch { + return Data() + } + } + + private static func decodeRatings(from data: Data) -> [BooruRating] { + if let ratings = try? JSONDecoder().decode([BooruRating].self, from: data) { + return ratings + } + + return BooruRating.allCases + } + + private static func encodeRatings(_ ratings: [BooruRating]) -> Data? { + try? JSONEncoder().encode(ratings) + } + func resetToDefaults() { #if DEBUG detailViewType = .preview diff --git a/Sora/Views/MainView.swift b/Sora/Views/MainView.swift index 3a47038..db9960a 100644 --- a/Sora/Views/MainView.swift +++ b/Sora/Views/MainView.swift @@ -30,11 +30,9 @@ struct MainView: View { .tabItem { Label("Bookmarks", systemImage: "bookmark") } .tag(1) - NavigationStack { - SettingsView() - } - .tabItem { Label("Settings", systemImage: "gear") } - .tag(2) + SettingsView() + .tabItem { Label("Settings", systemImage: "gear") } + .tag(2) } #endif } diff --git a/Sora/Views/Post/Grid/PostGridThumbnailView.swift b/Sora/Views/Post/Grid/PostGridThumbnailView.swift index 8816f67..0fe044a 100644 --- a/Sora/Views/Post/Grid/PostGridThumbnailView.swift +++ b/Sora/Views/Post/Grid/PostGridThumbnailView.swift @@ -32,8 +32,7 @@ struct PostGridThumbnailView: View { } } .blur( - radius: settings.blurNSFWThumbnails - ? (post.rating != .safe && post.rating != .questionable) ? 10 : 0 : 0 + radius: settings.blurRatings.contains(post.rating) ? 10 : 0 ) .clipped() .animation(.default, value: settings.blurNSFWThumbnails) diff --git a/Sora/Views/Post/Grid/PostGridView.swift b/Sora/Views/Post/Grid/PostGridView.swift index faed038..08d9574 100644 --- a/Sora/Views/Post/Grid/PostGridView.swift +++ b/Sora/Views/Post/Grid/PostGridView.swift @@ -9,10 +9,7 @@ struct PostGridView: View { private var isSearching var filteredPosts: [BooruPost] { - (settings.showNSFWPosts - ? manager.posts - : manager.posts - .filter { $0.rating == .safe || $0.rating == .questionable }) + manager.posts.filter { settings.displayRatings.contains($0.rating) } .sorted { $0.id > $1.id } } diff --git a/Sora/Views/Settings/Section/SettingsContentRatingsView.swift b/Sora/Views/Settings/Section/SettingsContentRatingsView.swift new file mode 100644 index 0000000..7053481 --- /dev/null +++ b/Sora/Views/Settings/Section/SettingsContentRatingsView.swift @@ -0,0 +1,74 @@ +import SwiftUI + +struct SettingsContentRatingsView: View { + @EnvironmentObject var settings: Settings + + var body: some View { + List { + Section(header: Text("Display Content Ratings")) { + ForEach(BooruRating.allCases, id: \.self) { rating in + Toggle( + rating.rawValue, + isOn: Binding( + get: { + settings.displayRatings.contains(rating) + }, + set: { isOn in + setRating( + ratingFor: &settings.displayRatings, + isOn: isOn, + rating: rating + ) + } + ) + ) + } + } + + Section(header: Text("Blur Content Ratings")) { + ForEach(BooruRating.allCases, id: \.self) { rating in + Toggle( + rating.rawValue, + isOn: Binding( + get: { settings.blurRatings.contains(rating) }, + set: { isOn in + setRating( + ratingFor: &settings.blurRatings, + isOn: isOn, + rating: rating + ) + } + ) + ) + } + } + } + .navigationTitle(Text("Content Filtering")) + #if !os(macOS) + .navigationBarTitleDisplayMode(.inline) + #endif + } + + func setRating( + ratingFor: inout [BooruRating], + isOn: Bool, + rating: BooruRating + ) { + var newRatings = ratingFor + + if isOn { + if !newRatings.contains(rating) { + newRatings.append(rating) + } + } else { + newRatings.removeAll { $0 == rating } + } + + ratingFor = newRatings + } +} + +#Preview { + SettingsContentRatingsView() + .environmentObject(Settings()) +} diff --git a/Sora/Views/Settings/Section/SettingsThumbnailsView.swift b/Sora/Views/Settings/Section/SettingsThumbnailsView.swift index f787e59..0491d04 100644 --- a/Sora/Views/Settings/Section/SettingsThumbnailsView.swift +++ b/Sora/Views/Settings/Section/SettingsThumbnailsView.swift @@ -22,10 +22,8 @@ struct SettingsThumbnailsView: View { ) #endif - Toggle("Show NSFW Posts", isOn: $settings.showNSFWPosts) - - if settings.showNSFWPosts { - Toggle("Blur NSFW Thumbnails", isOn: $settings.blurNSFWThumbnails) + NavigationLink(destination: SettingsContentRatingsView()) { + Text("Content Filtering") } } } diff --git a/Sora/Views/Settings/SettingsView.swift b/Sora/Views/Settings/SettingsView.swift index ab92a42..02f9e34 100644 --- a/Sora/Views/Settings/SettingsView.swift +++ b/Sora/Views/Settings/SettingsView.swift @@ -4,37 +4,39 @@ struct SettingsView: View { @EnvironmentObject var settings: Settings var body: some View { - Form { - Section(header: Text("Provider")) { - SettingsProviderView() - } + NavigationStack { + Form { + Section(header: Text("Provider")) { + SettingsProviderView() + } - Section(header: Text("Thumbnails")) { - SettingsThumbnailsView() - } + Section(header: Text("Thumbnails")) { + SettingsThumbnailsView() + } - Section(header: Text("Details")) { - SettingsDetailsView() - } + Section(header: Text("Details")) { + SettingsDetailsView() + } - Section(header: Text("Search")) { - SettingsSearchView() - } + Section(header: Text("Search")) { + SettingsSearchView() + } - Section(header: Text("Settings")) { - Button("Reset to Defaults") { - settings.resetToDefaults() + Section(header: Text("Settings")) { + Button("Reset to Defaults") { + settings.resetToDefaults() + } } - } - Section(header: Text("Attributions")) { - SettingsAttributionsView() + Section(header: Text("Attributions")) { + SettingsAttributionsView() + } } + #if os(macOS) + .formStyle(.grouped) + #endif + .navigationTitle("Settings") } - #if os(macOS) - .formStyle(.grouped) - #endif - .navigationTitle("Settings") } } |