Working but small

This commit is contained in:
Hariharan Mudaliar 2025-09-10 20:33:09 +05:30
commit 9bed85bdf0
7 changed files with 241 additions and 8 deletions

View file

@ -378,6 +378,9 @@ class AppDelegate: NSObject, NSApplicationDelegate {
coordinator.setupWorkersNotificationObservers()
// Migrate legacy progress bar settings
Defaults.Keys.migrateProgressBarStyle()
// Setup SystemHUD Manager
SystemHUDManager.shared.setup(coordinator: coordinator)

View file

@ -1086,6 +1086,9 @@
},
"Seconds" : {
},
"Segmented" : {
},
"Select a color to view details" : {

View file

@ -102,16 +102,19 @@ struct DraggableProgressBar: View {
Capsule()
.fill(.tertiary)
Group {
if Defaults[.enableGradient] {
switch Defaults[.progressBarStyle] {
case .gradient:
Capsule()
.fill(LinearGradient(colors: Defaults[.systemEventIndicatorUseAccent] ? [Defaults[.accentColor], Defaults[.accentColor].ensureMinimumBrightness(factor: 0.2)] : [.white, .white.opacity(0.2)], startPoint: .trailing, endPoint: .leading))
.frame(width: max(0, min(geo.size.width * value, geo.size.width)))
.shadow(color: Defaults[.systemEventIndicatorShadow] ? Defaults[.systemEventIndicatorUseAccent] ? Defaults[.accentColor].ensureMinimumBrightness(factor: 0.7) : .white : .clear, radius: 8, x: 3)
} else {
case .hierarchical:
Capsule()
.fill(Defaults[.systemEventIndicatorUseAccent] ? Defaults[.accentColor] : .white)
.frame(width: max(0, min(geo.size.width * value, geo.size.width)))
.shadow(color: Defaults[.systemEventIndicatorShadow] ? Defaults[.systemEventIndicatorUseAccent] ? Defaults[.accentColor].ensureMinimumBrightness(factor: 0.7) : .white : .clear, radius: 8, x: 3)
case .segmented:
SegmentedProgressContent(value: value, geometry: geo)
}
}
.opacity(value.isZero ? 0 : 1)
@ -142,3 +145,30 @@ struct DraggableProgressBar: View {
value = max(0, min(newValue, 1))
}
}
struct SegmentedProgressContent: View {
let value: CGFloat
let geometry: GeometryProxy
private let segmentCount = 20
var body: some View {
HStack(spacing: 1) {
ForEach(0..<segmentCount, id: \.self) { index in
let segmentValue = CGFloat(index + 1) / CGFloat(segmentCount)
let isActive = value >= segmentValue
RoundedRectangle(cornerRadius: 1)
.fill(isActive ?
(Defaults[.systemEventIndicatorUseAccent] ? Defaults[.accentColor] : .white) :
.clear)
.frame(width: max(1, (geometry.size.width - CGFloat(segmentCount - 1) * 1) / CGFloat(segmentCount)))
.shadow(color: isActive && Defaults[.systemEventIndicatorShadow] ?
(Defaults[.systemEventIndicatorUseAccent] ? Defaults[.accentColor].ensureMinimumBrightness(factor: 0.7) : .white) :
.clear, radius: 4, x: 1)
.opacity(value.isZero ? 0 : (isActive ? 1 : 0.3))
}
}
.frame(width: geometry.size.width)
}
}

View file

@ -419,7 +419,7 @@ struct Downloads: View {
struct HUD: View {
@EnvironmentObject var vm: DynamicIslandViewModel
@Default(.inlineHUD) var inlineHUD
@Default(.enableGradient) var enableGradient
@Default(.progressBarStyle) var progressBarStyle
@Default(.enableSystemHUD) var enableSystemHUD
@Default(.enableVolumeHUD) var enableVolumeHUD
@Default(.enableBrightnessHUD) var enableBrightnessHUD
@ -491,15 +491,17 @@ struct HUD: View {
if Defaults[.inlineHUD] {
withAnimation {
Defaults[.systemEventIndicatorShadow] = false
Defaults[.enableGradient] = false
Defaults[.progressBarStyle] = .hierarchical
}
}
}
Picker("Progressbar style", selection: $enableGradient) {
Picker("Progressbar style", selection: $progressBarStyle) {
Text("Hierarchical")
.tag(false)
.tag(ProgressBarStyle.hierarchical)
Text("Gradient")
.tag(true)
.tag(ProgressBarStyle.gradient)
Text("Segmented")
.tag(ProgressBarStyle.segmented)
}
Defaults.Toggle("Enable glowing effect", key: .systemEventIndicatorShadow)
Defaults.Toggle("Use accent color", key: .systemEventIndicatorUseAccent)

View file

@ -97,6 +97,14 @@ enum SneakPeekStyle: String, CaseIterable, Identifiable, Defaults.Serializable {
var id: String { self.rawValue }
}
enum ProgressBarStyle: String, CaseIterable, Identifiable, Defaults.Serializable {
case hierarchical = "Hierarchical"
case gradient = "Gradient"
case segmented = "Segmented"
var id: String { self.rawValue }
}
extension Defaults.Keys {
// MARK: General
static let menubarIcon = Key<Bool>("menubarIcon", default: true)
@ -171,6 +179,8 @@ extension Defaults.Keys {
// MARK: HUD
static let inlineHUD = Key<Bool>("inlineHUD", default: false)
static let progressBarStyle = Key<ProgressBarStyle>("progressBarStyle", default: .hierarchical)
// Legacy support - keeping for backward compatibility
static let enableGradient = Key<Bool>("enableGradient", default: false)
static let systemEventIndicatorShadow = Key<Bool>("systemEventIndicatorShadow", default: false)
static let systemEventIndicatorUseAccent = Key<Bool>("systemEventIndicatorUseAccent", default: false)
@ -236,4 +246,15 @@ extension Defaults.Keys {
return .nowPlaying
}
}
// Migration helper to convert from legacy enableGradient Boolean to new ProgressBarStyle enum
static func migrateProgressBarStyle() {
// Check if migration is needed by seeing if the old Boolean was set to gradient
let wasGradientEnabled = Defaults[.enableGradient]
// Only migrate if we're still using the default hierarchical value but gradient was enabled
if wasGradientEnabled && Defaults[.progressBarStyle] == .hierarchical {
Defaults[.progressBarStyle] = .gradient
}
}
}