add to playlist works

This commit is contained in:
Drew Weymouth
2023-02-09 20:57:42 -08:00
parent c66c43ecc8
commit 12cc315e12
8 changed files with 56 additions and 24 deletions
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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=
+1
View File
@@ -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),
+6 -2
View File
@@ -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)
}
+1 -1
View File
@@ -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)
}
+9 -3
View File
@@ -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()
}
+21 -13
View File
@@ -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()
+15 -2
View File
@@ -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
}