From 12cc315e1285da07ab863a7c7bb6f874ba2f7bdb Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Thu, 9 Feb 2023 20:57:42 -0800 Subject: [PATCH] add to playlist works --- go.mod | 2 +- go.sum | 4 ++-- ui/browsing/albumpage.go | 1 + ui/browsing/playlistpage.go | 8 ++++++-- ui/browsing/router.go | 2 +- ui/controller/controller.go | 12 ++++++++--- ui/dialogs/addtoplaylistdialog.go | 34 +++++++++++++++++++------------ ui/widgets/tracklist.go | 17 ++++++++++++++-- 8 files changed, 56 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 2aa4e7e..40b32ff 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( fyne.io/fyne/v2 v2.2.4 github.com/20after4/configdir v0.1.1 - github.com/dweymouth/go-subsonic v0.0.0-20230210015330-4d630f19878e + github.com/dweymouth/go-subsonic v0.0.0-20230210044542-537b9238299b github.com/google/uuid v1.3.0 github.com/pelletier/go-toml v1.9.3 github.com/wildeyedskies/go-mpv v0.0.0-20221204042335-e8961dc66756 diff --git a/go.sum b/go.sum index 3949cab..ec8c5d3 100644 --- a/go.sum +++ b/go.sum @@ -72,8 +72,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dweymouth/fyne/v2 v2.2.5-0.20230207011038-d2ef06e09a93 h1:4GGNszUwZhcneapbaBO+rbHtmCjKjZXHKPCqFXQPg4E= github.com/dweymouth/fyne/v2 v2.2.5-0.20230207011038-d2ef06e09a93/go.mod h1:MBoGuHzLLSXdQOWFAwWhIhYTEMp33zqtGCReSWhaQTA= -github.com/dweymouth/go-subsonic v0.0.0-20230210015330-4d630f19878e h1:+YR9JrwkWxniJ4/TgvSZze2sSC/USdLswAqebmIK3zo= -github.com/dweymouth/go-subsonic v0.0.0-20230210015330-4d630f19878e/go.mod h1:fUez6NFiEJiQTZizZ1BThZr5GJXAbigzGYjEPNm4tdI= +github.com/dweymouth/go-subsonic v0.0.0-20230210044542-537b9238299b h1:8JbTKYDdQg6JKu7ZDbEaVbXxutc3pRF58yNvTVMBHec= +github.com/dweymouth/go-subsonic v0.0.0-20230210044542-537b9238299b/go.mod h1:fUez6NFiEJiQTZizZ1BThZr5GJXAbigzGYjEPNm4tdI= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index 315da1f..7e90870 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -70,6 +70,7 @@ func NewAlbumPage( a.pm.LoadTracks(tracks, false) a.pm.PlayFromBeginning() } + a.tracklist.OnAddToPlaylist = a.contr.DoAddTracksToPlaylistWorkflow a.container = container.NewBorder( container.New(&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 15, PadBottom: 10}, a.header), diff --git a/ui/browsing/playlistpage.go b/ui/browsing/playlistpage.go index 159b01a..cc4e799 100644 --- a/ui/browsing/playlistpage.go +++ b/ui/browsing/playlistpage.go @@ -5,6 +5,7 @@ import ( "log" "supersonic/backend" "supersonic/res" + "supersonic/ui/controller" "supersonic/ui/layouts" "supersonic/ui/util" "supersonic/ui/widgets" @@ -29,6 +30,7 @@ type PlaylistPage struct { type playlistPageState struct { playlistID string + contr *controller.Controller sm *backend.ServerManager pm *backend.PlaybackManager im *backend.ImageManager @@ -37,12 +39,13 @@ type playlistPageState struct { func NewPlaylistPage( playlistID string, + contr *controller.Controller, sm *backend.ServerManager, pm *backend.PlaybackManager, im *backend.ImageManager, nav func(Route), ) *PlaylistPage { - a := &PlaylistPage{playlistPageState: playlistPageState{playlistID: playlistID, sm: sm, pm: pm, im: im}} + a := &PlaylistPage{playlistPageState: playlistPageState{playlistID: playlistID, contr: contr, sm: sm, pm: pm, im: im}} a.ExtendBaseWidget(a) a.header = NewPlaylistPageHeader(a) a.tracklist = widgets.NewTracklist(nil) @@ -54,6 +57,7 @@ func NewPlaylistPage( a.pm.LoadTracks(tracks, false) a.pm.PlayFromBeginning() } + a.tracklist.OnAddToPlaylist = a.contr.DoAddTracksToPlaylistWorkflow a.container = container.NewBorder( container.New(&layouts.MaxPadLayout{PadLeft: 15, PadRight: 15, PadTop: 15, PadBottom: 10}, a.header), @@ -195,5 +199,5 @@ func (a *PlaylistPageHeader) formatPlaylistTrackTimeStr(p *subsonic.Playlist) st } func (s *playlistPageState) Restore() Page { - return NewPlaylistPage(s.playlistID, s.sm, s.pm, s.im, s.nav) + return NewPlaylistPage(s.playlistID, s.contr, s.sm, s.pm, s.im, s.nav) } diff --git a/ui/browsing/router.go b/ui/browsing/router.go index 3eca1b7..32ac87b 100644 --- a/ui/browsing/router.go +++ b/ui/browsing/router.go @@ -99,7 +99,7 @@ func (r Router) CreatePage(rte Route) Page { case Genres: return NewArtistsGenresPage(true, r.App.ServerManager, r.OpenRoute) case Playlist: - return NewPlaylistPage(rte.Arg, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager, r.OpenRoute) + return NewPlaylistPage(rte.Arg, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager, r.OpenRoute) case Playlists: return NewPlaylistsPage(r.App.ServerManager, r.OpenRoute) } diff --git a/ui/controller/controller.go b/ui/controller/controller.go index 857fd1c..bed132a 100644 --- a/ui/controller/controller.go +++ b/ui/controller/controller.go @@ -10,7 +10,6 @@ import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/widget" - "github.com/dweymouth/go-subsonic/subsonic" ) type Controller struct { @@ -42,7 +41,7 @@ func (m *Controller) ShowPopUpImage(img image.Image) { // Show dialog to prompt for playlist. // Depending on the results of that dialog, potentially create a new playlist // Add tracks to the user-specified playlist -func (m *Controller) DoAddTracksToPlaylistWorkflow(tracks []*subsonic.Child) { +func (m *Controller) DoAddTracksToPlaylistWorkflow(trackIDs []string) { pls, err := m.App.LibraryManager.GetUserOwnedPlaylists() if err != nil { // TODO: surface this error to user @@ -59,6 +58,13 @@ func (m *Controller) DoAddTracksToPlaylistWorkflow(tracks []*subsonic.Child) { dlg.OnCanceled = pop.Hide dlg.OnSubmit = func(playlistChoice int, newPlaylistName string) { pop.Hide() - // call server to add tracks to playlist + if playlistChoice < 0 { + m.App.ServerManager.Server.CreatePlaylistWithTracks( + trackIDs, map[string]string{"name": newPlaylistName}) + } else { + m.App.ServerManager.Server.UpdatePlaylistTracks( + pls[playlistChoice].ID, trackIDs, nil /*tracksToRemove*/) + } } + pop.Show() } diff --git a/ui/dialogs/addtoplaylistdialog.go b/ui/dialogs/addtoplaylistdialog.go index 61bbb27..11e235c 100644 --- a/ui/dialogs/addtoplaylistdialog.go +++ b/ui/dialogs/addtoplaylistdialog.go @@ -32,31 +32,23 @@ func NewAddToPlaylistDialog(title string, existingPlaylistNames []string) *AddTo options := []string{"New playlist..."} options = append(options, existingPlaylistNames...) a.playlistSelect = widget.NewSelect(options, func(_ string) { - if a.playlistSelect.SelectedIndex() == 0 { - a.newPlaylistName.Show() - a.newPlaylistLabel.Show() - if len(a.newPlaylistName.Text) == 0 { - a.okBtn.Disable() - } else { - a.okBtn.Enable() - } - } else { - a.newPlaylistName.Hide() - a.newPlaylistLabel.Hide() - a.okBtn.Enable() - } + a.onSelectionChanged() }) + a.playlistSelect.PlaceHolder = "(Choose playlist)" a.newPlaylistName = widget.NewEntry() a.newPlaylistName.Hidden = true a.newPlaylistName.OnChanged = func(text string) { if len(text) > 0 { a.okBtn.Enable() + } else { + a.okBtn.Disable() } } a.newPlaylistLabel = widget.NewLabel("Name") a.newPlaylistLabel.Hidden = true a.okBtn = widget.NewButton("OK", a.onOK) + a.okBtn.Disable() cancelBtn := widget.NewButton("Cancel", a.onCancel) a.container = container.NewVBox( @@ -85,6 +77,22 @@ func (a *AddToPlaylistDialog) onOK() { } } +func (a *AddToPlaylistDialog) onSelectionChanged() { + if a.playlistSelect.SelectedIndex() == 0 { + a.newPlaylistName.Show() + a.newPlaylistLabel.Show() + if len(a.newPlaylistName.Text) == 0 { + a.okBtn.Disable() + } else { + a.okBtn.Enable() + } + } else { + a.newPlaylistName.Hide() + a.newPlaylistLabel.Hide() + a.okBtn.Enable() + } +} + func (a *AddToPlaylistDialog) onCancel() { if a.OnCanceled != nil { a.OnCanceled() diff --git a/ui/widgets/tracklist.go b/ui/widgets/tracklist.go index 16dcd03..11cfd78 100644 --- a/ui/widgets/tracklist.go +++ b/ui/widgets/tracklist.go @@ -117,7 +117,7 @@ type Tracklist struct { OnPlayTrackAt func(int) OnPlaySelection func(tracks []*subsonic.Child) OnAddToQueue func(trackIDs []*subsonic.Child) - OnAddToPlaylist func(trackIDs []*subsonic.Child) + OnAddToPlaylist func(trackIDs []string) selectionMgr util.ListSelectionManager nowPlayingIdx int @@ -213,7 +213,11 @@ func (t *Tracklist) onShowContextMenu(e *fyne.PointEvent, trackIdx int) { t.OnAddToQueue(t.selectedTracks()) } }), - //fyne.NewMenuItem("Add to playlist...", func() {}), + fyne.NewMenuItem("Add to playlist...", func() { + if t.OnAddToPlaylist != nil { + t.OnAddToPlaylist(t.selectedTrackIDs()) + } + }), ) } widget.ShowPopUpMenuAtPosition(t.ctxMenu, fyne.CurrentApp().Driver().CanvasForObject(t), e.AbsolutePosition) @@ -227,3 +231,12 @@ func (t *Tracklist) selectedTracks() []*subsonic.Child { } return tracks } + +func (t *Tracklist) selectedTrackIDs() []string { + sel := t.selectionMgr.GetSelection() + tracks := make([]string, 0, len(sel)) + for _, idx := range sel { + tracks = append(tracks, t.Tracks[idx].ID) + } + return tracks +}