import MusicAssistantCore import SwiftUI struct InstrumentBrowserView: View { @Binding private var project: SongProject private let catalog: LocalInstrumentCatalog @State private var searchText = "" @State private var selectedFamilyCategory: String? @State private var selectedRegionOrigin: String? @Environment(\.dismiss) private var dismiss init( project: Binding, catalog: LocalInstrumentCatalog = LocalInstrumentCatalog() ) { _project = project self.catalog = catalog } var body: some View { NavigationStack { VStack(spacing: 0) { HStack { Picker("Family", selection: $selectedFamilyCategory) { Text("All families").tag(String?.none) ForEach(catalog.familyCategories, id: \.self) { familyCategory in Text(familyCategory).tag(Optional(familyCategory)) } } .pickerStyle(.menu) Spacer() Picker("Region", selection: $selectedRegionOrigin) { Text("All regions").tag(String?.none) ForEach(catalog.regionsOfOrigin, id: \.self) { regionOrigin in Text(regionOrigin).tag(Optional(regionOrigin)) } } .pickerStyle(.menu) } .padding(.horizontal) .padding(.vertical, 8) Divider() List( catalog.instruments( matching: searchText, familyCategory: selectedFamilyCategory, regionOrigin: selectedRegionOrigin ), id: \.id ) { instrument in Toggle(isOn: selectionBinding(for: instrument)) { VStack(alignment: .leading, spacing: 4) { Text(instrument.name) .font(.body.weight(.medium)) HStack(spacing: 6) { Text(instrument.familyCategory) if let regionOrigin = instrument.regionOrigin { Text(regionOrigin) } } .font(.caption) .foregroundStyle(.secondary) .lineLimit(1) } } .toggleStyle(.checkbox) .padding(.vertical, 2) } } .navigationTitle("Instrument Catalog") .searchable(text: $searchText, prompt: "Search instruments") .toolbar { ToolbarItem(placement: .cancellationAction) { Button("Done") { dismiss() } } } } .frame(minWidth: 460, minHeight: 520) } private func selectionBinding(for instrument: InstrumentCatalogItem) -> Binding { Binding { project.isInstrumentSelected(id: instrument.id) } set: { isSelected in project.setInstrumentSelected( id: instrument.id, isSelected: isSelected, variant: instrument.name ) } } } #Preview { InstrumentBrowserPreview() } private struct InstrumentBrowserPreview: View { @State private var project = SongProject( title: "Instrument Browser Preview", idea: "Browse the instrument catalog." ) var body: some View { InstrumentBrowserView(project: $project) } }