refactor playercontrols and make curTime label update while seeking

This commit is contained in:
Drew Weymouth
2022-12-18 10:51:09 -08:00
parent 378eb8868a
commit 8762fed9b3
+62 -28
View File
@@ -55,68 +55,102 @@ func (t *TrackPosSlider) IsDragging() bool {
return t.isDragging return t.isDragging
} }
// NewPlayerControls sets up the seek bar, and transport buttons, and returns the encompassing Container. type PlayerControls struct {
func NewPlayerControls(p *player.Player, pm *backend.PlaybackManager) *fyne.Container { widget.BaseWidget
slider := NewTrackPosSlider()
curTimeLabel := widget.NewLabel("0:00")
totalTimeLabel := widget.NewLabel("0:00")
c := container.NewBorder(nil, nil, curTimeLabel, totalTimeLabel, slider) slider *TrackPosSlider
curTimeLabel *widget.Label
totalTimeLabel *widget.Label
prev *widget.Button
playpause *widget.Button
next *widget.Button
container *fyne.Container
slider.OnDragEnd = func(f float64) { totalTime float64
p.Seek(fmt.Sprintf("%d", int(f*100)), player.SeekAbsolutePercent) playbackManager *backend.PlaybackManager
} }
prev := widget.NewButtonWithIcon("", theme.MediaSkipPreviousIcon(), func() { var _ fyne.Widget = (*PlayerControls)(nil)
// NewPlayerControls sets up the seek bar, and transport buttons, and returns the encompassing Container.
func NewPlayerControls(p *player.Player, pm *backend.PlaybackManager) *PlayerControls {
pc := &PlayerControls{playbackManager: pm}
pc.ExtendBaseWidget(pc)
pc.slider = NewTrackPosSlider()
pc.curTimeLabel = widget.NewLabel("0:00")
pc.totalTimeLabel = widget.NewLabel("0:00")
pc.slider.OnDragEnd = func(f float64) {
p.Seek(fmt.Sprintf("%d", int(f*100)), player.SeekAbsolutePercent)
}
pc.slider.OnChanged = func(f float64) {
time := f * pc.totalTime
pc.curTimeLabel.SetText(SecondsToTimeString(time))
}
pc.prev = widget.NewButtonWithIcon("", theme.MediaSkipPreviousIcon(), func() {
p.SeekBackOrPrevious() p.SeekBackOrPrevious()
}) })
next := widget.NewButtonWithIcon("", theme.MediaSkipNextIcon(), func() { pc.next = widget.NewButtonWithIcon("", theme.MediaSkipNextIcon(), func() {
p.SeekNext() p.SeekNext()
}) })
playpause := widget.NewButtonWithIcon("", theme.MediaPlayIcon(), func() { pc.playpause = widget.NewButtonWithIcon("", theme.MediaPlayIcon(), func() {
p.PlayPause() p.PlayPause()
}) })
p.OnPaused(func() { p.OnPaused(func() {
playpause.SetIcon(theme.MediaPlayIcon()) pc.playpause.SetIcon(theme.MediaPlayIcon())
}) })
p.OnPlaying(func() { p.OnPlaying(func() {
playpause.SetIcon(theme.MediaPauseIcon()) pc.playpause.SetIcon(theme.MediaPauseIcon())
}) })
p.OnStopped(func() { p.OnStopped(func() {
playpause.SetIcon(theme.MediaPlayIcon()) pc.playpause.SetIcon(theme.MediaPlayIcon())
}) })
buttons := container.NewHBox(prev, playpause, next) buttons := container.NewHBox(pc.prev, pc.playpause, pc.next)
b := container.New(layout.NewCenterLayout(), buttons) b := container.New(layout.NewCenterLayout(), buttons)
content := container.NewVBox(c, b)
c := container.NewBorder(nil, nil, pc.curTimeLabel, pc.totalTimeLabel, pc.slider)
pc.container = container.NewVBox(c, b)
pm.OnPlayTimeUpdate(func(curTime float64, totalTime float64) { pm.OnPlayTimeUpdate(func(curTime float64, totalTime float64) {
if !pm.IsSeeking() { pc.doPlayTimeUpdate(curTime, totalTime)
})
return pc
}
func (pc *PlayerControls) doPlayTimeUpdate(curTime, totalTime float64) {
pc.totalTime = totalTime
if !pc.playbackManager.IsSeeking() {
v := 0.0 v := 0.0
if totalTime > 0 { if totalTime > 0 {
v = curTime / totalTime v = curTime / totalTime
} }
ct := SecondsToTimeString(curTime)
updated := false updated := false
if ct != curTimeLabel.Text {
curTimeLabel.SetText(ct)
updated = true
}
tt := SecondsToTimeString(totalTime) tt := SecondsToTimeString(totalTime)
if tt != totalTimeLabel.Text { if tt != pc.totalTimeLabel.Text {
totalTimeLabel.SetText(tt) pc.totalTimeLabel.SetText(tt)
updated = true
}
if !pc.slider.IsDragging() {
ct := SecondsToTimeString(curTime)
if ct != pc.curTimeLabel.Text {
pc.curTimeLabel.SetText(ct)
updated = true updated = true
} }
if !slider.IsDragging() {
if totalTime < 210 || updated { if totalTime < 210 || updated {
// if current track is long, we only need to redraw the slider // if current track is long, we only need to redraw the slider
// when the time label updates, to reduce screen redraws. // when the time label updates, to reduce screen redraws.
slider.SetValue(v) pc.slider.SetValue(v)
}
} }
} }
} }
})
return content func (p *PlayerControls) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(p.container)
} }