TrackRow.swift 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import SwiftUI
  2. /// Compact track row for track lists.
  3. struct TrackRow: View {
  4. let track: Track
  5. var uploadingFileName: String? = nil
  6. var body: some View {
  7. HStack(spacing: 8) {
  8. // Album art placeholder / format badge
  9. ZStack {
  10. RoundedRectangle(cornerRadius: 4)
  11. .fill(trackColor.opacity(0.15))
  12. .frame(width: 32, height: 32)
  13. Image(systemName: "music.note")
  14. .font(.caption)
  15. .foregroundStyle(trackColor)
  16. }
  17. VStack(alignment: .leading, spacing: 1) {
  18. HStack(spacing: 4) {
  19. Text(track.title)
  20. .lineLimit(1)
  21. .font(.body)
  22. if let uploadingFileName, track.fileURL.lastPathComponent == uploadingFileName {
  23. Image(systemName: "arrow.up.circle.fill")
  24. .font(.system(size: 11))
  25. .foregroundStyle(.orange)
  26. } else if track.isCloud {
  27. if track.downloadState == .downloaded || track.localCachePath != nil {
  28. Image(systemName: "arrow.down.circle.fill")
  29. .font(.system(size: 11))
  30. .foregroundStyle(.green)
  31. } else {
  32. Image(systemName: "cloud.fill")
  33. .font(.system(size: 11))
  34. .foregroundStyle(Color.accentColor.opacity(0.85))
  35. }
  36. }
  37. }
  38. if !track.artist.isEmpty {
  39. Text(track.artist)
  40. .lineLimit(1)
  41. .font(.caption)
  42. .foregroundStyle(.secondary)
  43. }
  44. }
  45. }
  46. }
  47. private var trackColor: Color {
  48. if let hex = track.color {
  49. return Color(hex: hex) ?? .accentColor
  50. }
  51. return .accentColor
  52. }
  53. }