summaryrefslogtreecommitdiff
path: root/Sora
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-03-12 03:09:23 -0700
committerFuwn <[email protected]>2025-03-12 03:09:23 -0700
commit872f2b0106ad5dafd98c2843d5099d73a02e81be (patch)
treea908d050cc877b502d7ac29d8d9697b88d1b9aee /Sora
parentfeat: Development commit (diff)
downloadsora-testing-872f2b0106ad5dafd98c2843d5099d73a02e81be.tar.xz
sora-testing-872f2b0106ad5dafd98c2843d5099d73a02e81be.zip
feat: Development commit
Diffstat (limited to 'Sora')
-rw-r--r--Sora/Views/Bookmarks/BookmarksView.swift8
-rw-r--r--Sora/Views/ContentView.swift16
-rw-r--r--Sora/Views/Generic/GenericListView.swift6
-rw-r--r--Sora/Views/MainView.swift35
-rw-r--r--Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift5
-rw-r--r--Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift7
-rw-r--r--Sora/Views/Post/Details/PostDetailsImageView.swift4
-rw-r--r--Sora/Views/Post/Details/PostDetailsTagsView.swift11
-rw-r--r--Sora/Views/Post/Details/PostDetailsView.swift17
-rw-r--r--Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift2
-rw-r--r--Sora/Views/Post/Grid/PostGridSearchHistoryView.swift11
-rw-r--r--Sora/Views/Post/Grid/PostGridThumbnailView.swift2
-rw-r--r--Sora/Views/Post/Grid/PostGridView.swift11
-rw-r--r--Sora/Views/Settings/Section/SettingsSearchView.swift27
14 files changed, 89 insertions, 73 deletions
diff --git a/Sora/Views/Bookmarks/BookmarksView.swift b/Sora/Views/Bookmarks/BookmarksView.swift
index fa7734e..a426be0 100644
--- a/Sora/Views/Bookmarks/BookmarksView.swift
+++ b/Sora/Views/Bookmarks/BookmarksView.swift
@@ -3,9 +3,11 @@ import SwiftUI
struct BookmarksView: View {
@EnvironmentObject var settings: SettingsManager
@Binding var selectedTab: Int
+ @ObservedObject var manager: BooruManager
var body: some View {
GenericListView(
+ manager: manager,
selectedTab: $selectedTab,
isPresented: .constant(false),
title: "Bookmarks",
@@ -21,9 +23,3 @@ struct BookmarksView: View {
) { settings.bookmarks.removeAll() }
}
}
-
-#Preview {
- BookmarksView(selectedTab: .constant(1))
- .environmentObject(SettingsManager())
- .environmentObject(BooruManager(.yandere))
-}
diff --git a/Sora/Views/ContentView.swift b/Sora/Views/ContentView.swift
index a809f90..63f128a 100644
--- a/Sora/Views/ContentView.swift
+++ b/Sora/Views/ContentView.swift
@@ -1,14 +1,13 @@
import SwiftUI
struct ContentView: View {
- @EnvironmentObject var manager: BooruManager
@Binding var selectedTab: Int
@State private var tabs = [
"Posts",
"Search History",
"Bookmarks",
]
- @State private var selectedPost: (post: BooruPost?, manager: BooruManager?)
+ @Binding var selectedPost: (post: BooruPost?, manager: BooruManager?)
var body: some View {
#if os(macOS)
@@ -23,11 +22,12 @@ struct ContentView: View {
case 1:
PostGridSearchHistoryView(
selectedTab: $selectedTab,
- isPresented: .constant(false)
+ isPresented: .constant(false),
+ manager: selectedPost.manager ?? .init()
)
case 2:
- BookmarksView(selectedTab: $selectedTab)
+ BookmarksView(selectedTab: $selectedTab, manager: selectedPost.manager ?? .init())
case 3:
SettingsView()
@@ -37,7 +37,11 @@ struct ContentView: View {
}
} detail: {
if let post = selectedPost.post, let manager = selectedPost.manager {
- PostDetailsView(post: post, manager: manager)
+ PostDetailsView(
+ post: post,
+ manager: manager,
+ selectedPost: $selectedPost
+ )
} else {
Text("Select a Post")
.foregroundColor(.secondary)
@@ -56,7 +60,7 @@ struct ContentView: View {
)
) {
if let post = selectedPost.post, let manager = selectedPost.manager {
- PostDetailsView(post: post, manager: manager)
+ PostDetailsView(post: post, manager: manager, selectedPost: $selectedPost)
}
}
}
diff --git a/Sora/Views/Generic/GenericListView.swift b/Sora/Views/Generic/GenericListView.swift
index d9771ca..1460487 100644
--- a/Sora/Views/Generic/GenericListView.swift
+++ b/Sora/Views/Generic/GenericListView.swift
@@ -2,7 +2,7 @@ import SwiftUI
struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
@EnvironmentObject private var settings: SettingsManager
- @EnvironmentObject private var manager: BooruManager
+ @ObservedObject var manager: BooruManager
@Binding var selectedTab: Int
@State private var searchText: String = ""
@State private var isShowingRemoveAllConfirmation = false
@@ -86,11 +86,11 @@ struct GenericListView<T: Identifiable & Hashable & GenericItem>: View {
manager.searchText = item.tags.joined(separator: " ")
selectedTab = 0
- isPresented.toggle()
-
if previousProvider == settings.preferredBooru {
manager.performSearch(settings: settings)
}
+
+ isPresented.toggle()
}) {
GenericItemView(
item: item,
diff --git a/Sora/Views/MainView.swift b/Sora/Views/MainView.swift
index 2afcfb7..389cf53 100644
--- a/Sora/Views/MainView.swift
+++ b/Sora/Views/MainView.swift
@@ -3,13 +3,11 @@ import SwiftUI
struct MainView: View {
@EnvironmentObject var settings: SettingsManager
@State private var selectedTab: Int = 0
- @State private var manager = BooruManager(.yandere)
@State private var selectedPost: (post: BooruPost?, manager: BooruManager?)
var body: some View {
platformSpecificContent
.environmentObject(settings)
- .environmentObject(manager)
.onChange(of: settings.preferredBooru) { _, newState in
updateManager(newState)
}
@@ -23,15 +21,18 @@ struct MainView: View {
@ViewBuilder private var platformSpecificContent: some View {
#if os(macOS)
- ContentView(selectedTab: $selectedTab)
+ ContentView(selectedTab: $selectedTab, selectedPost: $selectedPost)
#else
TabView(selection: $selectedTab) {
- ContentView(selectedTab: $selectedTab)
+ ContentView(selectedTab: $selectedTab, selectedPost: $selectedPost)
.tabItem { Label("Posts", systemImage: "rectangle.stack") }
.tag(0)
NavigationStack {
- BookmarksView(selectedTab: $selectedTab)
+ BookmarksView(
+ selectedTab: $selectedTab,
+ manager: selectedPost.manager ?? BooruManager()
+ )
}
.tabItem { Label("Bookmarks", systemImage: "bookmark") }
.tag(1)
@@ -44,6 +45,7 @@ struct MainView: View {
}
private func updateManager(_ provider: BooruProvider) {
+ if var manager = selectedPost.manager {
let previousSearchText = manager.searchText
manager = BooruManager(provider)
@@ -58,26 +60,31 @@ struct MainView: View {
manager.performSearch(settings: settings)
}
}
+ }
}
private func initializeManager() {
+ if var manager = selectedPost.manager {
manager = BooruManager(settings.preferredBooru)
- Task {
- refreshTags()
+ Task {
+ refreshTags()
- if manager.posts.isEmpty {
- await manager.fetchPosts()
+ if manager.posts.isEmpty {
+ await manager.fetchPosts()
+ }
}
}
}
private func refreshTags() {
- Task {
- if settings.searchSuggestionsMode != .disabled {
- manager.initializeTags()
- } else {
- manager.updateTagsCacheSize()
+ if let manager = selectedPost.manager {
+ Task {
+ if settings.searchSuggestionsMode != .disabled {
+ manager.initializeTags()
+ } else {
+ manager.updateTagsCacheSize()
+ }
}
}
}
diff --git a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift
index 5aaa209..9d2d95e 100644
--- a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift
+++ b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselItemView.swift
@@ -2,6 +2,7 @@ import SwiftUI
struct PostDetailsCarouselItemView: View {
var post: BooruPost
+ var manager: BooruManager
var index: Int
@Binding var loadingStage: BooruPostLoadingState
var imageURL: (BooruPost) -> URL?
@@ -19,7 +20,8 @@ struct PostDetailsCarouselItemView: View {
ZStack {
PostDetailsImageView(
url: post.previewURL,
- loadingStage: $loadingStage
+ loadingStage: $loadingStage,
+ manager: manager
) {
GeometryReader { geometry in
ProgressView()
@@ -32,6 +34,7 @@ struct PostDetailsCarouselItemView: View {
PostDetailsImageView(
url: imageURL(post),
loadingStage: $loadingStage,
+ manager: manager,
finalLoadingState: .loaded,
post: post
)
diff --git a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift
index 4452b22..88714c3 100644
--- a/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift
+++ b/Sora/Views/Post/Details/Carousel/PostDetailsCarouselView.swift
@@ -1,7 +1,7 @@
import SwiftUI
struct PostDetailsCarouselView: View {
- @EnvironmentObject var manager: BooruManager
+ @ObservedObject var manager: BooruManager
@EnvironmentObject var settings: SettingsManager
let posts: [BooruPost]
let focusedPost: BooruPost?
@@ -12,11 +12,13 @@ struct PostDetailsCarouselView: View {
init(
posts: [BooruPost],
loadingStage: Binding<BooruPostLoadingState>,
- focusedPost: BooruPost? = nil
+ focusedPost: BooruPost? = nil,
+ manager: ObservedObject<BooruManager>
) {
self.posts = posts
self.focusedPost = focusedPost
_loadingStage = loadingStage
+ _manager = manager
if let focused = focusedPost,
let index = posts.firstIndex(where: { $0.id == focused.id })
@@ -45,6 +47,7 @@ struct PostDetailsCarouselView: View {
ForEach(Array(posts.enumerated()), id: \.offset) { index, post in
PostDetailsCarouselItemView(
post: post,
+ manager: manager,
index: index,
loadingStage: $loadingStage,
imageURL: imageURL
diff --git a/Sora/Views/Post/Details/PostDetailsImageView.swift b/Sora/Views/Post/Details/PostDetailsImageView.swift
index 483d435..7d818f2 100644
--- a/Sora/Views/Post/Details/PostDetailsImageView.swift
+++ b/Sora/Views/Post/Details/PostDetailsImageView.swift
@@ -4,7 +4,7 @@ import UserNotifications
struct PostDetailsImageView<Placeholder: View>: View {
@EnvironmentObject var settings: SettingsManager
- @EnvironmentObject var manager: BooruManager
+ @ObservedObject var manager: BooruManager
var url: URL?
@Binding var loadingState: BooruPostLoadingState
var finalLoadingState: BooruPostLoadingState
@@ -130,6 +130,7 @@ struct PostDetailsImageView<Placeholder: View>: View {
init(
url: URL?,
loadingStage: Binding<BooruPostLoadingState>,
+ manager: BooruManager,
finalLoadingState: BooruPostLoadingState = .loadingFile,
post: BooruPost? = nil,
@ViewBuilder placeholder: @escaping () -> Placeholder = {
@@ -146,6 +147,7 @@ struct PostDetailsImageView<Placeholder: View>: View {
self.finalLoadingState = finalLoadingState
self.placeholder = placeholder
self.post = post
+ self.manager = manager
}
private func postURL(for id: String) -> URL {
diff --git a/Sora/Views/Post/Details/PostDetailsTagsView.swift b/Sora/Views/Post/Details/PostDetailsTagsView.swift
index a9ab6a4..107c9f3 100644
--- a/Sora/Views/Post/Details/PostDetailsTagsView.swift
+++ b/Sora/Views/Post/Details/PostDetailsTagsView.swift
@@ -1,16 +1,18 @@
import SwiftUI
struct PostDetailsTagsView: View {
- @EnvironmentObject var manager: BooruManager
+ @ObservedObject var manager: BooruManager
@EnvironmentObject var settings: SettingsManager
@Binding var isPresented: Bool
var tags: [String]
+ @Binding var selectedPost: (post: BooruPost?, manager: BooruManager?)
var body: some View {
List {
ForEach(tags, id: \.self) { tag in
Button(action: {
manager.searchText = tag
+ selectedPost = (nil, nil)
search()
}) {
@@ -19,6 +21,7 @@ struct PostDetailsTagsView: View {
.contextMenu {
Button(action: {
manager.searchText += " \(tag)"
+ selectedPost = (nil, nil)
search()
}) {
@@ -45,9 +48,3 @@ struct PostDetailsTagsView: View {
isPresented.toggle()
}
}
-
-#Preview {
- PostDetailsTagsView(
- isPresented: .constant(true), tags: ["hololive", "absurdres", "nekomimi"]
- )
-}
diff --git a/Sora/Views/Post/Details/PostDetailsView.swift b/Sora/Views/Post/Details/PostDetailsView.swift
index 3b6ef49..c75f022 100644
--- a/Sora/Views/Post/Details/PostDetailsView.swift
+++ b/Sora/Views/Post/Details/PostDetailsView.swift
@@ -3,7 +3,7 @@ import SwiftUI
struct PostDetailsView: View {
@EnvironmentObject var settings: SettingsManager
let post: BooruPost
- let manager: BooruManager
+ @ObservedObject var manager: BooruManager
@State private var loadingStage: BooruPostLoadingState = .loadingPreview
private var imageURL: URL? {
switch settings.detailViewQuality {
@@ -18,6 +18,7 @@ struct PostDetailsView: View {
}
}
@State private var isTagsSheetPresented = false
+ @Binding var selectedPost: (post: BooruPost?, manager: BooruManager?)
var filteredPosts: [BooruPost] {
manager.posts
@@ -30,12 +31,14 @@ struct PostDetailsView: View {
PostDetailsImageView(
url: imageURL,
loadingStage: $loadingStage,
+ manager: manager,
finalLoadingState: .loaded,
post: post
) {
PostDetailsImageView(
url: post.previewURL,
- loadingStage: $loadingStage
+ loadingStage: $loadingStage,
+ manager: manager
)
.id(post.previewURL)
}
@@ -44,7 +47,8 @@ struct PostDetailsView: View {
PostDetailsCarouselView(
posts: filteredPosts,
loadingStage: $loadingStage,
- focusedPost: post
+ focusedPost: post,
+ manager: _manager
)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
#endif
@@ -118,7 +122,12 @@ struct PostDetailsView: View {
#endif
}
.sheet(isPresented: $isTagsSheetPresented) {
- PostDetailsTagsView(isPresented: $isTagsSheetPresented, tags: post.tags)
+ PostDetailsTagsView(
+ manager: manager,
+ isPresented: $isTagsSheetPresented,
+ tags: post.tags,
+ selectedPost: $selectedPost
+ )
.frame(minHeight: 250)
}
}
diff --git a/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift b/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift
index c8478ee..bb6d0c7 100644
--- a/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift
+++ b/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift
@@ -1,7 +1,7 @@
import SwiftUI
struct PostGridBookmarkButtonView: View {
- @EnvironmentObject private var manager: BooruManager
+ @ObservedObject var manager: BooruManager
@EnvironmentObject private var settings: SettingsManager
var contained: Bool {
diff --git a/Sora/Views/Post/Grid/PostGridSearchHistoryView.swift b/Sora/Views/Post/Grid/PostGridSearchHistoryView.swift
index ae33c53..390fd4c 100644
--- a/Sora/Views/Post/Grid/PostGridSearchHistoryView.swift
+++ b/Sora/Views/Post/Grid/PostGridSearchHistoryView.swift
@@ -4,9 +4,11 @@ struct PostGridSearchHistoryView: View {
@EnvironmentObject var settings: SettingsManager
@Binding var selectedTab: Int
@Binding var isPresented: Bool
+ @ObservedObject var manager: BooruManager
var body: some View {
GenericListView(
+ manager: manager,
selectedTab: $selectedTab,
isPresented: $isPresented,
title: "Search History",
@@ -22,12 +24,3 @@ struct PostGridSearchHistoryView: View {
) { settings.searchHistory.removeAll() }
}
}
-
-#Preview {
- PostGridSearchHistoryView(
- selectedTab: .constant(0),
- isPresented: .constant(true)
- )
- .environmentObject(SettingsManager())
- .environmentObject(BooruManager(.safebooru))
-}
diff --git a/Sora/Views/Post/Grid/PostGridThumbnailView.swift b/Sora/Views/Post/Grid/PostGridThumbnailView.swift
index 4973c1e..e2a4c77 100644
--- a/Sora/Views/Post/Grid/PostGridThumbnailView.swift
+++ b/Sora/Views/Post/Grid/PostGridThumbnailView.swift
@@ -3,9 +3,9 @@ import SwiftUI
struct PostGridThumbnailView: View {
@EnvironmentObject var settings: SettingsManager
- @EnvironmentObject var manager: BooruManager
let post: BooruPost
let posts: [BooruPost]
+ let manager: BooruManager
private var thumbnailURL: URL? {
switch settings.thumbnailQuality {
case .preview:
diff --git a/Sora/Views/Post/Grid/PostGridView.swift b/Sora/Views/Post/Grid/PostGridView.swift
index a03463b..7a0091d 100644
--- a/Sora/Views/Post/Grid/PostGridView.swift
+++ b/Sora/Views/Post/Grid/PostGridView.swift
@@ -45,7 +45,7 @@ struct PostGridView: View {
manager.performSearch(settings: settings)
}
.navigationDestination(for: BooruPost.self) { post in
- PostDetailsView(post: post, manager: manager)
+ PostDetailsView(post: post, manager: manager, selectedPost: $selectedPost)
}
.onChange(of: manager.searchText) { _, _ in
if manager.searchText.isEmpty, !isSearching {
@@ -98,9 +98,9 @@ struct PostGridView: View {
if !manager.tags.isEmpty {
#if os(macOS)
- ToolbarItem { PostGridBookmarkButtonView() }
+ ToolbarItem { PostGridBookmarkButtonView(manager: manager) }
#else
- ToolbarItem(placement: .bottomBar) { PostGridBookmarkButtonView() }
+ ToolbarItem(placement: .bottomBar) { PostGridBookmarkButtonView(manager: manager) }
#endif
}
}
@@ -116,7 +116,8 @@ struct PostGridView: View {
.sheet(isPresented: $isSearchHistoryPresented) {
PostGridSearchHistoryView(
selectedTab: $selectedTab,
- isPresented: $isSearchHistoryPresented
+ isPresented: $isSearchHistoryPresented,
+ manager: manager
)
.frame(minHeight: 250)
}
@@ -130,7 +131,7 @@ struct PostGridView: View {
selectedPost.manager = manager
}
} label: {
- PostGridThumbnailView(post: post, posts: filteredPosts)
+ PostGridThumbnailView(post: post, posts: filteredPosts, manager: manager)
}
.buttonStyle(PlainButtonStyle())
.contextMenu {
diff --git a/Sora/Views/Settings/Section/SettingsSearchView.swift b/Sora/Views/Settings/Section/SettingsSearchView.swift
index fbe1656..3408d06 100644
--- a/Sora/Views/Settings/Section/SettingsSearchView.swift
+++ b/Sora/Views/Settings/Section/SettingsSearchView.swift
@@ -3,11 +3,11 @@ import SwiftUI
struct SettingsSearchView: View {
@EnvironmentObject var settings: SettingsManager
- #if os(macOS)
- var manager = BooruManager(.yandere)
- #else
- @EnvironmentObject var manager: BooruManager
- #endif
+// #if os(macOS)
+// var manager = BooruManager(.yandere)
+// #else
+// @EnvironmentObject var manager: BooruManager
+// #endif
var body: some View {
Picker("Suggestion Mode", selection: $settings.searchSuggestionsMode) {
@@ -16,14 +16,15 @@ struct SettingsSearchView: View {
}
}
- Button(
- "Clear Cached Tags (\(manager.cacheSize ?? "Unknown size"))"
- ) {
- manager.clearCachedTags()
- }
- #if os(macOS)
- .frame(maxWidth: .infinity, alignment: .trailing)
- #endif
+ // TODO: Fix for iOS
+// Button(
+// "Clear Cached Tags (\(manager.cacheSize ?? "Unknown size"))"
+// ) {
+// manager.clearCachedTags()
+// }
+// #if os(macOS)
+// .frame(maxWidth: .infinity, alignment: .trailing)
+// #endif
Button("Clear History") {
settings.searchHistory.removeAll()