diff --git a/backend/playbackengine.go b/backend/playbackengine.go index ebc8419..04eaed9 100644 --- a/backend/playbackengine.go +++ b/backend/playbackengine.go @@ -61,6 +61,7 @@ type playbackEngine struct { onStopped []func() onPlaying []func() onPlayerChange []func() + onQueueChange []func() } func NewPlaybackEngine( @@ -216,15 +217,21 @@ func (p *playbackEngine) LoadTracks(tracks []*mediaprovider.Track, appendToQueue if needToSetNext { p.setNextTrack(p.nowPlayingIdx + 1) } + + p.invokeNoArgCallbacks(p.onQueueChange) return nil } // Stop playback and clear the play queue. func (p *playbackEngine) StopAndClearPlayQueue() { + changed := len(p.playQueue) > 0 p.player.Stop() p.doUpdateTimePos() p.playQueue = nil p.nowPlayingIdx = -1 + if changed { + p.invokeNoArgCallbacks(p.onQueueChange) + } } func (p *playbackEngine) GetPlayQueue() []*mediaprovider.Track { @@ -273,6 +280,7 @@ func (p *playbackEngine) UpdatePlayQueue(tracks []*mediaprovider.Track) error { p.setNextTrackAfterQueueUpdate() } + p.invokeNoArgCallbacks(p.onQueueChange) return nil } @@ -321,6 +329,8 @@ func (p *playbackEngine) RemoveTracksFromQueue(trackIDs []string) { p.setNextTrack(-1) } } + + p.invokeNoArgCallbacks(p.onQueueChange) } func (p *playbackEngine) SetReplayGainOptions(config ReplayGainConfig) { diff --git a/backend/playbackmanager.go b/backend/playbackmanager.go index e5288a5..ae1c70d 100644 --- a/backend/playbackmanager.go +++ b/backend/playbackmanager.go @@ -74,6 +74,11 @@ func (p *PlaybackManager) OnVolumeChange(cb func(int)) { p.engine.onVolumeChange = append(p.engine.onVolumeChange, cb) } +// Registers a callback that is notified whenever the play queue changes. +func (p *PlaybackManager) OnQueueChange(cb func()) { + p.engine.onQueueChange = append(p.engine.onQueueChange, cb) +} + // Registers a callback that is notified whenever the player has been seeked. func (p *PlaybackManager) OnSeek(cb func()) { p.engine.onSeek = append(p.engine.onSeek, cb) diff --git a/ui/browsing/browsingpane.go b/ui/browsing/browsingpane.go index fc275b6..6168c15 100644 --- a/ui/browsing/browsingpane.go +++ b/ui/browsing/browsingpane.go @@ -49,6 +49,10 @@ type CanShowPlayTime interface { OnPlayTimeUpdate(curTime, totalTime float64) } +type CanShowPlayQueue interface { + OnPlayQueueChange() +} + type BrowsingPane struct { widget.BaseWidget @@ -80,6 +84,7 @@ func NewBrowsingPane(app *backend.App, contr *controller.Controller) *BrowsingPa b.reload = widget.NewButtonWithIcon("", theme.ViewRefreshIcon(), b.Reload) b.app.PlaybackManager.OnSongChange(b.onSongChange) b.app.PlaybackManager.OnPlayTimeUpdate(b.onPlayTimeUpdate) + b.app.PlaybackManager.OnQueueChange(b.onQueueChange) bkgrnd := myTheme.NewThemedRectangle(myTheme.ColorNamePageBackground) b.pageContainer = container.NewStack(bkgrnd, layout.NewSpacer()) b.settingsBtn = widget.NewButtonWithIcon("", theme.SettingsIcon(), func() { @@ -222,6 +227,15 @@ func (b *BrowsingPane) onPlayTimeUpdate(cur, total float64) { } } +func (b *BrowsingPane) onQueueChange() { + if b.curPage == nil { + return + } + if p, ok := b.curPage.(CanShowPlayQueue); ok { + p.OnPlayQueueChange() + } +} + func (b *BrowsingPane) addPageToHistory(p Page, truncate bool) { if truncate { // allow garbage collection of pages that will be removed from the history diff --git a/ui/browsing/fullscreenpage.go b/ui/browsing/fullscreenpage.go index 78e85cb..65b6ccf 100644 --- a/ui/browsing/fullscreenpage.go +++ b/ui/browsing/fullscreenpage.go @@ -135,6 +135,10 @@ func (a *FullscreenPage) OnSongChange(song, lastScrobbledIfAny *mediaprovider.Tr }) } +func (a *FullscreenPage) OnPlayQueueChange() { + a.Reload() +} + func (a *FullscreenPage) Reload() { a.queue = a.pm.GetPlayQueue() a.queueList.SetTracks(a.queue)