removed unwanted bar
This commit is contained in:
@@ -476,7 +476,7 @@ struct SongDragReference: Codable, Sendable {
|
||||
func importFiles(_ urls: [URL]) {
|
||||
guard !isImporting,scanningSource == nil,!generatingWaveforms,!movingMedia,!namesBusy else { error = "Wait for the current import, scan or waveform job to finish first.";return }
|
||||
guard !urls.isEmpty else { return }
|
||||
let token = UUID(),database = root.appendingPathComponent("Library.sqlite"),media = managedMediaDirectory
|
||||
let token = UUID(),database = root.appendingPathComponent("Library.sqlite"),media = managedMediaDirectory,cache = root.appendingPathComponent("Waveforms")
|
||||
importToken = token;isImporting = true;importProgress = ImportProgress()
|
||||
importTask = Task.detached(priority:.utility) { [weak self] in
|
||||
let accessed = urls.filter { $0.startAccessingSecurityScopedResource() }
|
||||
@@ -484,7 +484,7 @@ struct SongDragReference: Codable, Sendable {
|
||||
var latest = ImportProgress()
|
||||
do {
|
||||
let database = try Library(url:database)
|
||||
try Importer(media:media).run(urls,library:database,cancelled:{Task.isCancelled},progress:{ update in
|
||||
try Importer(media:media,waveformCache:cache).run(urls,library:database,cancelled:{Task.isCancelled},progress:{ update in
|
||||
latest = update
|
||||
Task { @MainActor [weak self] in
|
||||
guard let self,self.importToken == token else { return };self.importProgress = update
|
||||
@@ -616,6 +616,39 @@ private struct ImportProgressDialog: View {
|
||||
}
|
||||
}
|
||||
}
|
||||
private struct WaveformProgressCard: View {
|
||||
let progress: WaveformJobProgress
|
||||
let running: Bool
|
||||
let cancel: () -> Void
|
||||
let details: () -> Void
|
||||
let dismiss: () -> Void
|
||||
private var fraction: Double { min(1,max(0,Double(progress.processed)/Double(max(1,progress.total)))) }
|
||||
private var colour: Color { progress.cancelled || progress.issues > 0 ? .orange : running ? .cyan : .green }
|
||||
var body: some View {
|
||||
HStack(spacing:16) {
|
||||
ZStack {
|
||||
Circle().stroke(colour.opacity(0.15),lineWidth:5)
|
||||
Circle().trim(from:0,to:fraction).stroke(colour,style:StrokeStyle(lineWidth:5,lineCap:.round)).rotationEffect(.degrees(-90))
|
||||
Text("\(Int(fraction*100))%").font(.system(size:11,weight:.semibold)).monospacedDigit()
|
||||
}.frame(width:46,height:46).accessibilityLabel("Waveform progress").accessibilityValue("\(Int(fraction*100)) percent")
|
||||
VStack(alignment:.leading,spacing:7) {
|
||||
HStack { Text(running ? "Preparing Karaoke Waveforms" : "Waveform Results").font(.callout.weight(.semibold));Spacer();Text("\(progress.processed.formatted()) / \(progress.total.formatted())").font(.caption).monospacedDigit().foregroundStyle(.secondary) }
|
||||
GeometryReader { proxy in
|
||||
ZStack(alignment:.leading) {
|
||||
Capsule().fill(colour.opacity(0.12))
|
||||
Capsule().fill(LinearGradient(colors:[colour.opacity(0.6),colour],startPoint:.leading,endPoint:.trailing)).frame(width:proxy.size.width*fraction)
|
||||
}
|
||||
}.frame(height:7)
|
||||
Text(progress.current).font(.caption).lineLimit(1).foregroundStyle(.secondary)
|
||||
Text("\(progress.generated) generated · \(progress.cached) reused · \(progress.skipped) skipped · \(progress.issues) issues").font(.caption2).foregroundStyle(.secondary)
|
||||
}
|
||||
if running { Button("Cancel",action:cancel).controlSize(.small) }
|
||||
if progress.issues > 0 { Button("Details",action:details).controlSize(.small) }
|
||||
if !running { Button(action:dismiss) { Image(systemName:"xmark") }.buttonStyle(.plain).help("Dismiss waveform results") }
|
||||
}.padding(16).background(colour.opacity(0.05),in:RoundedRectangle(cornerRadius:12))
|
||||
.overlay(RoundedRectangle(cornerRadius:12).strokeBorder(colour.opacity(0.18)))
|
||||
}
|
||||
}
|
||||
struct ImportProgressPanel: View {
|
||||
let progress: ImportProgress
|
||||
let studio: String
|
||||
@@ -864,13 +897,8 @@ struct LibraryView: View {
|
||||
}
|
||||
sourceContent.frame(maxWidth:.infinity,maxHeight:.infinity)
|
||||
if let progress = model.waveformJob {
|
||||
HStack(spacing:10) {
|
||||
Image(systemName:"waveform").foregroundStyle(Color.accentColor)
|
||||
VStack(alignment:.leading,spacing:2) { Text(progress.current).lineLimit(1);Text("\(progress.processed)/\(progress.total) · \(progress.generated) generated · \(progress.cached) reused · \(progress.issues) issues").foregroundStyle(.secondary) }.font(.caption)
|
||||
Spacer();if model.generatingWaveforms { ProgressView(value:Double(progress.processed),total:Double(max(1,progress.total))).frame(width:100);Button("Cancel") { model.cancelWaveformGeneration() }.controlSize(.small) }
|
||||
if progress.issues > 0 { Button("Details") { waveformDetails = true }.controlSize(.small) }
|
||||
if !model.generatingWaveforms { Button { model.dismissWaveformProgress() } label: { Image(systemName:"xmark") }.buttonStyle(.plain).help("Dismiss waveform results") }
|
||||
}.padding(.horizontal,18).padding(.vertical,8)
|
||||
WaveformProgressCard(progress:progress,running:model.generatingWaveforms,cancel:{model.cancelWaveformGeneration()},details:{waveformDetails = true},dismiss:{model.dismissWaveformProgress()})
|
||||
.padding(.horizontal,18).padding(.vertical,10)
|
||||
}
|
||||
Divider()
|
||||
footer.padding(.horizontal,18).padding(.vertical,8)
|
||||
@@ -1442,7 +1470,7 @@ private struct TonightSongDropTarget: ViewModifier {
|
||||
}
|
||||
}
|
||||
/// Drawn with literal colours, so native menu/button tint cannot turn favourite stars white.
|
||||
private struct GoldStar: View {
|
||||
struct GoldStar: View {
|
||||
var filled: Bool
|
||||
var size: CGFloat = 14
|
||||
var body: some View {
|
||||
|
||||
Reference in New Issue
Block a user