summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-02-22 12:26:31 -0800
committerFuwn <[email protected]>2025-02-22 12:26:31 -0800
commitf527ede88d974271a0c485e297ba9278909f53bb (patch)
tree6d6ad0597c80fabe48a1de9981bafa968aaf6e29
parentfeat: Development commit (diff)
downloadsora-testing-f527ede88d974271a0c485e297ba9278909f53bb.tar.xz
sora-testing-f527ede88d974271a0c485e297ba9278909f53bb.zip
feat: Development commit
-rw-r--r--Sora/Data/Booru/BooruRating.swift8
-rw-r--r--Sora/Data/Settings/Settings.swift36
-rw-r--r--Sora/Views/MainView.swift8
-rw-r--r--Sora/Views/Post/Grid/PostGridThumbnailView.swift3
-rw-r--r--Sora/Views/Post/Grid/PostGridView.swift5
-rw-r--r--Sora/Views/Settings/Section/SettingsContentRatingsView.swift74
-rw-r--r--Sora/Views/Settings/Section/SettingsThumbnailsView.swift6
-rw-r--r--Sora/Views/Settings/SettingsView.swift48
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")
}
}