1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
import SwiftUI
struct PostGridTabSwitcherView: View {
@EnvironmentObject var settings: SettingsManager
@State private var tabs: [PostGridTab] = []
@State private var selectedTabID: UUID?
@Binding private var selectedTab: Int
@State private var searchText: String = ""
@Binding private var selectedPost: (post: BooruPost?, manager: BooruManager?)
init(selectedTab: Binding<Int>, selectedPost: Binding<(post: BooruPost?, manager: BooruManager?)>)
{
let initialTab = PostGridTab(manager: BooruManager())
_tabs = State(initialValue: [initialTab])
_selectedTabID = State(initialValue: initialTab.id)
_selectedTab = selectedTab
_selectedPost = selectedPost
Task { await initialTab.manager.fetchPosts(page: 1, tags: [], replace: true) }
}
private var activeManager: BooruManager? {
if let selectedID = selectedTabID,
let activeTab = tabs.first(where: { $0.id == selectedID })
{
return activeTab.manager
}
return nil
}
var body: some View {
VStack(spacing: 0) {
#if !os(macOS)
ScrollView(.horizontal, showsIndicators: false) {
HStack {
ForEach(tabs) { tab in
PostGridTabButtonView(
title: tab.manager.searchText.isEmpty ? "New Tab" : tab.manager.searchText,
isSelected: tab.id == selectedTabID,
onSelect: { selectedTabID = tab.id },
onClose: {
if tabs.count > 1 {
tabs.removeAll { $0.id == tab.id }
if selectedTabID == tab.id {
selectedTabID = tabs.first!.id
}
}
}
)
}
Button(
action: {
let newTab = PostGridTab(manager: BooruManager())
tabs.append(newTab)
selectedTabID = newTab.id
Task { await newTab.manager.fetchPosts(page: 1, tags: [], replace: true) }
}
) {
Image(systemName: "plus")
}
}
.padding(.horizontal)
}
.background(Color(.systemGray6))
HStack {
TextField(
"Tags",
text: $searchText
) {
if let manager = activeManager {
manager.searchText = searchText
Task { manager.performSearch(settings: settings) }
}
}
.textFieldStyle(PlainTextFieldStyle())
.padding(.vertical, 8)
.padding(.horizontal, 12)
.background(Color(.systemGray5))
.clipShape(RoundedRectangle(cornerRadius: 9))
if !searchText.isEmpty {
Button(action: {
searchText = ""
if let manager = activeManager {
manager.searchText = ""
Task { manager.performSearch(settings: settings) }
}
}) {
Image(systemName: "xmark.circle.fill")
.foregroundColor(.secondary)
}
.buttonStyle(PlainButtonStyle())
}
}
.padding(.horizontal)
.padding(.vertical, 12)
.background(Color(.systemGray6))
#endif
ZStack {
PostGridTabSwitcherContentView(
selectedTabID: $selectedTabID,
selectedPost: $selectedPost,
selectedTab: $selectedTab,
tabs: $tabs
)
}
}
.onChange(of: selectedTabID) { _, newValue in
if let selectedID = newValue,
let activeTab = tabs.first(where: { $0.id == selectedID })
{
searchText = activeTab.manager.searchText
}
}
}
}
|