diff options
Diffstat (limited to 'Sora/Views')
| -rw-r--r-- | Sora/Views/Bookmarks/BookmarkListItemView.swift | 56 | ||||
| -rw-r--r-- | Sora/Views/Bookmarks/BookmarksView.swift | 107 | ||||
| -rw-r--r-- | Sora/Views/ContentView.swift | 78 | ||||
| -rw-r--r-- | Sora/Views/MainView.swift | 104 | ||||
| -rw-r--r-- | Sora/Views/Post/PostDetailsView.swift | 142 | ||||
| -rw-r--r-- | Sora/Views/Post/PostGridBookmarkButtonView.swift | 49 | ||||
| -rw-r--r-- | Sora/Views/Post/PostGridView.swift | 171 | ||||
| -rw-r--r-- | Sora/Views/Post/PostView.swift | 67 | ||||
| -rw-r--r-- | Sora/Views/SearchSuggestionsView.swift | 32 | ||||
| -rw-r--r-- | Sora/Views/Settings/SettingsAttributionsView.swift | 10 | ||||
| -rw-r--r-- | Sora/Views/Settings/SettingsDetailsView.swift | 14 | ||||
| -rw-r--r-- | Sora/Views/Settings/SettingsProviderView.swift | 14 | ||||
| -rw-r--r-- | Sora/Views/Settings/SettingsSearchView.swift | 8 | ||||
| -rw-r--r-- | Sora/Views/Settings/SettingsThumbnailsView.swift | 44 | ||||
| -rw-r--r-- | Sora/Views/SettingsView.swift | 70 |
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()) } |