BrowsePanel.swift 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import SwiftUI
  2. struct BrowsePanel: View {
  3. @Binding var browsePanelTab: BrowsePanelTab
  4. @Binding var isBrowsePanelOpen: Bool
  5. @AppStorage("playbackMode") private var playbackMode: String = "queue"
  6. @EnvironmentObject private var theme: AppTheme
  7. private var showQueueTab: Bool {
  8. playbackMode == "queue"
  9. }
  10. var body: some View {
  11. VStack(spacing: 0) {
  12. // Panel header
  13. HStack {
  14. if showQueueTab {
  15. Picker("", selection: $browsePanelTab) {
  16. ForEach(BrowsePanelTab.allCases, id: \.self) { tab in
  17. Text(tab.rawValue).tag(tab)
  18. }
  19. }
  20. .pickerStyle(.segmented)
  21. .frame(maxWidth: 200)
  22. } else {
  23. Text("Cloud")
  24. .font(.system(size: 13, weight: .semibold))
  25. .foregroundStyle(theme.primaryText)
  26. }
  27. Spacer()
  28. Button {
  29. isBrowsePanelOpen = false
  30. } label: {
  31. Image(systemName: "xmark")
  32. .font(.system(size: 11, weight: .semibold))
  33. .foregroundStyle(theme.secondaryText)
  34. .frame(width: 24, height: 24)
  35. .contentShape(Rectangle())
  36. }
  37. .buttonStyle(.plain)
  38. .help("Close Panel (⌘B)")
  39. }
  40. .padding(.horizontal, 12)
  41. .padding(.vertical, 8)
  42. .background(theme.toolbarBackground.opacity(0.5))
  43. Divider()
  44. ZStack {
  45. CloudBrowserView()
  46. .onChange(of: playbackMode) { _, newMode in
  47. if newMode != "queue" && browsePanelTab == .queue {
  48. browsePanelTab = .cloud
  49. }
  50. }
  51. .opacity(browsePanelTab == .cloud ? 1 : 0)
  52. .allowsHitTesting(browsePanelTab == .cloud)
  53. if showQueueTab {
  54. QueueView()
  55. .opacity(browsePanelTab == .queue ? 1 : 0)
  56. .allowsHitTesting(browsePanelTab == .queue)
  57. }
  58. }
  59. }
  60. }
  61. }