summaryrefslogtreecommitdiff
path: root/Sora/Views
diff options
context:
space:
mode:
Diffstat (limited to 'Sora/Views')
-rw-r--r--Sora/Views/Bookmarks/BookmarkListItemView.swift56
-rw-r--r--Sora/Views/Bookmarks/BookmarksView.swift107
-rw-r--r--Sora/Views/ContentView.swift78
-rw-r--r--Sora/Views/MainView.swift104
-rw-r--r--Sora/Views/Post/PostDetailsView.swift142
-rw-r--r--Sora/Views/Post/PostGridBookmarkButtonView.swift49
-rw-r--r--Sora/Views/Post/PostGridView.swift171
-rw-r--r--Sora/Views/Post/PostView.swift67
-rw-r--r--Sora/Views/SearchSuggestionsView.swift32
-rw-r--r--Sora/Views/Settings/SettingsAttributionsView.swift10
-rw-r--r--Sora/Views/Settings/SettingsDetailsView.swift14
-rw-r--r--Sora/Views/Settings/SettingsProviderView.swift14
-rw-r--r--Sora/Views/Settings/SettingsSearchView.swift8
-rw-r--r--Sora/Views/Settings/SettingsThumbnailsView.swift44
-rw-r--r--Sora/Views/SettingsView.swift70
15 files changed, 490 insertions, 476 deletions
diff --git a/Sora/Views/Bookmarks/BookmarkListItemView.swift b/Sora/Views/Bookmarks/BookmarkListItemView.swift
index 6d62893..6c46416 100644
--- a/Sora/Views/Bookmarks/BookmarkListItemView.swift
+++ b/Sora/Views/Bookmarks/BookmarkListItemView.swift
@@ -1,39 +1,39 @@
import SwiftUI
struct BookmarkListItemView: View {
- @EnvironmentObject var settings: Settings
- var bookmark: Bookmark
+ @EnvironmentObject var settings: Settings
+ var bookmark: Bookmark
- var body: some View {
- VStack(alignment: .leading) {
- HStack {
- Text(bookmark.tags.joined(separator: ", "))
+ var body: some View {
+ VStack(alignment: .leading) {
+ HStack {
+ Text(bookmark.tags.joined(separator: ", "))
- #if os(macOS)
- Spacer()
+ #if os(macOS)
+ Spacer()
- Button {
- settings.removeBookmark(withID: bookmark.id)
- } label: {
- Image(systemName: "trash")
- }
- #endif
- }
+ Button {
+ settings.removeBookmark(withID: bookmark.id)
+ } label: {
+ Image(systemName: "trash")
+ }
+ #endif
+ }
- HStack {
- Text(bookmark.createdAt, style: .date)
- .font(.caption)
- .foregroundStyle(Color.secondary)
+ HStack {
+ Text(bookmark.createdAt, style: .date)
+ .font(.caption)
+ .foregroundStyle(Color.secondary)
- Spacer()
+ Spacer()
- Text(bookmark.provider.formatted())
- .font(.caption)
- .foregroundStyle(Color.secondary)
- }
- }
- #if os(macOS)
- .padding()
- #endif
+ Text(bookmark.provider.formatted())
+ .font(.caption)
+ .foregroundStyle(Color.secondary)
+ }
}
+ #if os(macOS)
+ .padding()
+ #endif
+ }
}
diff --git a/Sora/Views/Bookmarks/BookmarksView.swift b/Sora/Views/Bookmarks/BookmarksView.swift
index 83eda0e..b36ee45 100644
--- a/Sora/Views/Bookmarks/BookmarksView.swift
+++ b/Sora/Views/Bookmarks/BookmarksView.swift
@@ -1,69 +1,72 @@
import SwiftUI
struct BookmarksView: View {
- @EnvironmentObject var settings: Settings
- @EnvironmentObject var manager: BooruManager
- @Binding var selectedTab: Int
- @State private var bookmarksSearchText: String = ""
+ @EnvironmentObject var settings: Settings
+ @EnvironmentObject var manager: BooruManager
+ @Binding var selectedTab: Int
+ @State private var bookmarksSearchText: String = ""
- var filteredBookmarks: [Bookmark] {
- guard !bookmarksSearchText.isEmpty else {
- return settings.bookmarks
- }
-
- return settings.bookmarks
- .filter { $0.tags.joined(separator: " ").lowercased().contains(bookmarksSearchText.lowercased()) }
+ var filteredBookmarks: [Bookmark] {
+ guard !bookmarksSearchText.isEmpty else {
+ return settings.bookmarks
}
- var body: some View {
- NavigationStack {
- VStack {
- if settings.bookmarks.isEmpty {
- ContentUnavailableView("No Bookmarks",
- systemImage: "bookmark",
- description: Text("Add a bookmark by tapping the bookmark button on a search page."))
- } else {
- List {
- if filteredBookmarks.isEmpty, !bookmarksSearchText.isEmpty {
- Text("No bookmarks match your search")
- }
+ return settings.bookmarks
+ .filter {
+ $0.tags.joined(separator: " ").lowercased().contains(bookmarksSearchText.lowercased())
+ }
+ }
+
+ var body: some View {
+ NavigationStack {
+ VStack {
+ if settings.bookmarks.isEmpty {
+ ContentUnavailableView(
+ "No Bookmarks",
+ systemImage: "bookmark",
+ description: Text("Add a bookmark by tapping the bookmark button on a search page."))
+ } else {
+ List {
+ if filteredBookmarks.isEmpty, !bookmarksSearchText.isEmpty {
+ Text("No bookmarks match your search")
+ }
- ForEach(
- filteredBookmarks,
- id: \.self
- ) { bookmark in
- Button(action: {
- let previousProvider = settings.preferredBooru
+ ForEach(
+ filteredBookmarks,
+ id: \.self
+ ) { bookmark in
+ Button(action: {
+ let previousProvider = settings.preferredBooru
- settings.preferredBooru = bookmark.provider
- manager.searchText = bookmark.tags.joined(separator: " ")
- selectedTab = 0
+ settings.preferredBooru = bookmark.provider
+ manager.searchText = bookmark.tags.joined(separator: " ")
+ selectedTab = 0
- if previousProvider == settings.preferredBooru {
- manager.performSearch()
- }
- }) {
- BookmarkListItemView(bookmark: bookmark)
- }
- #if os(macOS)
- .buttonStyle(.plain)
- #endif
- }
- .onDelete(perform: settings.removeBookmark)
- }
- #if os(macOS)
- .listStyle(.plain)
- #endif
+ if previousProvider == settings.preferredBooru {
+ manager.performSearch()
}
+ }) {
+ BookmarkListItemView(bookmark: bookmark)
+ }
+ #if os(macOS)
+ .buttonStyle(.plain)
+ #endif
}
+ .onDelete(perform: settings.removeBookmark)
+ }
+ #if os(macOS)
+ .listStyle(.plain)
+ #endif
}
- .navigationTitle("Bookmarks")
- .searchable(text: $bookmarksSearchText)
+ }
}
+ .navigationTitle("Bookmarks")
+ .searchable(text: $bookmarksSearchText)
+ }
}
#Preview {
- BookmarksView(selectedTab: .constant(1))
- .environmentObject(Settings())
- .environmentObject(BooruManager(.yandere))
+ BookmarksView(selectedTab: .constant(1))
+ .environmentObject(Settings())
+ .environmentObject(BooruManager(.yandere))
}
diff --git a/Sora/Views/ContentView.swift b/Sora/Views/ContentView.swift
index d6473ab..fab1e14 100644
--- a/Sora/Views/ContentView.swift
+++ b/Sora/Views/ContentView.swift
@@ -1,48 +1,48 @@
import SwiftUI
struct ContentView: View {
- @EnvironmentObject var manager: BooruManager
- @State private var selectedTabIndex: Int = 1
- @State private var tabs = [
- "Posts",
- "Bookmarks",
- ]
+ @EnvironmentObject var manager: BooruManager
+ @State private var selectedTabIndex: Int = 1
+ @State private var tabs = [
+ "Posts",
+ "Bookmarks",
+ ]
- var body: some View {
- #if os(macOS)
- NavigationSplitView {
- List(selection: $selectedTabIndex) {
- ForEach(Array(tabs.enumerated()), id: \.offset) { index, element in
- NavigationLink(value: index) {
- Text(element)
- }
- }
- }
- } content: {
- if selectedTabIndex == 1 {
- BookmarksView(selectedTab: $selectedTabIndex)
- } else {
- PostGridView(
- manager: manager
- )
- }
- } detail: {
- if let post = manager.selectedPost {
- PostDetailsView(post: post)
- } else {
- Text("Select a Post")
- .foregroundColor(.secondary)
- }
+ var body: some View {
+ #if os(macOS)
+ NavigationSplitView {
+ List(selection: $selectedTabIndex) {
+ ForEach(Array(tabs.enumerated()), id: \.offset) { index, element in
+ NavigationLink(value: index) {
+ Text(element)
}
- #else
- NavigationStack {
- PostGridView(manager: manager)
- }
- #endif
- }
+ }
+ }
+ } content: {
+ if selectedTabIndex == 1 {
+ BookmarksView(selectedTab: $selectedTabIndex)
+ } else {
+ PostGridView(
+ manager: manager
+ )
+ }
+ } detail: {
+ if let post = manager.selectedPost {
+ PostDetailsView(post: post)
+ } else {
+ Text("Select a Post")
+ .foregroundColor(.secondary)
+ }
+ }
+ #else
+ NavigationStack {
+ PostGridView(manager: manager)
+ }
+ #endif
+ }
}
#Preview {
- ContentView()
- .environmentObject(Settings())
+ ContentView()
+ .environmentObject(Settings())
}
diff --git a/Sora/Views/MainView.swift b/Sora/Views/MainView.swift
index 82367c7..79ac1a3 100644
--- a/Sora/Views/MainView.swift
+++ b/Sora/Views/MainView.swift
@@ -1,67 +1,67 @@
import SwiftUI
struct MainView: View {
- @EnvironmentObject var settings: Settings
- @State private var selectedTab: Int = 0
- @State private var manager = BooruManager(.yandere)
+ @EnvironmentObject var settings: Settings
+ @State private var selectedTab: Int = 0
+ @State private var manager = BooruManager(.yandere)
- var body: some View {
- platformSpecificContent
- .environmentObject(settings)
- .environmentObject(manager)
- .onChange(of: settings.preferredBooru) { _, newState in
- updateManager(newState)
- }
- .onAppear(perform: initialiseManager)
- }
+ var body: some View {
+ platformSpecificContent
+ .environmentObject(settings)
+ .environmentObject(manager)
+ .onChange(of: settings.preferredBooru) { _, newState in
+ updateManager(newState)
+ }
+ .onAppear(perform: initialiseManager)
+ }
- @ViewBuilder
- private var platformSpecificContent: some View {
- #if os(macOS)
- ContentView()
- #else
- TabView(selection: $selectedTab) {
- ContentView()
- .tabItem { Label("Posts", systemImage: "rectangle.stack") }
- .tag(0)
+ @ViewBuilder
+ private var platformSpecificContent: some View {
+ #if os(macOS)
+ ContentView()
+ #else
+ TabView(selection: $selectedTab) {
+ ContentView()
+ .tabItem { Label("Posts", systemImage: "rectangle.stack") }
+ .tag(0)
- NavigationStack {
- BookmarksView(selectedTab: $selectedTab)
- }
- .tabItem { Label("Bookmarks", systemImage: "bookmark") }
- .tag(1)
+ NavigationStack {
+ BookmarksView(selectedTab: $selectedTab)
+ }
+ .tabItem { Label("Bookmarks", systemImage: "bookmark") }
+ .tag(1)
- NavigationStack {
- SettingsView()
- }
- .tabItem { Label("Settings", systemImage: "gear") }
- .tag(2)
- }
- #endif
- }
+ NavigationStack {
+ SettingsView()
+ }
+ .tabItem { Label("Settings", systemImage: "gear") }
+ .tag(2)
+ }
+ #endif
+ }
- private func updateManager(_ provider: BooruProvider) {
- let previousSearchText = manager.searchText
+ private func updateManager(_ provider: BooruProvider) {
+ let previousSearchText = manager.searchText
- manager = BooruManager(provider)
- manager.searchText = previousSearchText
+ manager = BooruManager(provider)
+ manager.searchText = previousSearchText
- Task {
- if manager.searchText.isEmpty {
- await manager.fetchPosts()
- } else {
- manager.performSearch()
- }
- }
+ Task {
+ if manager.searchText.isEmpty {
+ await manager.fetchPosts()
+ } else {
+ manager.performSearch()
+ }
}
+ }
- private func initialiseManager() {
- manager = BooruManager(settings.preferredBooru)
+ private func initialiseManager() {
+ manager = BooruManager(settings.preferredBooru)
- Task {
- if manager.posts.isEmpty {
- await manager.fetchPosts()
- }
- }
+ Task {
+ if manager.posts.isEmpty {
+ await manager.fetchPosts()
+ }
}
+ }
}
diff --git a/Sora/Views/Post/PostDetailsView.swift b/Sora/Views/Post/PostDetailsView.swift
index 0e2566d..133fa34 100644
--- a/Sora/Views/Post/PostDetailsView.swift
+++ b/Sora/Views/Post/PostDetailsView.swift
@@ -1,83 +1,83 @@
import SwiftUI
struct PostDetailsView: View {
- @EnvironmentObject var settings: Settings
- let post: BooruPost
- @State var loadingStage: PostLoadingState = .loadingPreview
- private var imageURL: URL? {
- switch settings.detailViewType {
- case .preview:
- post.previewURL
- case .sample:
- post.sampleURL
- case .original:
- post.fileURL
- }
+ @EnvironmentObject var settings: Settings
+ let post: BooruPost
+ @State var loadingStage: PostLoadingState = .loadingPreview
+ private var imageURL: URL? {
+ switch settings.detailViewType {
+ case .preview:
+ post.previewURL
+ case .sample:
+ post.sampleURL
+ case .original:
+ post.fileURL
}
+ }
- var body: some View {
- VStack(spacing: 0) {
- AsyncImageWithPreview(
- url: imageURL,
- loadingStage: $loadingStage,
- finalLoadingState: .loaded,
- postURL: URL(string: "https://yande.re/post/show/\(post.id)")!
- ) {
- AsyncImageWithPreview(
- url: post.previewURL,
- loadingStage: $loadingStage
- )
- .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
- .id(post.previewURL)
- }
- .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
- .id(imageURL)
- .padding(0)
- .zIndex(0)
+ var body: some View {
+ VStack(spacing: 0) {
+ AsyncImageWithPreview(
+ url: imageURL,
+ loadingStage: $loadingStage,
+ finalLoadingState: .loaded,
+ postURL: URL(string: "https://yande.re/post/show/\(post.id)")!
+ ) {
+ AsyncImageWithPreview(
+ url: post.previewURL,
+ loadingStage: $loadingStage
+ )
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
+ .id(post.previewURL)
+ }
+ .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
+ .id(imageURL)
+ .padding(0)
+ .zIndex(0)
- VStack(spacing: 5) {
- HStack {
- Text(post.tags.joined(separator: ", "))
- }
- .frame(maxWidth: .infinity, alignment: .leading)
+ VStack(spacing: 5) {
+ HStack {
+ Text(post.tags.joined(separator: ", "))
+ }
+ .frame(maxWidth: .infinity, alignment: .leading)
- HStack {
- Text(
- post.createdAt.formatted()
- )
- .frame(maxWidth: .infinity, alignment: .leading)
+ HStack {
+ Text(
+ post.createdAt.formatted()
+ )
+ .frame(maxWidth: .infinity, alignment: .leading)
- Group {
- switch loadingStage {
- case .loadingPreview:
- Text("Loading preview …")
- case .loadingFile:
- Text("Loading \(settings.detailViewType.rawValue) …")
- case .loaded:
- EmptyView()
- }
- }
- .padding(.trailing, 5)
- }
- .frame(maxWidth: .infinity, alignment: .leading)
- .foregroundStyle(.secondary)
+ Group {
+ switch loadingStage {
+ case .loadingPreview:
+ Text("Loading preview …")
+ case .loadingFile:
+ Text("Loading \(settings.detailViewType.rawValue) …")
+ case .loaded:
+ EmptyView()
}
- .padding(.horizontal, 10)
- .padding(.vertical, 10 / 1.33)
- .textSelection(.enabled)
- .font(.footnote)
- #if os(iOS)
- .background(.ultraThinMaterial)
- #else
- .background(.opacity(0.1))
- #endif
- .zIndex(1)
+ }
+ .padding(.trailing, 5)
}
- .navigationTitle("Details")
- #if os(iOS)
- .navigationBarTitleDisplayMode(.inline)
- .toolbarBackground(.visible, for: .navigationBar)
- .toolbarBackground(.ultraThinMaterial, for: .navigationBar)
- #endif
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .foregroundStyle(.secondary)
+ }
+ .padding(.horizontal, 10)
+ .padding(.vertical, 10 / 1.33)
+ .textSelection(.enabled)
+ .font(.footnote)
+ #if os(iOS)
+ .background(.ultraThinMaterial)
+ #else
+ .background(.opacity(0.1))
+ #endif
+ .zIndex(1)
}
+ .navigationTitle("Details")
+ #if os(iOS)
+ .navigationBarTitleDisplayMode(.inline)
+ .toolbarBackground(.visible, for: .navigationBar)
+ .toolbarBackground(.ultraThinMaterial, for: .navigationBar)
+ #endif
+ }
}
diff --git a/Sora/Views/Post/PostGridBookmarkButtonView.swift b/Sora/Views/Post/PostGridBookmarkButtonView.swift
index 90336f9..f23482f 100644
--- a/Sora/Views/Post/PostGridBookmarkButtonView.swift
+++ b/Sora/Views/Post/PostGridBookmarkButtonView.swift
@@ -1,28 +1,33 @@
import SwiftUI
struct PostGridBookmarkButtonView: View {
- @EnvironmentObject private var manager: BooruManager
- @EnvironmentObject private var settings: Settings
+ @EnvironmentObject private var manager: BooruManager
+ @EnvironmentObject private var settings: Settings
- var contained: Bool {
- settings.bookmarks
- .contains(where: { $0.tags == manager.tags.map { $0.lowercased() } && $0.provider == manager.provider ?? settings.preferredBooru })
- }
+ var contained: Bool {
+ settings.bookmarks
+ .contains(where: {
+ $0.tags == manager.tags.map { $0.lowercased() }
+ && $0.provider == manager.provider ?? settings.preferredBooru
+ })
+ }
- var body: some View {
- Button(
- action: {
- contained ? settings
- .removeBookmark(withTags: manager.tags) : settings
- .addBookmark(
- provider: manager.provider ?? settings.preferredBooru,
- tags: manager.tags
- )
- }) {
- Label("Bookmark", systemImage:
- contained ?
- "bookmark.fill" :
- "bookmark")
- }
- }
+ var body: some View {
+ Button(
+ action: {
+ contained
+ ? settings
+ .removeBookmark(withTags: manager.tags)
+ : settings
+ .addBookmark(
+ provider: manager.provider ?? settings.preferredBooru,
+ tags: manager.tags
+ )
+ }) {
+ Label(
+ "Bookmark",
+ systemImage:
+ contained ? "bookmark.fill" : "bookmark")
+ }
+ }
}
diff --git a/Sora/Views/Post/PostGridView.swift b/Sora/Views/Post/PostGridView.swift
index 89c762a..842d0a6 100644
--- a/Sora/Views/Post/PostGridView.swift
+++ b/Sora/Views/Post/PostGridView.swift
@@ -2,98 +2,99 @@ import SwiftUI
import WaterfallGrid
struct PostGridView: View {
- @EnvironmentObject var settings: Settings
- @ObservedObject var manager: BooruManager
- @Environment(\.isSearching) private var isSearching
+ @EnvironmentObject var settings: Settings
+ @ObservedObject var manager: BooruManager
+ @Environment(\.isSearching) private var isSearching
- var filteredPosts: [BooruPost] {
- (settings.showNSFWPosts ? manager.posts : manager.posts.filter { $0.rating == "s" || $0.rating == "q" })
- .sorted(by: { $0.id > $1.id })
- }
+ var filteredPosts: [BooruPost] {
+ (settings.showNSFWPosts
+ ? manager.posts : manager.posts.filter { $0.rating == "s" || $0.rating == "q" })
+ .sorted(by: { $0.id > $1.id })
+ }
- var body: some View {
- ScrollViewReader { _ in
- ScrollView {
- if filteredPosts.isEmpty {
- ProgressView()
- .padding()
- }
+ var body: some View {
+ ScrollViewReader { _ in
+ ScrollView {
+ if filteredPosts.isEmpty {
+ ProgressView()
+ .padding()
+ }
- WaterfallGrid(filteredPosts, id: \.id) { post in
- Group {
- #if os(macOS)
- Button {
- manager.selectedPost = post
- } label: {
- PostView(
- post: post,
- manager: manager,
- posts: filteredPosts
- )
- }
- .buttonStyle(PlainButtonStyle())
- #else
- NavigationLink(value: post) {
- PostView(
- post: post,
- manager: manager,
- posts: filteredPosts
- )
- }
- #endif
- }
- }
- .gridStyle(columns: settings.columns)
- }
- .searchable(text: $manager.searchText, prompt: "Tags")
- .searchSuggestions {
- if settings.searchSuggestions {
- SearchSuggestionsView(
- tags: manager.allTags,
- searchText: $manager.searchText
- )
- }
- }
- .onSubmit(of: .search, manager.performSearch)
- .navigationDestination(for: BooruPost.self) { post in
- PostDetailsView(post: post)
- }
- .onChange(of: manager.searchText) { _, _ in
- if manager.searchText.isEmpty, !isSearching {
- Task {
- manager.performSearch()
- }
- }
+ WaterfallGrid(filteredPosts, id: \.id) { post in
+ Group {
+ #if os(macOS)
+ Button {
+ manager.selectedPost = post
+ } label: {
+ PostView(
+ post: post,
+ manager: manager,
+ posts: filteredPosts
+ )
+ }
+ .buttonStyle(PlainButtonStyle())
+ #else
+ NavigationLink(value: post) {
+ PostView(
+ post: post,
+ manager: manager,
+ posts: filteredPosts
+ )
+ }
+ #endif
+ }
+ }
+ .gridStyle(columns: settings.columns)
+ }
+ .searchable(text: $manager.searchText, prompt: "Tags")
+ .searchSuggestions {
+ if settings.searchSuggestions {
+ SearchSuggestionsView(
+ tags: manager.allTags,
+ searchText: $manager.searchText
+ )
+ }
+ }
+ .onSubmit(of: .search, manager.performSearch)
+ .navigationDestination(for: BooruPost.self) { post in
+ PostDetailsView(post: post)
+ }
+ .onChange(of: manager.searchText) { _, _ in
+ if manager.searchText.isEmpty, !isSearching {
+ Task {
+ manager.performSearch()
+ }
+ }
+ }
+ .toolbar {
+ #if os(macOS)
+ ToolbarItem {
+ Button(action: {
+ Task {
+ await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
+ }
+ }) {
+ Label("Refresh", systemImage: "arrow.clockwise")
}
- .toolbar {
- #if os(macOS)
- ToolbarItem {
- Button(action: {
- Task {
- await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
- }
- }) {
- Label("Refresh", systemImage: "arrow.clockwise")
- }
- }
- #endif
+ }
+ #endif
- if !manager.tags.isEmpty {
- #if os(macOS)
- ToolbarItem {
- PostGridBookmarkButtonView()
- }
- #else
- ToolbarItem(placement: .bottomBar) {
- PostGridBookmarkButtonView()
- }
- #endif
- }
+ if !manager.tags.isEmpty {
+ #if os(macOS)
+ ToolbarItem {
+ PostGridBookmarkButtonView()
}
- .navigationTitle("Posts")
- .refreshable {
- await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
+ #else
+ ToolbarItem(placement: .bottomBar) {
+ PostGridBookmarkButtonView()
}
+ #endif
}
+ }
+ .navigationTitle("Posts")
+ .refreshable {
+ await manager.fetchPosts(page: 1, tags: manager.tags, replace: true)
+ }
}
+ }
}
diff --git a/Sora/Views/Post/PostView.swift b/Sora/Views/Post/PostView.swift
index ce46152..9b92f4f 100644
--- a/Sora/Views/Post/PostView.swift
+++ b/Sora/Views/Post/PostView.swift
@@ -1,40 +1,43 @@
import SwiftUI
struct PostView: View {
- @EnvironmentObject var settings: Settings
- let post: BooruPost
- @ObservedObject var manager: BooruManager
- let posts: [BooruPost]
- private var thumbnailURL: URL? {
- switch settings.thumbnailType {
- case .preview:
- post.previewURL
- case .sample:
- post.sampleURL
- case .original:
- post.fileURL
- }
+ @EnvironmentObject var settings: Settings
+ let post: BooruPost
+ @ObservedObject var manager: BooruManager
+ let posts: [BooruPost]
+ private var thumbnailURL: URL? {
+ switch settings.thumbnailType {
+ case .preview:
+ post.previewURL
+ case .sample:
+ post.sampleURL
+ case .original:
+ post.fileURL
}
+ }
- var body: some View {
- VStack {
- AsyncImage(url: thumbnailURL) { image in
- image
- .resizable()
- .aspectRatio(contentMode: .fit)
- .onScrollVisibilityChange { visible in
- if post == posts.last, !manager.endOfData, visible {
- Task {
- manager.loadNextPage()
- }
- }
- }
- .blur(radius: settings.blurNSFWThumbnails ? (post.rating != "s" && post.rating != "q") ? 10 : 0 : 0)
- .animation(.default, value: settings.blurNSFWThumbnails)
- } placeholder: {
- ProgressView()
- .padding()
+ var body: some View {
+ VStack {
+ AsyncImage(url: thumbnailURL) { image in
+ image
+ .resizable()
+ .aspectRatio(contentMode: .fit)
+ .onScrollVisibilityChange { visible in
+ if post == posts.last, !manager.endOfData, visible {
+ Task {
+ manager.loadNextPage()
+ }
}
- }
+ }
+ .blur(
+ radius: settings.blurNSFWThumbnails
+ ? (post.rating != "s" && post.rating != "q") ? 10 : 0 : 0
+ )
+ .animation(.default, value: settings.blurNSFWThumbnails)
+ } placeholder: {
+ ProgressView()
+ .padding()
+ }
}
+ }
}
diff --git a/Sora/Views/SearchSuggestionsView.swift b/Sora/Views/SearchSuggestionsView.swift
index b9c3133..91f1f77 100644
--- a/Sora/Views/SearchSuggestionsView.swift
+++ b/Sora/Views/SearchSuggestionsView.swift
@@ -1,21 +1,23 @@
import SwiftUI
struct SearchSuggestionsView: View {
- var tags: [BooruTag]
- @Binding var searchText: String
- var lastSearchTag: String {
- String(searchText.split(separator: " ").last ?? "")
- }
+ var tags: [BooruTag]
+ @Binding var searchText: String
+ var lastSearchTag: String {
+ String(searchText.split(separator: " ").last ?? "")
+ }
- var body: some View {
- ForEach(
- tags.filter { $0.name.lowercased().contains(lastSearchTag)
- }) { suggestion in
- Button {
- searchText.replaceSubrange(searchText.range(of: lastSearchTag)!, with: suggestion.name)
- } label: {
- Text(suggestion.name)
- }
- }
+ var body: some View {
+ ForEach(
+ tags.filter {
+ $0.name.lowercased().contains(lastSearchTag)
+ }
+ ) { suggestion in
+ Button {
+ searchText.replaceSubrange(searchText.range(of: lastSearchTag)!, with: suggestion.name)
+ } label: {
+ Text(suggestion.name)
+ }
}
+ }
}
diff --git a/Sora/Views/Settings/SettingsAttributionsView.swift b/Sora/Views/Settings/SettingsAttributionsView.swift
index 28481fd..3c94c4e 100644
--- a/Sora/Views/Settings/SettingsAttributionsView.swift
+++ b/Sora/Views/Settings/SettingsAttributionsView.swift
@@ -1,9 +1,9 @@
import SwiftUI
struct SettingsAttributionsView: View {
- var body: some View {
- Text("Rabbit SVG created by Kim Sun Young")
- .fontWeight(.light)
- .foregroundColor(.secondary)
- }
+ var body: some View {
+ Text("Rabbit SVG created by Kim Sun Young")
+ .fontWeight(.light)
+ .foregroundColor(.secondary)
+ }
}
diff --git a/Sora/Views/Settings/SettingsDetailsView.swift b/Sora/Views/Settings/SettingsDetailsView.swift
index 6b9be8d..713577c 100644
--- a/Sora/Views/Settings/SettingsDetailsView.swift
+++ b/Sora/Views/Settings/SettingsDetailsView.swift
@@ -1,13 +1,13 @@
import SwiftUI
struct SettingsDetailsView: View {
- @EnvironmentObject var settings: Settings
+ @EnvironmentObject var settings: Settings
- var body: some View {
- Picker("Detail View Type", selection: $settings.detailViewType) {
- ForEach(BooruPostFileType.allCases, id: \.self) { type in
- Text(type.rawValue.capitalized).tag(type)
- }
- }
+ var body: some View {
+ Picker("Detail View Type", selection: $settings.detailViewType) {
+ ForEach(BooruPostFileType.allCases, id: \.self) { type in
+ Text(type.rawValue.capitalized).tag(type)
+ }
}
+ }
}
diff --git a/Sora/Views/Settings/SettingsProviderView.swift b/Sora/Views/Settings/SettingsProviderView.swift
index 0829497..907450d 100644
--- a/Sora/Views/Settings/SettingsProviderView.swift
+++ b/Sora/Views/Settings/SettingsProviderView.swift
@@ -1,13 +1,13 @@
import SwiftUI
struct SettingsProviderView: View {
- @EnvironmentObject var settings: Settings
+ @EnvironmentObject var settings: Settings
- var body: some View {
- Picker("Provider", selection: $settings.preferredBooru) {
- ForEach(BooruProvider.allCases, id: \.self) { type in
- Text(type.formatted()).tag(type)
- }
- }
+ var body: some View {
+ Picker("Provider", selection: $settings.preferredBooru) {
+ ForEach(BooruProvider.allCases, id: \.self) { type in
+ Text(type.formatted()).tag(type)
+ }
}
+ }
}
diff --git a/Sora/Views/Settings/SettingsSearchView.swift b/Sora/Views/Settings/SettingsSearchView.swift
index 1052abf..63be2f1 100644
--- a/Sora/Views/Settings/SettingsSearchView.swift
+++ b/Sora/Views/Settings/SettingsSearchView.swift
@@ -1,9 +1,9 @@
import SwiftUI
struct SettingsSearchView: View {
- @EnvironmentObject var settings: Settings
+ @EnvironmentObject var settings: Settings
- var body: some View {
- Toggle("Suggest Search Tags", isOn: $settings.searchSuggestions)
- }
+ var body: some View {
+ Toggle("Suggest Search Tags", isOn: $settings.searchSuggestions)
+ }
}
diff --git a/Sora/Views/Settings/SettingsThumbnailsView.swift b/Sora/Views/Settings/SettingsThumbnailsView.swift
index 6503e19..6631987 100644
--- a/Sora/Views/Settings/SettingsThumbnailsView.swift
+++ b/Sora/Views/Settings/SettingsThumbnailsView.swift
@@ -1,31 +1,31 @@
import SwiftUI
struct SettingsThumbnailsView: View {
- @EnvironmentObject var settings: Settings
+ @EnvironmentObject var settings: Settings
- var body: some View {
- Picker("Thumbnail Type", selection: $settings.thumbnailType) {
- ForEach(BooruPostFileType.allCases, id: \.self) { type in
- Text(type.rawValue.capitalized).tag(type)
- }
- }
+ var body: some View {
+ Picker("Thumbnail Type", selection: $settings.thumbnailType) {
+ ForEach(BooruPostFileType.allCases, id: \.self) { type in
+ Text(type.rawValue.capitalized).tag(type)
+ }
+ }
- #if os(macOS)
- Picker("Thumbnail Columns", selection: $settings.columns) {
- ForEach(1 ... 10, id: \.self) { i in Text("\(i)") }
- }
- #else
- Stepper(
- "Thumbnail Columns: \(settings.columns)",
- value: $settings.columns,
- in: 1 ... 10
- )
- #endif
+ #if os(macOS)
+ Picker("Thumbnail Columns", selection: $settings.columns) {
+ ForEach(1...10, id: \.self) { i in Text("\(i)") }
+ }
+ #else
+ Stepper(
+ "Thumbnail Columns: \(settings.columns)",
+ value: $settings.columns,
+ in: 1...10
+ )
+ #endif
- Toggle("Show NSFW Posts", isOn: $settings.showNSFWPosts)
+ Toggle("Show NSFW Posts", isOn: $settings.showNSFWPosts)
- if settings.showNSFWPosts {
- Toggle("Blur NSFW Thumbnails", isOn: $settings.blurNSFWThumbnails)
- }
+ if settings.showNSFWPosts {
+ Toggle("Blur NSFW Thumbnails", isOn: $settings.blurNSFWThumbnails)
}
+ }
}
diff --git a/Sora/Views/SettingsView.swift b/Sora/Views/SettingsView.swift
index a4a37ae..ab92a42 100644
--- a/Sora/Views/SettingsView.swift
+++ b/Sora/Views/SettingsView.swift
@@ -1,44 +1,44 @@
import SwiftUI
struct SettingsView: View {
- @EnvironmentObject var settings: Settings
-
- var body: some View {
- Form {
- Section(header: Text("Provider")) {
- SettingsProviderView()
- }
-
- Section(header: Text("Thumbnails")) {
- SettingsThumbnailsView()
- }
-
- Section(header: Text("Details")) {
- SettingsDetailsView()
- }
-
- Section(header: Text("Search")) {
- SettingsSearchView()
- }
-
- Section(header: Text("Settings")) {
- Button("Reset to Defaults") {
- settings.resetToDefaults()
- }
- }
-
- Section(header: Text("Attributions")) {
- SettingsAttributionsView()
- }
+ @EnvironmentObject var settings: Settings
+
+ var body: some View {
+ Form {
+ Section(header: Text("Provider")) {
+ SettingsProviderView()
+ }
+
+ Section(header: Text("Thumbnails")) {
+ SettingsThumbnailsView()
+ }
+
+ Section(header: Text("Details")) {
+ SettingsDetailsView()
+ }
+
+ Section(header: Text("Search")) {
+ SettingsSearchView()
+ }
+
+ Section(header: Text("Settings")) {
+ Button("Reset to Defaults") {
+ settings.resetToDefaults()
}
- #if os(macOS)
- .formStyle(.grouped)
- #endif
- .navigationTitle("Settings")
+ }
+
+ Section(header: Text("Attributions")) {
+ SettingsAttributionsView()
+ }
}
+ #if os(macOS)
+ .formStyle(.grouped)
+ #endif
+ .navigationTitle("Settings")
+ }
}
#Preview {
- SettingsView()
- .environmentObject(Settings())
+ SettingsView()
+ .environmentObject(Settings())
}