diff options
| author | Fuwn <[email protected]> | 2025-06-26 07:05:04 -0700 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-06-26 07:05:04 -0700 |
| commit | bf612d8a54317f94f0be2febd342819192f461f6 (patch) | |
| tree | af38635f016632f7eba57137afce55c098dd57f9 /Sora/Views/ContentView.swift | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-bf612d8a54317f94f0be2febd342819192f461f6.tar.xz sora-testing-bf612d8a54317f94f0be2febd342819192f461f6.zip | |
feat: Development commit
Diffstat (limited to 'Sora/Views/ContentView.swift')
| -rw-r--r-- | Sora/Views/ContentView.swift | 74 |
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 } |