Skip to content

Commit 89a1830

Browse files
authored
Update views stack to cleanup unnecessary nesting (#223)
1 parent 4a7e4c2 commit 89a1830

15 files changed

Lines changed: 215 additions & 216 deletions

Views/Components/ListHeader.swift

Lines changed: 57 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,28 @@ import SwiftUI
55
struct ListHeaderStyle: ViewModifier {
66
let height: CGFloat
77
let padding: EdgeInsets
8+
let opaque: Bool
89

9-
init(height: CGFloat = 36, padding: EdgeInsets? = nil) {
10+
init(height: CGFloat = 36, padding: EdgeInsets? = nil, opaque: Bool = false) {
1011
self.height = height
1112
self.padding = padding ?? EdgeInsets(top: 8, leading: 12, bottom: 8, trailing: 12)
13+
self.opaque = opaque
1214
}
1315

1416
func body(content: Content) -> some View {
1517
content
1618
.padding(padding)
1719
.frame(maxWidth: .infinity)
1820
.frame(height: height)
19-
.background(Color(NSColor.clear))
21+
.background(opaque ? Color(NSColor.controlBackgroundColor) : Color(NSColor.clear))
2022
}
2123
}
2224

2325
// MARK: - View Extension
2426

2527
extension View {
26-
func listHeaderStyle(height: CGFloat = 36, padding: EdgeInsets? = nil) -> some View {
27-
modifier(ListHeaderStyle(height: height, padding: padding))
28+
func listHeaderStyle(height: CGFloat = 36, padding: EdgeInsets? = nil, opaque: Bool = false) -> some View {
29+
modifier(ListHeaderStyle(height: height, padding: padding, opaque: opaque))
2830
}
2931
}
3032

@@ -39,17 +41,20 @@ struct ListHeader<Content: View>: View {
3941
let type: HeaderType
4042
let height: CGFloat?
4143
let padding: EdgeInsets?
44+
let opaque: Bool
4245
let content: () -> Content
4346

4447
init(
4548
type: HeaderType = .simple,
4649
height: CGFloat? = nil,
4750
padding: EdgeInsets? = nil,
51+
opaque: Bool = false,
4852
@ViewBuilder content: @escaping () -> Content
4953
) {
5054
self.type = type
5155
self.height = height
5256
self.padding = padding
57+
self.opaque = opaque
5358
self.content = content
5459
}
5560

@@ -59,7 +64,8 @@ struct ListHeader<Content: View>: View {
5964
}
6065
.listHeaderStyle(
6166
height: height ?? (type == .simple ? 36 : 120),
62-
padding: padding
67+
padding: padding,
68+
opaque: opaque
6369
)
6470
}
6571
}
@@ -99,92 +105,73 @@ struct EntityHeader<Content: View>: View {
99105
struct TrackListHeader<Trailing: View>: View {
100106
let title: String
101107
let subtitle: String?
102-
let trackCount: Int
108+
let trackCount: Int?
109+
let sortOrder: Binding<[KeyPathComparator<Track>]>?
110+
let tableRowSize: Binding<TableRowSize>?
103111
let trailing: (() -> Trailing)?
104112

113+
// With sort options + trailing content
105114
init(
106115
title: String,
107116
subtitle: String? = nil,
108-
trackCount: Int,
109-
@ViewBuilder trailing: @escaping () -> Trailing
117+
sortOrder: Binding<[KeyPathComparator<Track>]>,
118+
tableRowSize: Binding<TableRowSize>,
119+
@ViewBuilder trailingContent: @escaping () -> Trailing
110120
) {
111121
self.title = title
112122
self.subtitle = subtitle
113-
self.trackCount = trackCount
114-
self.trailing = trailing
123+
self.trackCount = nil
124+
self.sortOrder = sortOrder
125+
self.tableRowSize = tableRowSize
126+
self.trailing = trailingContent
115127
}
116128

129+
// With sort options, no trailing content
117130
init(
118131
title: String,
119132
subtitle: String? = nil,
120-
trackCount: Int
133+
sortOrder: Binding<[KeyPathComparator<Track>]>,
134+
tableRowSize: Binding<TableRowSize>
121135
) where Trailing == EmptyView {
122136
self.title = title
123137
self.subtitle = subtitle
124-
self.trackCount = trackCount
138+
self.trackCount = nil
139+
self.sortOrder = sortOrder
140+
self.tableRowSize = tableRowSize
125141
self.trailing = nil
126142
}
127143

128-
var body: some View {
129-
ListHeader {
130-
VStack(alignment: .leading, spacing: 2) {
131-
Text(title)
132-
.headerTitleStyle()
133-
134-
if let subtitle = subtitle {
135-
Text(subtitle)
136-
.headerSubtitleStyle()
137-
}
138-
}
139-
140-
Spacer()
141-
142-
if let trailing = trailing {
143-
trailing()
144-
} else {
145-
Text("\(trackCount) tracks")
146-
.headerSubtitleStyle()
147-
}
148-
}
149-
}
150-
}
151-
152-
struct TrackListHeaderWithOptions<TrailingContent: View>: View {
153-
let title: String
154-
let subtitle: String?
155-
@Binding var sortOrder: [KeyPathComparator<Track>]
156-
@Binding var tableRowSize: TableRowSize
157-
let trailingContent: TrailingContent
158-
144+
// With track count + trailing content, no sort options
159145
init(
160146
title: String,
161147
subtitle: String? = nil,
162-
sortOrder: Binding<[KeyPathComparator<Track>]>,
163-
tableRowSize: Binding<TableRowSize>,
164-
@ViewBuilder trailingContent: () -> TrailingContent
148+
trackCount: Int,
149+
@ViewBuilder trailing: @escaping () -> Trailing
165150
) {
166151
self.title = title
167152
self.subtitle = subtitle
168-
self._sortOrder = sortOrder
169-
self._tableRowSize = tableRowSize
170-
self.trailingContent = trailingContent()
153+
self.trackCount = trackCount
154+
self.sortOrder = nil
155+
self.tableRowSize = nil
156+
self.trailing = trailing
171157
}
172-
158+
159+
// With track count only, no sort options, no trailing
173160
init(
174161
title: String,
175162
subtitle: String? = nil,
176-
sortOrder: Binding<[KeyPathComparator<Track>]>,
177-
tableRowSize: Binding<TableRowSize>
178-
) where TrailingContent == EmptyView {
163+
trackCount: Int
164+
) where Trailing == EmptyView {
179165
self.title = title
180166
self.subtitle = subtitle
181-
self._sortOrder = sortOrder
182-
self._tableRowSize = tableRowSize
183-
self.trailingContent = EmptyView()
167+
self.trackCount = trackCount
168+
self.sortOrder = nil
169+
self.tableRowSize = nil
170+
self.trailing = nil
184171
}
185172

186173
var body: some View {
187-
ListHeader {
174+
ListHeader(opaque: true) {
188175
VStack(alignment: .leading, spacing: 2) {
189176
Text(title)
190177
.headerTitleStyle()
@@ -196,13 +183,20 @@ struct TrackListHeaderWithOptions<TrailingContent: View>: View {
196183
}
197184

198185
Spacer()
199-
200-
trailingContent
201186

202-
TrackTableOptionsDropdown(
203-
sortOrder: $sortOrder,
204-
tableRowSize: $tableRowSize
205-
)
187+
if let trailing = trailing {
188+
trailing()
189+
} else if let trackCount = trackCount {
190+
Text("\(trackCount) tracks")
191+
.headerSubtitleStyle()
192+
}
193+
194+
if let sortOrder = sortOrder, let tableRowSize = tableRowSize {
195+
TrackTableOptionsDropdown(
196+
sortOrder: sortOrder,
197+
tableRowSize: tableRowSize
198+
)
199+
}
206200
}
207201
}
208202
}

Views/Components/PersistentSplitView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ struct PersistentSplitView<Left: View, Center: View, Right: View>: View {
111111
left()
112112
.frame(width: leftWidth)
113113
.frame(maxHeight: .infinity)
114+
.background(.ultraThinMaterial)
114115
.layoutPriority(1)
115116

116117
SplitDivider(

Views/Components/TrackViews/TrackTableView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,7 @@ struct TrackTableView: View {
297297
.defaultVisibility(.visible)
298298
}
299299
}
300-
.background(Color(NSColor.controlBackgroundColor))
300+
.scrollContentBackground(.hidden)
301301
.environment(\.defaultMinListRowHeight, tableRowSize.rowHeight)
302302
}
303303

Views/Folders/FolderSidebarView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ struct FoldersSidebarView: View {
5151
// MARK: - Header
5252

5353
private var sidebarHeader: some View {
54-
ListHeader {
54+
ListHeader(opaque: true) {
5555
Text("Folders")
5656
.headerTitleStyle()
5757

Views/Folders/FoldersView.swift

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ struct FoldersView: View {
55
@EnvironmentObject var playbackManager: PlaybackManager
66
@EnvironmentObject var libraryManager: LibraryManager
77
@EnvironmentObject var playlistManager: PlaylistManager
8-
@State private var selectedFolderNode: FolderNode?
8+
@Binding var selectedFolderNode: FolderNode?
99
@State private var selectedTrackID: UUID?
1010
@State private var showingRemoveFolderAlert = false
1111
@State private var folderTracks: [Track] = []
@@ -19,26 +19,13 @@ struct FoldersView: View {
1919
if !libraryManager.shouldShowMainUI {
2020
NoMusicEmptyStateView(context: .mainWindow)
2121
} else {
22-
PersistentSplitView(
23-
left: {
24-
foldersSidebar
25-
},
26-
main: {
27-
folderTracksView
22+
folderTracksView
23+
.onChange(of: selectedFolderNode) { _, newNode in
24+
handleFolderNodeSelection(newNode)
2825
}
29-
)
3026
}
3127
}
3228

33-
// MARK: - Folders Sidebar
34-
35-
private var foldersSidebar: some View {
36-
FoldersSidebarView(selectedNode: $selectedFolderNode)
37-
.onChange(of: selectedFolderNode) { _, newNode in
38-
handleFolderNodeSelection(newNode)
39-
}
40-
}
41-
4229
// MARK: - Folder Tracks View
4330

4431
private var folderTracksView: some View {
@@ -54,7 +41,7 @@ struct FoldersView: View {
5441
@ViewBuilder
5542
private var folderTracksHeader: some View {
5643
if let node = selectedFolderNode {
57-
TrackListHeaderWithOptions(
44+
TrackListHeader(
5845
title: node.name,
5946
sortOrder: $trackTableSortOrder,
6047
tableRowSize: $trackTableRowSize
@@ -193,7 +180,9 @@ struct FoldersView: View {
193180
}
194181

195182
#Preview {
196-
FoldersView()
183+
@Previewable @State var selectedFolderNode: FolderNode?
184+
185+
FoldersView(selectedFolderNode: $selectedFolderNode)
197186
.environmentObject({
198187
let coordinator = AppCoordinator()
199188
return coordinator.playbackManager

Views/Home/EntityDetailView.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,6 @@ struct EntityDetailView: View {
315315
.padding(.top, 8)
316316
}
317317
.frame(maxWidth: .infinity, maxHeight: .infinity)
318-
.background(Color(NSColor.textBackgroundColor))
319318
}
320319

321320
private var emptyView: some View {
@@ -333,7 +332,6 @@ struct EntityDetailView: View {
333332
}
334333
.frame(maxWidth: .infinity, maxHeight: .infinity)
335334
.padding()
336-
.background(Color(NSColor.textBackgroundColor))
337335
}
338336

339337
// MARK: - Computed Properties

Views/Home/HomeSidebarView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ struct HomeSidebarView: View {
1212
var body: some View {
1313
VStack(spacing: 0) {
1414
// Header
15-
ListHeader {
15+
ListHeader(opaque: true) {
1616
Text("")
1717
.headerTitleStyle()
1818
Spacer()

0 commit comments

Comments
 (0)