diff options
Diffstat (limited to 'Sora')
| -rw-r--r-- | Sora/Data/Moebooru/MoebooruManager.swift | 2 | ||||
| -rw-r--r-- | Sora/Data/Moebooru/MoebooruTag.swift | 2 | ||||
| -rw-r--r-- | Sora/Data/Moebooru/MoebooruTagXMLParser.swift | 59 | ||||
| -rw-r--r-- | Sora/Data/Settings.swift | 3 | ||||
| -rw-r--r-- | Sora/Views/Post/PostGridView.swift | 20 | ||||
| -rw-r--r-- | Sora/Views/Post/PostView.swift | 5 | ||||
| -rw-r--r-- | Sora/Views/Settings/SettingsThumbnailsView.swift | 20 |
7 files changed, 81 insertions, 30 deletions
diff --git a/Sora/Data/Moebooru/MoebooruManager.swift b/Sora/Data/Moebooru/MoebooruManager.swift index 286a187..25d2489 100644 --- a/Sora/Data/Moebooru/MoebooruManager.swift +++ b/Sora/Data/Moebooru/MoebooruManager.swift @@ -100,7 +100,7 @@ class MoebooruManager: ObservableObject { if Task.isCancelled { return } DispatchQueue.main.async { - self.allTags = (MoebooruTagXMLParser().parse(data: data)).sorted { $0.count > $1.count } + self.allTags = (MoebooruTagXMLParser(data: data).parse()).sorted { $0.count > $1.count } } } catch { if (error as? URLError)?.code != .cancelled { diff --git a/Sora/Data/Moebooru/MoebooruTag.swift b/Sora/Data/Moebooru/MoebooruTag.swift index cc783f0..6aa7449 100644 --- a/Sora/Data/Moebooru/MoebooruTag.swift +++ b/Sora/Data/Moebooru/MoebooruTag.swift @@ -1,7 +1,7 @@ import Foundation struct MoebooruTag: Identifiable, Hashable { - let id: Int + let id: String let name: String let count: Int let type: Int diff --git a/Sora/Data/Moebooru/MoebooruTagXMLParser.swift b/Sora/Data/Moebooru/MoebooruTagXMLParser.swift index 7ea2e8e..e8b0213 100644 --- a/Sora/Data/Moebooru/MoebooruTagXMLParser.swift +++ b/Sora/Data/Moebooru/MoebooruTagXMLParser.swift @@ -2,34 +2,57 @@ import Foundation class MoebooruTagXMLParser: NSObject, XMLParserDelegate { private var tags: [MoebooruTag] = [] + private var currentTag: MoebooruTag? + private var parser: XMLParser - func parse(data: Data) -> [MoebooruTag] { - let parser = XMLParser(data: data) + init(data: Data) { + parser = XMLParser(data: data) + + super.init() parser.delegate = self + } + + func parse() -> [MoebooruTag] { parser.parse() return tags } - func parser(_: XMLParser, didStartElement elementName: String, - namespaceURI _: String?, qualifiedName _: String?, - attributes attributeDict: [String: String]) - { + func parser(_: XMLParser, didStartElement elementName: String, namespaceURI _: String?, qualifiedName _: String?, attributes attributeDict: [String: String] = [:]) { if elementName == "tag" { - if let id = Int(attributeDict["id"] ?? ""), - let count = Int(attributeDict["count"] ?? ""), - let type = Int(attributeDict["type"] ?? ""), - let ambiguous = Bool(attributeDict["ambiguous"] ?? "false") - { - tags.append(MoebooruTag( - id: id, - name: attributeDict["name"] ?? "", - count: count, - type: type, - ambiguous: ambiguous - )) + guard let id = attributeDict["id"], + let name = attributeDict["name"], + let countStr = attributeDict["count"], + let count = Int(countStr), + let typeStr = attributeDict["type"], + let type = Int(typeStr), + let ambiguousStr = attributeDict["ambiguous"] + else { + return } + + currentTag = MoebooruTag( + id: id, + name: name, + count: count, + type: type, + ambiguous: ambiguousStr == "true" + ) + } + } + + func parser(_: XMLParser, didEndElement elementName: String, namespaceURI _: String?, qualifiedName _: String?) { + if elementName == "tag", let tag = currentTag { + tags.append(tag) + + currentTag = nil } } + + #if DEBUG + func parser(_: XMLParser, parseErrorOccurred parseError: any Error) { + print(parseError) + } + #endif } diff --git a/Sora/Data/Settings.swift b/Sora/Data/Settings.swift index cf90a95..4d5a030 100644 --- a/Sora/Data/Settings.swift +++ b/Sora/Data/Settings.swift @@ -9,5 +9,6 @@ class Settings: ObservableObject { @AppStorage("thumbnailType") var thumbnailType: PostFileType = .preview @AppStorage("searchSuggestions") var searchSuggestions: Bool = false @AppStorage("columns") var columns: Int = 2 - @AppStorage("blurUnsafeThumbnails") var blurUnsafeThumbnails: Bool = false + @AppStorage("blurNSFWThumbnails") var blurNSFWThumbnails: Bool = false + @AppStorage("showNSFWPosts") var showNSFWPosts: Bool = false } diff --git a/Sora/Views/Post/PostGridView.swift b/Sora/Views/Post/PostGridView.swift index 99f5013..0a1c37b 100644 --- a/Sora/Views/Post/PostGridView.swift +++ b/Sora/Views/Post/PostGridView.swift @@ -5,26 +5,38 @@ struct PostGridView: View { @EnvironmentObject var settings: Settings @ObservedObject var manager: MoebooruManager + var filteredPosts: [MoebooruPost] { + settings.showNSFWPosts ? manager.posts : manager.posts.filter { $0.rating == "s" } + } + var body: some View { ScrollViewReader { _ in ScrollView { - if manager.posts.isEmpty { + if filteredPosts.isEmpty { ProgressView() .padding() } - WaterfallGrid(manager.posts, id: \.id) { post in + WaterfallGrid(filteredPosts, id: \.id) { post in Group { #if os(macOS) Button { manager.selectedPost = post } label: { - PostView(post: post, manager: manager) + PostView( + post: post, + manager: manager, + posts: filteredPosts + ) } .buttonStyle(PlainButtonStyle()) #else NavigationLink(value: post) { - PostView(post: post, manager: manager) + PostView( + post: post, + manager: manager, + posts: filteredPosts + ) } #endif } diff --git a/Sora/Views/Post/PostView.swift b/Sora/Views/Post/PostView.swift index 335f88e..111d77e 100644 --- a/Sora/Views/Post/PostView.swift +++ b/Sora/Views/Post/PostView.swift @@ -4,6 +4,7 @@ struct PostView: View { @EnvironmentObject var settings: Settings let post: MoebooruPost @ObservedObject var manager: MoebooruManager + let posts: [MoebooruPost] private var thumbnailURL: URL? { switch settings.thumbnailType { case .preview: @@ -24,13 +25,13 @@ struct PostView: View { .resizable() .aspectRatio(contentMode: .fit) .onScrollVisibilityChange { visible in - if post == manager.posts.last && !manager.endOfData && visible { + if post == posts.last && !manager.endOfData && visible { Task { manager.loadNextPage() } } } - .blur(radius: settings.blurUnsafeThumbnails ? post.rating != "s" ? 10 : 0 : 0) + .blur(radius: settings.blurNSFWThumbnails ? post.rating != "s" ? 10 : 0 : 0) } placeholder: { ProgressView() .padding() diff --git a/Sora/Views/Settings/SettingsThumbnailsView.swift b/Sora/Views/Settings/SettingsThumbnailsView.swift index 04b4afb..d5fe750 100644 --- a/Sora/Views/Settings/SettingsThumbnailsView.swift +++ b/Sora/Views/Settings/SettingsThumbnailsView.swift @@ -49,14 +49,28 @@ struct SettingsThumbnailsView: View { #if os(macOS) HStack { - Text("Blur Unsafe Thumbnails") + Text("Show NSFW Posts") Spacer() - Toggle("", isOn: $settings.blurUnsafeThumbnails) + Toggle("", isOn: $settings.showNSFWPosts) } #else - Toggle("Blur Unsafe Thumbnails", isOn: $settings.blurUnsafeThumbnails) + Toggle("Show NSFW Posts", isOn: $settings.showNSFWPosts) #endif + + if settings.showNSFWPosts { + #if os(macOS) + HStack { + Text("Blur NSFW Thumbnails") + + Spacer() + + Toggle("", isOn: $settings.blurNSFWThumbnails) + } + #else + Toggle("Blur NSFW Thumbnails", isOn: $settings.blurUnsafeThumbnails) + #endif + } } } |