diff options
| author | Fuwn <[email protected]> | 2025-07-02 07:05:59 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-07-02 07:05:59 -0700 |
| commit | 6a773169bde27fd8695b5f84cd7ba2df2826ce13 (patch) | |
| tree | 6ac8a5c65568602d8fe29de1ebfcefc1c0fbd4f3 | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-6a773169bde27fd8695b5f84cd7ba2df2826ce13.tar.xz sora-testing-6a773169bde27fd8695b5f84cd7ba2df2826ce13.zip | |
feat: Development commit
| -rw-r--r-- | Sora/Data/Settings/SettingsManager.swift | 123 |
1 files changed, 80 insertions, 43 deletions
diff --git a/Sora/Data/Settings/SettingsManager.swift b/Sora/Data/Settings/SettingsManager.swift index fbd432e..d24929b 100644 --- a/Sora/Data/Settings/SettingsManager.swift +++ b/Sora/Data/Settings/SettingsManager.swift @@ -8,7 +8,7 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l var detailViewQuality: BooruPostFileType = .original @AppStorage("thumbnailQuality") - var thumbnailQuality: BooruPostFileType = .preview + private var _thumbnailQuality: BooruPostFileType = .preview @AppStorage("searchSuggestionsMode") var searchSuggestionsMode: SettingsSearchSuggestionsMode = .disabled @@ -32,7 +32,7 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l var alternativeThumbnailGrid = false @AppStorage("uniformThumbnailGrid") - var uniformThumbnailGrid = false + private var _uniformThumbnailGrid: Bool = false private var syncObservation: NSObjectProtocol? @@ -44,7 +44,10 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l // MARK: - Private Properties private var bookmarksCache: [SettingsBookmark] = [] private var searchHistoryCache: [BooruSearchQuery] = [] + private var blurRatingsCache: [BooruRating] = [] private var displayRatingsCache: [BooruRating] = [] + private var uniformThumbnailGridCache: Bool = false + private var thumbnailQualityCache: BooruPostFileType = .preview // MARK: - Codable Properties @AppStorage("bookmarks") @@ -88,49 +91,21 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l } } - private func backupBookmarks() { - guard - let cachesDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask) - .first - else { return } - let backupDirectory = cachesDirectory.appendingPathComponent("bookmarks_backups") - let fileManager = FileManager.default + var uniformThumbnailGrid: Bool { + get { uniformThumbnailGridCache } - try? fileManager.createDirectory(at: backupDirectory, withIntermediateDirectories: true) - - let timestamp = Int(Date().timeIntervalSince1970) - let backupFile = backupDirectory.appendingPathComponent("bookmarks_backup_\(timestamp).json") - - if let data = Self.encode(self.bookmarksCache) { - try? data.write(to: backupFile) + set { + _uniformThumbnailGrid = newValue + uniformThumbnailGridCache = newValue } + } - if let files = try? fileManager.contentsOfDirectory( - at: backupDirectory, - includingPropertiesForKeys: [.contentModificationDateKey], - options: .skipsHiddenFiles - ) { - let jsonBackups = files.filter { file in - file.lastPathComponent.hasPrefix("bookmarks_backup_") && file.pathExtension == "json" - } - let sortedBackups = jsonBackups.sorted { firstFile, secondFile in - let firstDate = - (try? firstFile.resourceValues(forKeys: [.contentModificationDateKey]) - .contentModificationDate) - ?? .distantPast - let secondDate = - (try? secondFile.resourceValues(forKeys: [.contentModificationDateKey]) - .contentModificationDate) - ?? .distantPast - - return firstDate > secondDate - } + var thumbnailQuality: BooruPostFileType { + get { thumbnailQualityCache } - if sortedBackups.count > 10 { - for url in sortedBackups[10...] { - try? fileManager.removeItem(at: url) - } - } + set { + _thumbnailQuality = newValue + thumbnailQualityCache = newValue } } @@ -145,9 +120,13 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l } var blurRatings: [BooruRating] { - get { Self.decode([BooruRating].self, from: blurRatingsData) ?? [.explicit] } + get { blurRatingsCache } + + set { + blurRatingsData = Self.encode(newValue) ?? blurRatingsData - set { blurRatingsData = Self.encode(newValue) ?? blurRatingsData } + loadBlurRatingsCache() + } } var searchHistory: [BooruSearchQuery] { @@ -289,6 +268,10 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l loadBookmarksCache() loadSearchHistoryCache() loadDisplayRatingsCache() + loadBlurRatingsCache() + + uniformThumbnailGridCache = _uniformThumbnailGrid + thumbnailQualityCache = _thumbnailQuality } // MARK: - Private Helpers @@ -357,6 +340,52 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l } } + private func backupBookmarks() { + guard + let cachesDirectory = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask) + .first + else { return } + let backupDirectory = cachesDirectory.appendingPathComponent("bookmarks_backups") + let fileManager = FileManager.default + + try? fileManager.createDirectory(at: backupDirectory, withIntermediateDirectories: true) + + let timestamp = Int(Date().timeIntervalSince1970) + let backupFile = backupDirectory.appendingPathComponent("bookmarks_backup_\(timestamp).json") + + if let data = Self.encode(self.bookmarksCache) { + try? data.write(to: backupFile) + } + + if let files = try? fileManager.contentsOfDirectory( + at: backupDirectory, + includingPropertiesForKeys: [.contentModificationDateKey], + options: .skipsHiddenFiles + ) { + let jsonBackups = files.filter { file in + file.lastPathComponent.hasPrefix("bookmarks_backup_") && file.pathExtension == "json" + } + let sortedBackups = jsonBackups.sorted { firstFile, secondFile in + let firstDate = + (try? firstFile.resourceValues(forKeys: [.contentModificationDateKey]) + .contentModificationDate) + ?? .distantPast + let secondDate = + (try? secondFile.resourceValues(forKeys: [.contentModificationDateKey]) + .contentModificationDate) + ?? .distantPast + + return firstDate > secondDate + } + + if sortedBackups.count > 10 { + for url in sortedBackups[10...] { + try? fileManager.removeItem(at: url) + } + } + } + } + // MARK: Cache Loaders private func loadCache<T: Decodable & Sendable>( from data: Data, @@ -393,6 +422,14 @@ class SettingsManager: ObservableObject { // swiftlint:disable:this type_body_l ) } + private func loadBlurRatingsCache() { + loadCache( + from: blurRatingsData, + sort: { $0 }, + assign: { [weak self] in self?.blurRatingsCache = $0 } + ) + } + // MARK: - Public Methods func appendToSearchHistory(_ query: BooruSearchQuery) { self.searchHistory.append(query) |