@@ -30,6 +30,46 @@ struct TrackView: View {
3030 }
3131}
3232
33+ // MARK: - Track Context Menu
34+ struct TrackContextMenuContent : View {
35+ let items : [ ContextMenuItem ]
36+
37+ var body : some View {
38+ ForEach ( items, id: \. id) { item in
39+ contextMenuItem ( item)
40+ }
41+ }
42+
43+ @ViewBuilder
44+ private func contextMenuItem( _ item: ContextMenuItem ) -> some View {
45+ switch item {
46+ case . button( let title, let role, let action) :
47+ Button ( title, role: role, action: action)
48+ case . menu( let title, let items) :
49+ Menu ( title) {
50+ ForEach ( items, id: \. id) { subItem in
51+ switch subItem {
52+ case . button( let subTitle, let subRole, let subAction) :
53+ Button ( subTitle, role: subRole, action: subAction)
54+ case . menu( let subMenuTitle, let subMenuItems) :
55+ Menu ( subMenuTitle) {
56+ ForEach ( subMenuItems, id: \. id) { nestedItem in
57+ if case . button( let nestedTitle, let nestedRole, let nestedAction) = nestedItem {
58+ Button ( nestedTitle, role: nestedRole, action: nestedAction)
59+ }
60+ }
61+ }
62+ case . divider:
63+ Divider ( )
64+ }
65+ }
66+ }
67+ case . divider:
68+ Divider ( )
69+ }
70+ }
71+ }
72+
3373// MARK: - List View Implementation
3474private struct TrackListView : View {
3575 let tracks : [ Track ]
@@ -66,45 +106,14 @@ private struct TrackListView: View {
66106 }
67107 )
68108 . contextMenu {
69- ForEach ( contextMenuItems ( track) , id: \. id) { item in
70- contextMenuItem ( item)
71- }
109+ TrackContextMenuContent ( items: contextMenuItems ( track) )
72110 }
73111 . id ( track. id)
74112 }
75113 }
76114 . padding ( 5 ) // Small padding to prevent edge clipping
77115 }
78116 }
79-
80- @ViewBuilder
81- private func contextMenuItem( _ item: ContextMenuItem ) -> some View {
82- switch item {
83- case . button( let title, let role, let action) :
84- Button ( title, role: role, action: action)
85- case . menu( let title, let items) :
86- Menu ( title) {
87- ForEach ( items, id: \. id) { subItem in
88- switch subItem {
89- case . button( let subTitle, let subRole, let subAction) :
90- Button ( subTitle, role: subRole, action: subAction)
91- case . menu( let subMenuTitle, let subMenuItems) :
92- Menu ( subMenuTitle) {
93- ForEach ( subMenuItems, id: \. id) { nestedItem in
94- if case . button( let nestedTitle, let nestedRole, let nestedAction) = nestedItem {
95- Button ( nestedTitle, role: nestedRole, action: nestedAction)
96- }
97- }
98- }
99- case . divider:
100- Divider ( )
101- }
102- }
103- }
104- case . divider:
105- Divider ( )
106- }
107- }
108117}
109118
110119// MARK: - Track List Row
@@ -334,9 +343,7 @@ private struct TrackGridView: View {
334343 )
335344 . frame ( width: itemWidth, height: itemHeight)
336345 . contextMenu {
337- ForEach ( contextMenuItems ( track) , id: \. id) { item in
338- contextMenuItem ( item)
339- }
346+ TrackContextMenuContent ( items: contextMenuItems ( track) )
340347 }
341348 }
342349 }
@@ -351,24 +358,6 @@ private struct TrackGridView: View {
351358 }
352359 }
353360 }
354-
355- @ViewBuilder
356- private func contextMenuItem( _ item: ContextMenuItem ) -> some View {
357- switch item {
358- case . button( let title, let role, let action) :
359- Button ( title, role: role, action: action)
360- case . menu( let title, let items) :
361- Menu ( title) {
362- ForEach ( items, id: \. id) { subItem in
363- if case . button( let subTitle, let subRole, let subAction) = subItem {
364- Button ( subTitle, role: subRole, action: subAction)
365- }
366- }
367- }
368- case . divider:
369- Divider ( )
370- }
371- }
372361}
373362
374363// MARK: - Track Grid Item
0 commit comments