removed unwanted bar now with waveforms, major updates
This commit is contained in:
@@ -616,6 +616,26 @@ private struct ImportProgressDialog: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
struct LibraryActionButtonStyle: ButtonStyle {
|
||||
let tint: Color
|
||||
var prominent = false
|
||||
@Environment(\.isEnabled) private var enabled
|
||||
func makeBody(configuration: Configuration) -> some View {
|
||||
configuration.label.font(.system(size:12,weight:.semibold)).fixedSize()
|
||||
.padding(.horizontal,12).padding(.vertical,8)
|
||||
.foregroundStyle(prominent && enabled ? Color.black : enabled ? tint : Color.secondary)
|
||||
.background(RoundedRectangle(cornerRadius:8).fill(tint.opacity(enabled ? (prominent ? (configuration.isPressed ? 0.65 : 0.95) : configuration.isPressed ? 0.25 : 0.12) : 0.04)))
|
||||
.overlay(RoundedRectangle(cornerRadius:8).strokeBorder(tint.opacity(enabled ? 0.28 : 0.08)))
|
||||
}
|
||||
}
|
||||
struct LibrarySelectionBadge: View {
|
||||
let count: Int
|
||||
var body: some View {
|
||||
Text(count == 0 ? "No selection" : "\(count.formatted()) selected").font(.system(size:11,weight:.medium)).monospacedDigit()
|
||||
.foregroundStyle(count > 0 ? Color.cyan : Color.secondary).padding(.horizontal,10).padding(.vertical,6)
|
||||
.background((count > 0 ? Color.cyan : Color.primary).opacity(0.08),in:Capsule())
|
||||
}
|
||||
}
|
||||
struct StudioSearchField: View {
|
||||
let placeholder: String
|
||||
@Binding var text: String
|
||||
@@ -673,9 +693,10 @@ struct ImportProgressPanel: View {
|
||||
let close: () -> Void
|
||||
var background: (() -> Void)? = nil
|
||||
var isMove = false
|
||||
var activity: String? = nil
|
||||
private var fraction: Double { progress.total > 0 ? min(1,max(0,Double(progress.completed)/Double(progress.total))) : 0 }
|
||||
private var accent: Color { progress.failure != nil || progress.cancelled ? .orange : progress.finished ? .green : .cyan }
|
||||
private var title: String { if isMove { return progress.finished ? (progress.cancelled ? "Move Cancelled" : progress.failure == nil ? "Move Complete" : "Move Needs Attention") : "Moving Media and Waveforms" };return progress.finished ? (progress.cancelled ? "Import Cancelled" : progress.failure == nil ? "Import Complete" : "Import Needs Attention") : "Importing Music" }
|
||||
private var title: String { if let activity { return progress.finished ? (progress.cancelled ? "Cancelled" : progress.failure == nil ? "Library Updated" : "Library Needs Attention") : activity };if isMove { return progress.finished ? (progress.cancelled ? "Move Cancelled" : progress.failure == nil ? "Move Complete" : "Move Needs Attention") : "Moving Media and Waveforms" };return progress.finished ? (progress.cancelled ? "Import Cancelled" : progress.failure == nil ? "Import Complete" : "Import Needs Attention") : "Importing Music" }
|
||||
var body: some View {
|
||||
VStack(alignment:.leading,spacing:20) {
|
||||
HStack(spacing:14) {
|
||||
@@ -705,11 +726,11 @@ struct ImportProgressPanel: View {
|
||||
Text(progress.failure ?? progress.current).font(.system(size:11)).foregroundStyle(.secondary).lineLimit(2).frame(height:30,alignment:.topLeading).frame(maxWidth:.infinity,alignment:.leading)
|
||||
}
|
||||
HStack(spacing:12) {
|
||||
count(isMove ? "Copied" : "Imported",value:max(0,progress.completed-progress.skipped),color:.green)
|
||||
count(activity != nil ? "Processed" : isMove ? "Copied" : "Imported",value:max(0,progress.completed-progress.skipped),color:.green)
|
||||
count("Skipped",value:progress.skipped,color:.orange)
|
||||
count("Remaining",value:progress.total > 0 ? max(0,progress.total-progress.completed) : -1,color:.cyan)
|
||||
}
|
||||
ImportLogView(progress:progress,title:isMove ? "Transfer Log" : "Import Log").frame(height:260)
|
||||
ImportLogView(progress:progress,title:activity != nil ? "Library Log" : isMove ? "Transfer Log" : "Import Log").frame(height:260)
|
||||
Divider()
|
||||
HStack {
|
||||
Text(progress.finished ? "Review the log or copy it before closing." : isMove ? "Copies are verified before originals are removed." : "You can cancel safely; completed tracks stay in your library.").font(.caption).foregroundStyle(.secondary)
|
||||
@@ -718,7 +739,7 @@ struct ImportProgressPanel: View {
|
||||
Button("Done",action:close).buttonStyle(.borderedProminent).tint(accent).keyboardShortcut(.defaultAction)
|
||||
} else {
|
||||
if let background { Button("Run in Background",action:background) }
|
||||
Button(progress.current.hasPrefix("Cancelling") ? "Cancelling…" : isMove ? "Cancel Move" : "Cancel Import",action:cancel).keyboardShortcut(.cancelAction).disabled(progress.current.hasPrefix("Cancelling"))
|
||||
Button(progress.current.hasPrefix("Cancelling") ? "Cancelling…" : activity != nil ? "Cancel" : isMove ? "Cancel Move" : "Cancel Import",action:cancel).keyboardShortcut(.cancelAction).disabled(progress.current.hasPrefix("Cancelling"))
|
||||
}
|
||||
}
|
||||
}.padding(26).frame(width:660)
|
||||
@@ -921,14 +942,15 @@ struct LibraryView: View {
|
||||
HStack {
|
||||
VStack(alignment:.leading,spacing:4) {
|
||||
Text(source == "Singer Songs" ? (model.singers.first { $0.id == model.selectedSinger }?.name ?? "Singer")+" · "+singerSection : source).font(.title2.weight(.semibold))
|
||||
Text(source == "Library" ? "\(model.songs.count) songs in your collection" : model.currentVenueName).font(.callout).foregroundStyle(.secondary)
|
||||
Text(source == "Library" ? "\(model.songs.count.formatted()) tracks in your collection" : model.currentVenueName).font(.callout).foregroundStyle(.secondary)
|
||||
}
|
||||
Spacer()
|
||||
StudioSearchField(placeholder:"Search music",text:$search).frame(maxWidth:260)
|
||||
Spacer(minLength:20)
|
||||
LibrarySelectionBadge(count:tableSelection.count)
|
||||
StudioSearchField(placeholder:"Search music",text:$search).frame(minWidth:180,idealWidth:280,maxWidth:320)
|
||||
if source == "Library" {
|
||||
Button { importing = true } label: { Label("Import Music",systemImage:"plus") }.buttonStyle(.bordered)
|
||||
Button { importing = true } label: { Label("Import Music",systemImage:"square.and.arrow.down") }.buttonStyle(LibraryActionButtonStyle(tint:.cyan,prominent:true))
|
||||
}
|
||||
}.padding(.horizontal,22).padding(.vertical,18)
|
||||
}.padding(.horizontal,20).padding(.vertical,14).background(Color.primary.opacity(0.025))
|
||||
.sheet(isPresented:$djSongSettings) {
|
||||
VStack(spacing:0) {
|
||||
HStack { VStack(alignment:.leading,spacing:4) { Text("Song Settings").font(.title2.bold());Text(selectedSong?.title ?? "Select a karaoke track to adjust its settings").font(.callout).foregroundStyle(.secondary) };Spacer() }.padding(24)
|
||||
@@ -1191,7 +1213,7 @@ struct LibraryView: View {
|
||||
Text("Page \(pagination.number+1) of \(pagination.count)").monospacedDigit().frame(minWidth:95)
|
||||
Button { changePage(pagination.number+1) } label: { Image(systemName:"chevron.right") }.disabled(pagination.number+1 >= pagination.count).help("Next page").accessibilityLabel("Next library page").accessibilityIdentifier("library.page.next")
|
||||
Button { changePage(pagination.count-1) } label: { Image(systemName:"forward.end") }.disabled(pagination.number+1 >= pagination.count).help("Last page").accessibilityLabel("Last library page")
|
||||
}.font(.caption).controlSize(.small).buttonStyle(.borderless).padding(.horizontal,16).padding(.vertical,8)
|
||||
}.font(.caption).buttonStyle(LibraryActionButtonStyle(tint:.cyan)).padding(.horizontal,16).padding(.vertical,10)
|
||||
}
|
||||
private func changePage(_ requested:Int) { page = LibraryPage(total:libraryRows.count,requested:requested).number;tableSelection = [];selected = nil }
|
||||
private var songTable: some View {
|
||||
|
||||
Reference in New Issue
Block a user