WIP: feat: add "Play next" MenuItem

This commit is contained in:
Tanguy Rossel
2024-04-04 08:39:14 +02:00
parent 914636e91f
commit 63bdfb5f87
9 changed files with 81 additions and 41 deletions
+2 -2
View File
@@ -226,7 +226,7 @@ func NewAlbumPageHeader(page *AlbumPage) *AlbumPageHeader {
go a.page.pm.PlayAlbum(a.page.albumID, 0, false)
})
shuffleBtn := widget.NewButtonWithIcon("Shuffle", myTheme.ShuffleIcon, func() {
a.page.pm.LoadTracks(a.page.tracklist.GetTracks(), false, true)
a.page.pm.LoadTracks(a.page.tracklist.GetTracks(), backend.Replace, true)
a.page.pm.PlayFromBeginning()
})
var pop *widget.PopUpMenu
@@ -234,7 +234,7 @@ func NewAlbumPageHeader(page *AlbumPage) *AlbumPageHeader {
menuBtn.OnTapped = func() {
if pop == nil {
queue := fyne.NewMenuItem("Add to queue", func() {
go a.page.pm.LoadAlbum(a.albumID, true /*append*/, false /*shuffle*/)
go a.page.pm.LoadAlbum(a.albumID, backend.Append, false /*shuffle*/)
})
queue.Icon = theme.ContentAddIcon()
playlist := fyne.NewMenuItem("Add to playlist...", func() {
+8 -4
View File
@@ -253,19 +253,23 @@ func NewPlaylistPageHeader(page *PlaylistPage) *PlaylistPageHeader {
})
a.editButton.Hidden = true
playButton := widget.NewButtonWithIcon("Play", theme.MediaPlayIcon(), func() {
a.page.pm.LoadTracks(a.page.tracks, false, false)
a.page.pm.LoadTracks(a.page.tracks, backend.Replace, false)
a.page.pm.PlayFromBeginning()
})
shuffleBtn := widget.NewButtonWithIcon("Shuffle", myTheme.ShuffleIcon, func() {
a.page.pm.LoadTracks(a.page.tracks, false /*append*/, true /*shuffle*/)
a.page.pm.LoadTracks(a.page.tracks, backend.Replace, true)
a.page.pm.PlayFromBeginning()
})
var pop *widget.PopUpMenu
menuBtn := widget.NewButtonWithIcon("", theme.MoreHorizontalIcon(), nil)
menuBtn.OnTapped = func() {
if pop == nil {
queue_next := fyne.NewMenuItem("Play next", func() {
go a.page.pm.LoadPlaylist(a.page.playlistID, backend.InsertNext, false)
})
queue_next.Icon = theme.ContentAddIcon()
queue := fyne.NewMenuItem("Add to queue", func() {
go a.page.pm.LoadPlaylist(a.page.playlistID, true /*append*/, false /*shuffle*/)
go a.page.pm.LoadPlaylist(a.page.playlistID, backend.Append, false)
})
queue.Icon = theme.ContentAddIcon()
playlist := fyne.NewMenuItem("Add to playlist...", func() {
@@ -277,7 +281,7 @@ func NewPlaylistPageHeader(page *PlaylistPage) *PlaylistPageHeader {
a.page.contr.ShowDownloadDialog(a.page.tracks, a.titleLabel.String())
})
download.Icon = theme.DownloadIcon()
menu := fyne.NewMenu("", queue, playlist, download)
menu := fyne.NewMenu("", queue_next, queue, playlist, download)
pop = widget.NewPopUpMenu(menu, fyne.CurrentApp().Driver().CanvasForObject(a))
}
pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(menuBtn)
+1 -1
View File
@@ -123,7 +123,7 @@ func (a *PlaylistsPage) createGridView(playlists []*mediaprovider.Playlist) {
go a.contr.App.PlaybackManager.PlayPlaylist(id, 0, shuffle)
}
a.gridView.OnAddToQueue = func(id string) {
go a.contr.App.PlaybackManager.LoadPlaylist(id, true, false)
go a.contr.App.PlaybackManager.LoadPlaylist(id, backend.Append, false)
}
a.gridView.OnShowItemPage = a.showPlaylistPage
a.gridView.OnShowSecondaryPage = nil
+17 -8
View File
@@ -113,18 +113,21 @@ func (m *Controller) ConnectTracklistActions(tracklist *widgets.Tracklist) {
func (m *Controller) connectTracklistActionsWithReplayGainMode(tracklist *widgets.Tracklist, mode player.ReplayGainMode) {
tracklist.OnAddToPlaylist = m.DoAddTracksToPlaylistWorkflow
tracklist.OnPlaySelectionNext = func(tracks []*mediaprovider.Track) {
m.App.PlaybackManager.LoadTracks(tracks, backend.InsertNext, false)
}
tracklist.OnAddToQueue = func(tracks []*mediaprovider.Track) {
m.App.PlaybackManager.LoadTracks(tracks, true, false)
m.App.PlaybackManager.LoadTracks(tracks, backend.Append, false)
}
tracklist.OnPlayTrackAt = func(idx int) {
m.App.PlaybackManager.LoadTracks(tracklist.GetTracks(), false, false)
m.App.PlaybackManager.LoadTracks(tracklist.GetTracks(), backend.Replace, false)
if m.App.Config.ReplayGain.Mode == backend.ReplayGainAuto {
m.App.PlaybackManager.SetReplayGainMode(mode)
}
m.App.PlaybackManager.PlayTrackAt(idx)
}
tracklist.OnPlaySelection = func(tracks []*mediaprovider.Track, shuffle bool) {
m.App.PlaybackManager.LoadTracks(tracks, false, shuffle)
m.App.PlaybackManager.LoadTracks(tracks, backend.Replace, shuffle)
if m.App.Config.ReplayGain.Mode == backend.ReplayGainAuto {
m.App.PlaybackManager.SetReplayGainMode(mode)
}
@@ -152,7 +155,7 @@ func (m *Controller) connectTracklistActionsWithReplayGainMode(tracklist *widget
log.Println("Error getting song radio: ", err)
return
}
m.App.PlaybackManager.LoadTracks(tracks, false, false)
m.App.PlaybackManager.LoadTracks(tracks, backend.Replace, false)
if m.App.Config.ReplayGain.Mode == backend.ReplayGainAuto {
m.App.PlaybackManager.SetReplayGainMode(mode)
}
@@ -163,7 +166,10 @@ func (m *Controller) connectTracklistActionsWithReplayGainMode(tracklist *widget
func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) {
grid.OnAddToQueue = func(albumID string) {
go m.App.PlaybackManager.LoadAlbum(albumID, true, false)
go m.App.PlaybackManager.LoadAlbum(albumID, backend.Append, false)
}
grid.OnPlayNext = func(albumID string) {
go m.App.PlaybackManager.LoadAlbum(albumID, backend.InsertNext, false)
}
grid.OnPlay = func(albumID string, shuffle bool) {
go m.App.PlaybackManager.PlayAlbum(albumID, 0, shuffle)
@@ -201,9 +207,12 @@ func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) {
func (m *Controller) ConnectArtistGridActions(grid *widgets.GridView) {
grid.OnShowItemPage = func(id string) { m.NavigateTo(ArtistRoute(id)) }
grid.OnPlayNext = func(artistID string) {
go m.App.PlaybackManager.LoadTracks(m.GetArtistTracks(artistID), backend.InsertNext, false)
}
grid.OnPlay = func(artistID string, shuffle bool) { go m.PlayArtistDiscography(artistID, shuffle) }
grid.OnAddToQueue = func(artistID string) {
go m.App.PlaybackManager.LoadTracks(m.GetArtistTracks(artistID), true /*append*/, false /*shuffle*/)
go m.App.PlaybackManager.LoadTracks(m.GetArtistTracks(artistID), backend.Append, false)
}
grid.OnAddToPlaylist = func(artistID string) {
go m.DoAddTracksToPlaylistWorkflow(
@@ -250,7 +259,7 @@ func (m *Controller) GetArtistTracks(artistID string) []*mediaprovider.Track {
}
func (m *Controller) PlayArtistDiscography(artistID string, shuffleTracks bool) {
m.App.PlaybackManager.LoadTracks(m.GetArtistTracks(artistID), false, shuffleTracks)
m.App.PlaybackManager.LoadTracks(m.GetArtistTracks(artistID), backend.Replace, shuffleTracks)
if m.App.Config.ReplayGain.Mode == backend.ReplayGainAuto {
if shuffleTracks {
m.App.PlaybackManager.SetReplayGainMode(player.ReplayGainTrack)
@@ -275,7 +284,7 @@ func (m *Controller) ShuffleArtistAlbums(artistID string) {
})
m.App.PlaybackManager.StopAndClearPlayQueue()
for _, al := range artist.Albums {
m.App.PlaybackManager.LoadAlbum(al.ID, true /*append*/, false /*shuffle*/)
m.App.PlaybackManager.LoadAlbum(al.ID, backend.Append, false)
}
if m.App.Config.ReplayGain.Mode == backend.ReplayGainAuto {
+8 -1
View File
@@ -117,6 +117,7 @@ type GridViewState struct {
DisableSharing bool
OnPlay func(id string, shuffle bool)
OnPlayNext func(id string)
OnAddToQueue func(id string)
OnAddToPlaylist func(id string)
OnDownload func(id string)
@@ -403,6 +404,12 @@ func (g *GridView) showContextMenu(card *GridViewItem, pos fyne.Position) {
play.Icon = theme.MediaPlayIcon()
shuffle := fyne.NewMenuItem("Shuffle", func() { g.onPlay(g.menuGridViewItemId, true) })
shuffle.Icon = myTheme.ShuffleIcon
queue_next := fyne.NewMenuItem("Play next", func() {
if g.OnPlayNext != nil {
g.OnPlayNext(g.menuGridViewItemId)
}
})
queue_next.Icon = theme.ContentAddIcon()
queue := fyne.NewMenuItem("Add to queue", func() {
if g.OnAddToQueue != nil {
g.OnAddToQueue(g.menuGridViewItemId)
@@ -425,7 +432,7 @@ func (g *GridView) showContextMenu(card *GridViewItem, pos fyne.Position) {
g.OnShare(g.menuGridViewItemId)
})
g.shareMenuItem.Icon = myTheme.ShareIcon
g.menu = widget.NewPopUpMenu(fyne.NewMenu("", play, shuffle, queue, playlist, download, g.shareMenuItem),
g.menu = widget.NewPopUpMenu(fyne.NewMenu("", play, shuffle, queue_next, queue, playlist, download, g.shareMenuItem),
fyne.CurrentApp().Driver().CanvasForObject(g))
}
g.shareMenuItem.Disabled = g.DisableSharing
+17 -10
View File
@@ -84,15 +84,16 @@ type Tracklist struct {
Options TracklistOptions
// user action callbacks
OnPlayTrackAt func(int)
OnPlaySelection func(tracks []*mediaprovider.Track, shuffle bool)
OnAddToQueue func(trackIDs []*mediaprovider.Track)
OnAddToPlaylist func(trackIDs []string)
OnSetFavorite func(trackIDs []string, fav bool)
OnSetRating func(trackIDs []string, rating int)
OnDownload func(tracks []*mediaprovider.Track, downloadName string)
OnShare func(trackID string)
OnPlaySongRadio func(track *mediaprovider.Track)
OnPlayTrackAt func(int)
OnPlaySelection func(tracks []*mediaprovider.Track, shuffle bool)
OnPlaySelectionNext func(trackIDs []*mediaprovider.Track)
OnAddToQueue func(trackIDs []*mediaprovider.Track)
OnAddToPlaylist func(trackIDs []string)
OnSetFavorite func(trackIDs []string, fav bool)
OnSetRating func(trackIDs []string, rating int)
OnDownload func(tracks []*mediaprovider.Track, downloadName string)
OnShare func(trackID string)
OnPlaySongRadio func(track *mediaprovider.Track)
OnShowArtistPage func(artistID string)
OnShowAlbumPage func(albumID string)
@@ -535,6 +536,12 @@ func (t *Tracklist) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
}
})
shuffle.Icon = myTheme.ShuffleIcon
play_next := fyne.NewMenuItem("Play next", func() {
if t.OnPlaySelection != nil {
t.OnPlaySelectionNext(t.selectedTracks())
}
})
play_next.Icon = theme.ContentAddIcon()
add := fyne.NewMenuItem("Add to queue", func() {
if t.OnPlaySelection != nil {
t.OnAddToQueue(t.selectedTracks())
@@ -546,7 +553,7 @@ func (t *Tracklist) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
})
t.songRadioMenuItem.Icon = myTheme.BroadcastIcon
t.ctxMenu.Items = append(t.ctxMenu.Items,
play, shuffle, add, t.songRadioMenuItem)
play, shuffle, play_next, add, t.songRadioMenuItem)
}
playlist := fyne.NewMenuItem("Add to playlist...", func() {
if t.OnAddToPlaylist != nil {