Version 1.1 App Store

This commit is contained in:
Scarriffle
2026-05-25 10:21:11 +02:00
parent 7ca511d37f
commit 15d8e71d09
17 changed files with 478 additions and 71 deletions

View File

@@ -62,7 +62,7 @@ struct PlayerBar: View {
}
scrubber
HStack(spacing: 24) {
HStack(spacing: 20) {
Button { app.skip(by: -Double(skipSeconds)) } label: {
Image(systemName: skipBackImage).font(.system(size: 22))
}
@@ -77,6 +77,8 @@ struct PlayerBar: View {
Spacer()
sleepMenu
rateMenu
Button {
@@ -113,6 +115,8 @@ struct PlayerBar: View {
rateMenu
sleepMenu
Spacer(minLength: 0)
statusIndicator
@@ -218,9 +222,73 @@ struct PlayerBar: View {
.font(.caption2.monospacedDigit())
.foregroundStyle(.secondary)
}
if app.player.sleepTimer != .off {
HStack(spacing: 4) {
Image(systemName: "moon.zzz.fill")
.font(.caption2)
Text("\(formatTime(app.player.sleepRemainingSeconds)) · endet \(formatWallTime(sleepEndsAt))")
.font(.caption2.monospacedDigit())
}
.foregroundStyle(.tint)
.frame(maxWidth: .infinity, alignment: .center)
}
}
}
private var sleepMenu: some View {
Menu {
sleepOption(title: "Aus", mode: .off)
Divider()
sleepOption(title: "10 Minuten", mode: .minutes(10))
sleepOption(title: "20 Minuten", mode: .minutes(20))
sleepOption(title: "30 Minuten", mode: .minutes(30))
sleepOption(title: "1 Stunde", mode: .minutes(60))
sleepOption(title: endOfPlaybackLabel, mode: .endOfBook)
} label: {
Image(systemName: app.player.sleepTimer == .off ? "moon.zzz" : "moon.zzz.fill")
#if os(iOS)
.font(.system(size: 22))
#else
.font(.system(size: 16))
#endif
.foregroundStyle(app.player.sleepTimer == .off ? Color.secondary : Color.accentColor)
}
#if os(macOS)
.menuStyle(.borderlessButton)
.fixedSize()
#endif
.menuIndicator(.hidden)
.help("Sleep-Timer")
.disabled(!app.player.isReady)
}
@ViewBuilder
private func sleepOption(title: String, mode: SleepTimerMode) -> some View {
Button {
app.player.setSleepTimer(mode)
} label: {
if app.player.sleepTimer == mode {
Label(title, systemImage: "checkmark")
} else {
Text(title)
}
}
}
private var sleepEndsAt: Date {
Date().addingTimeInterval(app.player.sleepRemainingSeconds)
}
private var endOfPlaybackLabel: String {
app.currentItem?.isPodcast == true
? "Bis Ende der Folge"
: "Bis Ende des Hörbuchs"
}
private func formatWallTime(_ date: Date) -> String {
date.formatted(.dateTime.hour().minute())
}
private var rateMenu: some View {
Menu {
ForEach([0.75, 1.0, 1.25, 1.5, 1.75, 2.0], id: \.self) { r in