add to playlist works
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user