Version 1.1 App Store
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user