You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.7 KiB
82 lines
2.7 KiB
import SwiftUI
|
|
|
|
struct FileListView: View {
|
|
@EnvironmentObject private var coordinator: ConversionCoordinator
|
|
@State private var previewTarget: PreviewTarget?
|
|
|
|
var body: some View {
|
|
List(coordinator.items) { item in
|
|
HStack {
|
|
VStack(alignment: .leading, spacing: 2) {
|
|
Text(item.fileName)
|
|
.lineLimit(1)
|
|
.truncationMode(.middle)
|
|
statusText(for: item.status)
|
|
.font(.caption)
|
|
.foregroundStyle(item.status.needsAttention ? Color.orange : .secondary)
|
|
}
|
|
Spacer()
|
|
Button {
|
|
previewTarget = PreviewTarget(url: item.sourceURL)
|
|
} label: {
|
|
Image(systemName: "eye")
|
|
}
|
|
.buttonStyle(.borderless)
|
|
.help("Vorschau mit 4:5-Rahmen zur Framing-Kontrolle")
|
|
|
|
statusIndicator(for: item.status)
|
|
}
|
|
.padding(.vertical, 2)
|
|
}
|
|
.sheet(item: $previewTarget) { target in
|
|
ReviewSheet(sourceURL: target.url)
|
|
}
|
|
}
|
|
|
|
private struct PreviewTarget: Identifiable {
|
|
let url: URL
|
|
var id: URL { url }
|
|
}
|
|
|
|
@ViewBuilder
|
|
private func statusText(for status: DropItem.Status) -> some View {
|
|
switch status {
|
|
case .waiting:
|
|
Text("Wartet …")
|
|
case .running(let progress):
|
|
Text("\(Int(progress * 100)) %")
|
|
case .skipped(let reason):
|
|
Text(reason.errorDescription ?? "Übersprungen")
|
|
case .rejected(let reason):
|
|
Text(reason.errorDescription ?? "Abgelehnt")
|
|
case .succeeded(let destination):
|
|
Text("Fertig — \(destination.lastPathComponent)")
|
|
case .failed(let message):
|
|
Text(message)
|
|
case .skippedByUser(let reason):
|
|
Text(reason)
|
|
}
|
|
}
|
|
|
|
@ViewBuilder
|
|
private func statusIndicator(for status: DropItem.Status) -> some View {
|
|
switch status {
|
|
case .waiting:
|
|
Image(systemName: "clock")
|
|
.foregroundStyle(.secondary)
|
|
case .running(let progress):
|
|
ProgressView(value: progress)
|
|
.frame(width: 60)
|
|
case .skipped, .skippedByUser:
|
|
Image(systemName: "arrow.uturn.forward.circle")
|
|
.foregroundStyle(.secondary)
|
|
case .rejected, .failed:
|
|
Image(systemName: "exclamationmark.triangle.fill")
|
|
.foregroundStyle(.orange)
|
|
case .succeeded:
|
|
Image(systemName: "checkmark.circle.fill")
|
|
.foregroundStyle(.green)
|
|
}
|
|
}
|
|
}
|