summaryrefslogtreecommitdiff
path: root/Sora/Views/ContentView.swift
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-06-26 07:05:04 -0700
committerFuwn <[email protected]>2025-06-26 07:05:04 -0700
commitbf612d8a54317f94f0be2febd342819192f461f6 (patch)
treeaf38635f016632f7eba57137afce55c098dd57f9 /Sora/Views/ContentView.swift
parentfeat: Development commit (diff)
downloadsora-testing-bf612d8a54317f94f0be2febd342819192f461f6.tar.xz
sora-testing-bf612d8a54317f94f0be2febd342819192f461f6.zip
feat: Development commit
Diffstat (limited to 'Sora/Views/ContentView.swift')
-rw-r--r--Sora/Views/ContentView.swift74
1 files changed, 63 insertions, 11 deletions
diff --git a/Sora/Views/ContentView.swift b/Sora/Views/ContentView.swift
index 1eea6c2..4758828 100644
--- a/Sora/Views/ContentView.swift
+++ b/Sora/Views/ContentView.swift
@@ -3,10 +3,37 @@ import SwiftUI
struct ContentView: View {
@EnvironmentObject var manager: BooruManager
@Binding var selectedTab: Int
+ @State private var viewStates: [UUID: PostGridViewState] = [:]
+ @State private var viewStateSelection: UUID?
+ @State private var columnVisibility = NavigationSplitViewVisibility.doubleColumn
+
+ var sortedViewStates: [PostGridViewStateItem] {
+ viewStates
+ .map { PostGridViewStateItem(id: $0.key, state: $0.value) }
+ .sorted { $0.state.createdAt > $1.state.createdAt }
+ }
var body: some View {
#if os(macOS)
- NavigationSplitView {
+ NavigationSplitView(columnVisibility: $columnVisibility) {
+ List(selection: $viewStateSelection) {
+ let history = Dictionary(uniqueKeysWithValues: manager.searchHistory.map { ($0.id, $0) })
+
+ if viewStates.isEmpty {
+ Text("No Tags")
+ .tag(UUID.nilUUID())
+ }
+
+ ForEach(sortedViewStates, id: \.id) { item in
+ if let entry = history[item.id] {
+ let tags = entry.tags.joined(separator: " ")
+
+ Text(tags.isEmpty ? "No Tags" : tags)
+ .tag(item.id)
+ }
+ }
+ }
+ } content: {
switch selectedTab {
case 1:
PostGridSearchHistoryView(
@@ -21,7 +48,11 @@ struct ContentView: View {
SettingsView()
default:
- PostGridView(selectedTab: $selectedTab)
+ PostGridView(
+ selectedTab: $selectedTab,
+ viewStates: $viewStates,
+ viewStateSelection: $viewStateSelection
+ )
}
} detail: {
if let post = manager.selectedPost {
@@ -31,17 +62,38 @@ struct ContentView: View {
.foregroundColor(.secondary)
}
}
+ .onChange(of: viewStateSelection) { _, newValue in
+ guard let selectedID = newValue else { return }
+
+ if let index = manager.searchHistory.firstIndex(where: { $0.id == selectedID }) {
+ manager.historyIndex = index
+ }
+ }
+ .onChange(of: sortedViewStates) { _, newKeys in
+ if viewStateSelection == nil || !newKeys.contains(where: { $0.id == viewStateSelection }) {
+ viewStateSelection = newKeys.first?.id ?? UUID.nilUUID()
+ }
+ }
+ .onAppear {
+ if viewStates.isEmpty && viewStateSelection == nil {
+ viewStateSelection = UUID.nilUUID()
+ }
+ }
#else
NavigationStack {
- PostGridView(selectedTab: $selectedTab)
- .navigationDestination(
- isPresented: Binding(
- get: { manager.selectedPost != nil },
- set: { if !$0 { manager.selectedPost = nil } }
- )
- ) {
- if let post = manager.selectedPost { PostDetailsView(post: post) }
- }
+ PostGridView(
+ selectedTab: $selectedTab,
+ viewStates: $viewStates,
+ viewStateSelection: $viewStateSelection
+ )
+ .navigationDestination(
+ isPresented: Binding(
+ get: { manager.selectedPost != nil },
+ set: { if !$0 { manager.selectedPost = nil } }
+ )
+ ) {
+ if let post = manager.selectedPost { PostDetailsView(post: post) }
+ }
}
#endif
}