From bcf51684c9f2346597bfc11d6de47f682c14e416 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Thu, 27 Feb 2025 20:52:34 -0800 Subject: feat: Development commit --- Sora/Data/Settings/Bookmark.swift | 15 -- Sora/Data/Settings/Settings.swift | 179 --------------------- Sora/Data/Settings/SettingsBookmark.swift | 15 ++ Sora/Data/Settings/SettingsManager.swift | 179 +++++++++++++++++++++ Sora/SoraApp.swift | 2 +- Sora/Views/Bookmarks/BookmarksListItemView.swift | 4 +- Sora/Views/Bookmarks/BookmarksView.swift | 6 +- Sora/Views/MainView.swift | 4 +- Sora/Views/Post/Details/PostDetailsImageView.swift | 2 +- Sora/Views/Post/Details/PostDetailsView.swift | 2 +- .../Post/Grid/PostGridBookmarkButtonView.swift | 2 +- Sora/Views/Post/Grid/PostGridThumbnailView.swift | 2 +- Sora/Views/Post/Grid/PostGridView.swift | 2 +- .../Section/SettingsContentRatingsView.swift | 4 +- .../Settings/Section/SettingsDetailsView.swift | 2 +- .../Settings/Section/SettingsProviderView.swift | 2 +- .../Settings/Section/SettingsSearchView.swift | 2 +- .../Settings/Section/SettingsThumbnailsView.swift | 2 +- Sora/Views/Settings/SettingsView.swift | 4 +- 19 files changed, 215 insertions(+), 215 deletions(-) delete mode 100644 Sora/Data/Settings/Bookmark.swift delete mode 100644 Sora/Data/Settings/Settings.swift create mode 100644 Sora/Data/Settings/SettingsBookmark.swift create mode 100644 Sora/Data/Settings/SettingsManager.swift diff --git a/Sora/Data/Settings/Bookmark.swift b/Sora/Data/Settings/Bookmark.swift deleted file mode 100644 index 32a2b9b..0000000 --- a/Sora/Data/Settings/Bookmark.swift +++ /dev/null @@ -1,15 +0,0 @@ -import Foundation - -struct Bookmark: Codable, Identifiable, Hashable { - let id: UUID - let tags: [String] - let createdAt: Date - let provider: BooruProvider - - init(provider: BooruProvider, tags: [String], id: UUID = UUID()) { - createdAt = Date() - self.id = id - self.tags = tags - self.provider = provider - } -} diff --git a/Sora/Data/Settings/Settings.swift b/Sora/Data/Settings/Settings.swift deleted file mode 100644 index ee7a15e..0000000 --- a/Sora/Data/Settings/Settings.swift +++ /dev/null @@ -1,179 +0,0 @@ -import SwiftUI - -class Settings: ObservableObject { - @AppStorage("detailViewType") - var detailViewQuality: BooruPostFileType = .original - - @AppStorage("thumbnailQuality") - var thumbnailQuality: BooruPostFileType = .preview - - @AppStorage("searchSuggestionsMode") - var searchSuggestionsMode: SettingsSearchSuggestionsMode = .disabled - - @AppStorage("thumbnailGridColumns") - var thumbnailGridColumns = 2 - - @AppStorage("bookmarks") - private var bookmarksData = Data() - - @AppStorage("preferredBooru") - var preferredBooru: BooruProvider = .safebooru - - @AppStorage("enableShareShortcut") - var enableShareShortcut = false - - @AppStorage("displayRatings") - private var displayRatingsData = Settings.defaultRatingsData() - - @AppStorage("blurRatings") - private var blurRatingsData = Settings.initializeRatingsData( - enabledRatings: [.explicit] - ) - - @AppStorage("displayDetailsInformationBar") - var displayDetailsInformationBar = true - - @AppStorage("searchHistory") - private var searchHistoryData = Data() - - #if os(macOS) - @AppStorage("saveTagsToFile") - var saveTagsToFile = false - #endif - - var bookmarks: [Bookmark] { - get { - if let bookmarks = try? JSONDecoder().decode([Bookmark].self, from: bookmarksData) { - return bookmarks - } - - return [] - } - - set { - if let data = try? JSONEncoder().encode(newValue) { - bookmarksData = data - } - } - } - - 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 } } - } - - var searchHistory: [BooruSearchQuery] { - get { - if let history = try? JSONDecoder().decode([BooruSearchQuery].self, from: searchHistoryData) { - return history - } - - return [] - } - - set { - if let data = try? JSONEncoder().encode(newValue) { - searchHistoryData = data - } - } - } - - func appendToSearchHistory(_ query: BooruSearchQuery) { - self.searchHistory.append(query) - } - - func removeFromSearchHistory(_ query: BooruSearchQuery) { - if let index = self.searchHistory.firstIndex(of: query) { - self.searchHistory.remove(at: index) - } - } - - private static func defaultRatingsData() -> Data { - initializeRatingsData(enabledRatings: BooruRating.allCases) - } - - private static func initializeRatingsData(enabledRatings: [BooruRating]) -> Data { - var ratings: [BooruRating] = [] - - for rating in enabledRatings { - ratings.append(rating) - } - - do { - return try JSONEncoder().encode(ratings) - } catch { - debugPrint("Settings.initializeRatingsData: \(error)") - - 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() { - detailViewQuality = .original - thumbnailQuality = .preview - searchSuggestionsMode = .disabled - thumbnailGridColumns = 2 - preferredBooru = .safebooru - enableShareShortcut = false - displayRatingsData = Self.defaultRatingsData() - blurRatingsData = Self.initializeRatingsData(enabledRatings: [.explicit]) - displayDetailsInformationBar = true - - #if os(macOS) - saveTagsToFile = false - #endif - } - - func addBookmark(provider: BooruProvider, tags: [String]) { - var currentBookmarks = bookmarks - - currentBookmarks.append(Bookmark(provider: provider, tags: tags.map { $0.lowercased() })) - - bookmarks = currentBookmarks - } - - func removeBookmark(at index: IndexSet) { - var currentBookmarks = bookmarks - - currentBookmarks.remove(atOffsets: index) - - bookmarks = currentBookmarks - } - - func removeBookmark(withTags tags: [String]) { - var currentBookmarks = bookmarks - - currentBookmarks.removeAll { bookmark in - bookmark.tags.contains(where: tags.contains) - } - - bookmarks = currentBookmarks - } - - func removeBookmark(withID: UUID) { - var currentBookmarks = bookmarks - - currentBookmarks.removeAll { bookmark in - bookmark.id == withID - } - - bookmarks = currentBookmarks - } -} diff --git a/Sora/Data/Settings/SettingsBookmark.swift b/Sora/Data/Settings/SettingsBookmark.swift new file mode 100644 index 0000000..1acfaa5 --- /dev/null +++ b/Sora/Data/Settings/SettingsBookmark.swift @@ -0,0 +1,15 @@ +import Foundation + +struct SettingsBookmark: Codable, Identifiable, Hashable { + let id: UUID + let tags: [String] + let createdAt: Date + let provider: BooruProvider + + init(provider: BooruProvider, tags: [String], id: UUID = UUID()) { + createdAt = Date() + self.id = id + self.tags = tags + self.provider = provider + } +} diff --git a/Sora/Data/Settings/SettingsManager.swift b/Sora/Data/Settings/SettingsManager.swift new file mode 100644 index 0000000..f37aa84 --- /dev/null +++ b/Sora/Data/Settings/SettingsManager.swift @@ -0,0 +1,179 @@ +import SwiftUI + +class SettingsManager: ObservableObject { + @AppStorage("detailViewType") + var detailViewQuality: BooruPostFileType = .original + + @AppStorage("thumbnailQuality") + var thumbnailQuality: BooruPostFileType = .preview + + @AppStorage("searchSuggestionsMode") + var searchSuggestionsMode: SettingsSearchSuggestionsMode = .disabled + + @AppStorage("thumbnailGridColumns") + var thumbnailGridColumns = 2 + + @AppStorage("bookmarks") + private var bookmarksData = Data() + + @AppStorage("preferredBooru") + var preferredBooru: BooruProvider = .safebooru + + @AppStorage("enableShareShortcut") + var enableShareShortcut = false + + @AppStorage("displayRatings") + private var displayRatingsData = SettingsManager.defaultRatingsData() + + @AppStorage("blurRatings") + private var blurRatingsData = SettingsManager.initializeRatingsData( + enabledRatings: [.explicit] + ) + + @AppStorage("displayDetailsInformationBar") + var displayDetailsInformationBar = true + + @AppStorage("searchHistory") + private var searchHistoryData = Data() + + #if os(macOS) + @AppStorage("saveTagsToFile") + var saveTagsToFile = false + #endif + + var bookmarks: [SettingsBookmark] { + get { + if let bookmarks = try? JSONDecoder().decode([SettingsBookmark].self, from: bookmarksData) { + return bookmarks + } + + return [] + } + + set { + if let data = try? JSONEncoder().encode(newValue) { + bookmarksData = data + } + } + } + + 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 } } + } + + var searchHistory: [BooruSearchQuery] { + get { + if let history = try? JSONDecoder().decode([BooruSearchQuery].self, from: searchHistoryData) { + return history + } + + return [] + } + + set { + if let data = try? JSONEncoder().encode(newValue) { + searchHistoryData = data + } + } + } + + func appendToSearchHistory(_ query: BooruSearchQuery) { + self.searchHistory.append(query) + } + + func removeFromSearchHistory(_ query: BooruSearchQuery) { + if let index = self.searchHistory.firstIndex(of: query) { + self.searchHistory.remove(at: index) + } + } + + private static func defaultRatingsData() -> Data { + initializeRatingsData(enabledRatings: BooruRating.allCases) + } + + private static func initializeRatingsData(enabledRatings: [BooruRating]) -> Data { + var ratings: [BooruRating] = [] + + for rating in enabledRatings { + ratings.append(rating) + } + + do { + return try JSONEncoder().encode(ratings) + } catch { + debugPrint("Settings.initializeRatingsData: \(error)") + + 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() { + detailViewQuality = .original + thumbnailQuality = .preview + searchSuggestionsMode = .disabled + thumbnailGridColumns = 2 + preferredBooru = .safebooru + enableShareShortcut = false + displayRatingsData = Self.defaultRatingsData() + blurRatingsData = Self.initializeRatingsData(enabledRatings: [.explicit]) + displayDetailsInformationBar = true + + #if os(macOS) + saveTagsToFile = false + #endif + } + + func addBookmark(provider: BooruProvider, tags: [String]) { + var currentBookmarks = bookmarks + + currentBookmarks.append(SettingsBookmark(provider: provider, tags: tags.map { $0.lowercased() })) + + bookmarks = currentBookmarks + } + + func removeBookmark(at index: IndexSet) { + var currentBookmarks = bookmarks + + currentBookmarks.remove(atOffsets: index) + + bookmarks = currentBookmarks + } + + func removeBookmark(withTags tags: [String]) { + var currentBookmarks = bookmarks + + currentBookmarks.removeAll { bookmark in + bookmark.tags.contains(where: tags.contains) + } + + bookmarks = currentBookmarks + } + + func removeBookmark(withID: UUID) { + var currentBookmarks = bookmarks + + currentBookmarks.removeAll { bookmark in + bookmark.id == withID + } + + bookmarks = currentBookmarks + } +} diff --git a/Sora/SoraApp.swift b/Sora/SoraApp.swift index df0f8e1..45a9ee1 100644 --- a/Sora/SoraApp.swift +++ b/Sora/SoraApp.swift @@ -8,7 +8,7 @@ func debugPrint(_ items: Any...) { @main struct SoraApp: App { - @StateObject private var settings = Settings() + @StateObject private var settings = SettingsManager() var body: some Scene { WindowGroup { diff --git a/Sora/Views/Bookmarks/BookmarksListItemView.swift b/Sora/Views/Bookmarks/BookmarksListItemView.swift index 456992e..6f1be95 100644 --- a/Sora/Views/Bookmarks/BookmarksListItemView.swift +++ b/Sora/Views/Bookmarks/BookmarksListItemView.swift @@ -1,8 +1,8 @@ import SwiftUI struct BookmarksListItemView: View { - @EnvironmentObject var settings: Settings - var bookmark: Bookmark + @EnvironmentObject var settings: SettingsManager + var bookmark: SettingsBookmark var body: some View { #if os(macOS) diff --git a/Sora/Views/Bookmarks/BookmarksView.swift b/Sora/Views/Bookmarks/BookmarksView.swift index 5b33d03..6c356b9 100644 --- a/Sora/Views/Bookmarks/BookmarksView.swift +++ b/Sora/Views/Bookmarks/BookmarksView.swift @@ -1,12 +1,12 @@ import SwiftUI struct BookmarksView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager @EnvironmentObject var manager: BooruManager @Binding var selectedTab: Int @State private var bookmarksSearchText: String = "" - var filteredBookmarks: [Bookmark] { + var filteredBookmarks: [SettingsBookmark] { guard !bookmarksSearchText.isEmpty else { return settings.bookmarks } @@ -68,6 +68,6 @@ struct BookmarksView: View { #Preview { BookmarksView(selectedTab: .constant(1)) - .environmentObject(Settings()) + .environmentObject(SettingsManager()) .environmentObject(BooruManager(.yandere)) } diff --git a/Sora/Views/MainView.swift b/Sora/Views/MainView.swift index 03612c9..73eeed5 100644 --- a/Sora/Views/MainView.swift +++ b/Sora/Views/MainView.swift @@ -1,7 +1,7 @@ import SwiftUI struct MainView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager @State private var selectedTab: Int = 0 @State private var manager = BooruManager(.yandere) @@ -86,7 +86,7 @@ struct MainView: View { #Preview { MainView() - .environmentObject(Settings()) + .environmentObject(SettingsManager()) #if os(macOS) .frame(width: 736, height: 736) #endif diff --git a/Sora/Views/Post/Details/PostDetailsImageView.swift b/Sora/Views/Post/Details/PostDetailsImageView.swift index 702d0a0..a50b6fc 100644 --- a/Sora/Views/Post/Details/PostDetailsImageView.swift +++ b/Sora/Views/Post/Details/PostDetailsImageView.swift @@ -3,7 +3,7 @@ import SwiftUI import UserNotifications struct PostDetailsImageView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager @EnvironmentObject var manager: BooruManager var url: URL? @Binding var loadingState: BooruPostLoadingState diff --git a/Sora/Views/Post/Details/PostDetailsView.swift b/Sora/Views/Post/Details/PostDetailsView.swift index c13e61b..596cbbd 100644 --- a/Sora/Views/Post/Details/PostDetailsView.swift +++ b/Sora/Views/Post/Details/PostDetailsView.swift @@ -2,7 +2,7 @@ import SwiftUI struct PostDetailsView: View { @EnvironmentObject var manager: BooruManager - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager let post: BooruPost @State private var loadingStage: BooruPostLoadingState = .loadingPreview private var imageURL: URL? { diff --git a/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift b/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift index d0a709b..c8478ee 100644 --- a/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift +++ b/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift @@ -2,7 +2,7 @@ import SwiftUI struct PostGridBookmarkButtonView: View { @EnvironmentObject private var manager: BooruManager - @EnvironmentObject private var settings: Settings + @EnvironmentObject private var settings: SettingsManager var contained: Bool { let lowercaseTags = manager.tags.map { $0.lowercased() } diff --git a/Sora/Views/Post/Grid/PostGridThumbnailView.swift b/Sora/Views/Post/Grid/PostGridThumbnailView.swift index 7f569a4..4973c1e 100644 --- a/Sora/Views/Post/Grid/PostGridThumbnailView.swift +++ b/Sora/Views/Post/Grid/PostGridThumbnailView.swift @@ -2,7 +2,7 @@ import NetworkImage import SwiftUI struct PostGridThumbnailView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager @EnvironmentObject var manager: BooruManager let post: BooruPost let posts: [BooruPost] diff --git a/Sora/Views/Post/Grid/PostGridView.swift b/Sora/Views/Post/Grid/PostGridView.swift index 3da87d4..a643391 100644 --- a/Sora/Views/Post/Grid/PostGridView.swift +++ b/Sora/Views/Post/Grid/PostGridView.swift @@ -2,7 +2,7 @@ import SwiftUI import WaterfallGrid struct PostGridView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager @EnvironmentObject var manager: BooruManager @Environment(\.isSearching) diff --git a/Sora/Views/Settings/Section/SettingsContentRatingsView.swift b/Sora/Views/Settings/Section/SettingsContentRatingsView.swift index 7053481..39524ec 100644 --- a/Sora/Views/Settings/Section/SettingsContentRatingsView.swift +++ b/Sora/Views/Settings/Section/SettingsContentRatingsView.swift @@ -1,7 +1,7 @@ import SwiftUI struct SettingsContentRatingsView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager var body: some View { List { @@ -70,5 +70,5 @@ struct SettingsContentRatingsView: View { #Preview { SettingsContentRatingsView() - .environmentObject(Settings()) + .environmentObject(SettingsManager()) } diff --git a/Sora/Views/Settings/Section/SettingsDetailsView.swift b/Sora/Views/Settings/Section/SettingsDetailsView.swift index d184382..5abd394 100644 --- a/Sora/Views/Settings/Section/SettingsDetailsView.swift +++ b/Sora/Views/Settings/Section/SettingsDetailsView.swift @@ -1,7 +1,7 @@ import SwiftUI struct SettingsDetailsView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager var body: some View { Picker("Image Quality", selection: $settings.detailViewQuality) { diff --git a/Sora/Views/Settings/Section/SettingsProviderView.swift b/Sora/Views/Settings/Section/SettingsProviderView.swift index 1de25c3..b561bc3 100644 --- a/Sora/Views/Settings/Section/SettingsProviderView.swift +++ b/Sora/Views/Settings/Section/SettingsProviderView.swift @@ -1,7 +1,7 @@ import SwiftUI struct SettingsProviderView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager var body: some View { Picker("Provider", selection: $settings.preferredBooru) { diff --git a/Sora/Views/Settings/Section/SettingsSearchView.swift b/Sora/Views/Settings/Section/SettingsSearchView.swift index f8fa270..cb0d3c7 100644 --- a/Sora/Views/Settings/Section/SettingsSearchView.swift +++ b/Sora/Views/Settings/Section/SettingsSearchView.swift @@ -1,7 +1,7 @@ import SwiftUI struct SettingsSearchView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager #if os(macOS) var manager = BooruManager(.yandere) diff --git a/Sora/Views/Settings/Section/SettingsThumbnailsView.swift b/Sora/Views/Settings/Section/SettingsThumbnailsView.swift index 775e7b1..5378165 100644 --- a/Sora/Views/Settings/Section/SettingsThumbnailsView.swift +++ b/Sora/Views/Settings/Section/SettingsThumbnailsView.swift @@ -1,7 +1,7 @@ import SwiftUI struct SettingsThumbnailsView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager @State private var isShowingContentFiltering = false var body: some View { diff --git a/Sora/Views/Settings/SettingsView.swift b/Sora/Views/Settings/SettingsView.swift index adc3a49..a9c8141 100644 --- a/Sora/Views/Settings/SettingsView.swift +++ b/Sora/Views/Settings/SettingsView.swift @@ -1,7 +1,7 @@ import SwiftUI struct SettingsView: View { - @EnvironmentObject var settings: Settings + @EnvironmentObject var settings: SettingsManager var body: some View { NavigationStack { @@ -45,6 +45,6 @@ struct SettingsView: View { #Preview { SettingsView() - .environmentObject(Settings()) + .environmentObject(SettingsManager()) .environmentObject(BooruManager(.yandere)) } -- cgit v1.2.3