mirror of
https://github.com/yattee/yattee.git
synced 2026-02-19 17:29:45 +00:00
63 lines
1.7 KiB
Swift
63 lines
1.7 KiB
Swift
//
|
|
// DownloadProgressIndicator.swift
|
|
// Yattee
|
|
//
|
|
// Circular progress indicator for downloads.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
/// Circular progress indicator showing download progress.
|
|
struct DownloadProgressIndicator: View {
|
|
let progress: Double
|
|
var size: CGFloat = 28
|
|
/// When true, shows a spinner instead of progress arc (for unknown file sizes)
|
|
var isIndeterminate: Bool = false
|
|
|
|
private var strokeWidth: CGFloat {
|
|
size > 24 ? 2 : 2
|
|
}
|
|
|
|
private var innerSize: CGFloat {
|
|
size * 0.71 // Ratio from original (20/28 ≈ 0.71)
|
|
}
|
|
|
|
var body: some View {
|
|
ZStack {
|
|
Circle()
|
|
.fill(.black.opacity(0.6))
|
|
.frame(width: size, height: size)
|
|
|
|
if isIndeterminate {
|
|
ProgressView()
|
|
.progressViewStyle(.circular)
|
|
.tint(.white)
|
|
.scaleEffect(size / 32)
|
|
} else {
|
|
Circle()
|
|
.stroke(.white.opacity(0.3), lineWidth: strokeWidth)
|
|
.frame(width: innerSize, height: innerSize)
|
|
|
|
Circle()
|
|
.trim(from: 0, to: progress)
|
|
.stroke(.white, style: StrokeStyle(lineWidth: strokeWidth, lineCap: .round))
|
|
.frame(width: innerSize, height: innerSize)
|
|
.rotationEffect(.degrees(-90))
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// MARK: - Preview
|
|
|
|
#Preview {
|
|
HStack(spacing: 20) {
|
|
DownloadProgressIndicator(progress: 0.3, size: 22)
|
|
DownloadProgressIndicator(progress: 0.5, size: 28)
|
|
DownloadProgressIndicator(progress: 0.75, size: 28)
|
|
DownloadProgressIndicator(progress: 0, size: 28, isIndeterminate: true)
|
|
}
|
|
.padding()
|
|
.background(.gray)
|
|
}
|