mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-28 23:54:32 +00:00
Fix: Timeline Reset
This commit is contained in:
parent
8f770d08f7
commit
27bb043ef6
1 changed files with 45 additions and 7 deletions
|
|
@ -97,6 +97,7 @@ struct AlbumArtView: View {
|
||||||
|
|
||||||
struct MusicControlsView: View {
|
struct MusicControlsView: View {
|
||||||
@ObservedObject var musicManager = MusicManager.shared
|
@ObservedObject var musicManager = MusicManager.shared
|
||||||
|
@EnvironmentObject var vm: DynamicIslandViewModel
|
||||||
@State private var sliderValue: Double = 0
|
@State private var sliderValue: Double = 0
|
||||||
@State private var dragging: Bool = false
|
@State private var dragging: Bool = false
|
||||||
@State private var lastDragged: Date = .distantPast
|
@State private var lastDragged: Date = .distantPast
|
||||||
|
|
@ -108,6 +109,16 @@ struct MusicControlsView: View {
|
||||||
}
|
}
|
||||||
.buttonStyle(PlainButtonStyle())
|
.buttonStyle(PlainButtonStyle())
|
||||||
.frame(minWidth: Defaults[.showMirror] && Defaults[.showCalendar] ? 140 : 180)
|
.frame(minWidth: Defaults[.showMirror] && Defaults[.showCalendar] ? 140 : 180)
|
||||||
|
.onAppear {
|
||||||
|
// Initialize slider value when view appears
|
||||||
|
sliderValue = musicManager.elapsedTime
|
||||||
|
}
|
||||||
|
.onChange(of: vm.notchState) { _, newState in
|
||||||
|
// Reset slider value when notch opens to prevent stuck state
|
||||||
|
if newState == .open && !dragging {
|
||||||
|
sliderValue = musicManager.elapsedTime
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private var songInfoAndSlider: some View {
|
private var songInfoAndSlider: some View {
|
||||||
|
|
@ -284,17 +295,31 @@ struct MusicSliderView: View {
|
||||||
guard isPlaying else { return elapsedTime }
|
guard isPlaying else { return elapsedTime }
|
||||||
|
|
||||||
// For playing media, calculate real-time progress
|
// For playing media, calculate real-time progress
|
||||||
// Use a more permissive approach for web players
|
|
||||||
let timeDiff = currentDate.timeIntervalSince(timestampDate)
|
let timeDiff = currentDate.timeIntervalSince(timestampDate)
|
||||||
|
|
||||||
// Only use timestamp calculation if we have recent data (within 5 seconds)
|
// Use real-time calculation for positive time differences with reasonable bounds
|
||||||
// This helps with web players that don't update timestamps frequently
|
// This provides smooth progression for all media sources
|
||||||
if timeDiff >= 0 && timeDiff < 5.0 && playbackRate > 0 {
|
if timeDiff >= 0 && timeDiff < 30.0 && playbackRate > 0 {
|
||||||
let projectedTime = elapsedTime + (timeDiff * playbackRate)
|
let projectedTime = elapsedTime + (timeDiff * playbackRate)
|
||||||
return min(projectedTime, duration)
|
let clampedTime = min(projectedTime, duration)
|
||||||
|
|
||||||
|
// Ensure we don't go backwards unless there's a significant jump
|
||||||
|
if clampedTime >= sliderValue || abs(clampedTime - sliderValue) > 2.0 {
|
||||||
|
return clampedTime
|
||||||
|
} else {
|
||||||
|
return sliderValue
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// Fallback to controller-provided elapsed time for stale or invalid timestamps
|
// For very stale timestamps or negative differences, use controller time
|
||||||
return min(elapsedTime, duration)
|
// but only if it makes sense relative to current slider position
|
||||||
|
let controllerTime = min(elapsedTime, duration)
|
||||||
|
|
||||||
|
// Prevent backwards jumps unless there's a significant change (track change, seek)
|
||||||
|
if controllerTime >= sliderValue || abs(controllerTime - sliderValue) > 5.0 {
|
||||||
|
return controllerTime
|
||||||
|
} else {
|
||||||
|
return sliderValue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -324,6 +349,19 @@ struct MusicSliderView: View {
|
||||||
.onChange(of: currentDate) {
|
.onChange(of: currentDate) {
|
||||||
sliderValue = currentElapsedTime
|
sliderValue = currentElapsedTime
|
||||||
}
|
}
|
||||||
|
.onChange(of: elapsedTime) {
|
||||||
|
// Update slider when media changes (e.g., track changes, seeking)
|
||||||
|
// But only if we're not dragging and the difference is significant
|
||||||
|
if !dragging && abs(elapsedTime - sliderValue) > 1.0 {
|
||||||
|
sliderValue = elapsedTime
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onChange(of: duration) {
|
||||||
|
// Handle track changes - reset slider if duration changes significantly
|
||||||
|
if !dragging && sliderValue > duration {
|
||||||
|
sliderValue = min(elapsedTime, duration)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func timeString(from seconds: Double) -> String {
|
func timeString(from seconds: Double) -> String {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue