reuse context menu across both types of tracklist
This commit is contained in:
@@ -166,6 +166,18 @@ func NewNowPlayingPage(
|
|||||||
a.relatedList.OnPlaySelectionNext = func(items []mediaprovider.MediaItem) {
|
a.relatedList.OnPlaySelectionNext = func(items []mediaprovider.MediaItem) {
|
||||||
a.pm.LoadItems(items, backend.InsertNext, false)
|
a.pm.LoadItems(items, backend.InsertNext, false)
|
||||||
}
|
}
|
||||||
|
a.relatedList.OnPlaySongRadio = func(track *mediaprovider.Track) {
|
||||||
|
go func() {
|
||||||
|
if err := a.pm.PlaySimilarSongs(track.ID); err != nil {
|
||||||
|
fyne.Do(func() {
|
||||||
|
a.contr.ToastProvider.ShowErrorToast(lang.L("Unable to play song radio"))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
a.relatedList.OnShowTrackInfo = func(track *mediaprovider.Track) {
|
||||||
|
a.contr.ShowTrackInfoDialog(track)
|
||||||
|
}
|
||||||
a.lyricsViewer = widgets.NewLyricsViewer()
|
a.lyricsViewer = widgets.NewLyricsViewer()
|
||||||
a.statusLabel = widget.NewLabel(lang.L("Stopped"))
|
a.statusLabel = widget.NewLabel(lang.L("Stopped"))
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import (
|
|||||||
"github.com/dweymouth/supersonic/sharedutil"
|
"github.com/dweymouth/supersonic/sharedutil"
|
||||||
"github.com/dweymouth/supersonic/ui/widgets"
|
"github.com/dweymouth/supersonic/ui/widgets"
|
||||||
|
|
||||||
|
"fyne.io/fyne/v2"
|
||||||
|
"fyne.io/fyne/v2/lang"
|
||||||
"fyne.io/fyne/v2/widget"
|
"fyne.io/fyne/v2/widget"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -179,4 +181,14 @@ func (c *Controller) ConnectPlayQueuelistActions(list *widgets.PlayQueueList) {
|
|||||||
}
|
}
|
||||||
list.OnSetRating = c.SetTrackRatings
|
list.OnSetRating = c.SetTrackRatings
|
||||||
list.OnSetFavorite = c.SetTrackFavorites
|
list.OnSetFavorite = c.SetTrackFavorites
|
||||||
|
list.OnPlaySongRadio = func(track *mediaprovider.Track) {
|
||||||
|
go func() {
|
||||||
|
if err := c.App.PlaybackManager.PlaySimilarSongs(track.ID); err != nil {
|
||||||
|
fyne.Do(func() {
|
||||||
|
c.ToastProvider.ShowErrorToast(lang.L("Unable to play song radio"))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
list.OnShowTrackInfo = c.ShowTrackInfoDialog
|
||||||
}
|
}
|
||||||
|
|||||||
+43
-106
@@ -42,6 +42,7 @@ type PlayQueueList struct {
|
|||||||
OnPlayItemAt func(idx int)
|
OnPlayItemAt func(idx int)
|
||||||
OnPlaySelection func(items []mediaprovider.MediaItem, shuffle bool)
|
OnPlaySelection func(items []mediaprovider.MediaItem, shuffle bool)
|
||||||
OnPlaySelectionNext func(items []mediaprovider.MediaItem)
|
OnPlaySelectionNext func(items []mediaprovider.MediaItem)
|
||||||
|
OnPlaySongRadio func(track *mediaprovider.Track)
|
||||||
OnAddToQueue func(items []mediaprovider.MediaItem)
|
OnAddToQueue func(items []mediaprovider.MediaItem)
|
||||||
OnAddToPlaylist func(trackIDs []string)
|
OnAddToPlaylist func(trackIDs []string)
|
||||||
OnSetFavorite func(trackIDs []string, fav bool)
|
OnSetFavorite func(trackIDs []string, fav bool)
|
||||||
@@ -54,11 +55,8 @@ type PlayQueueList struct {
|
|||||||
OnReorderItems func(idxs []int, reorderTo int)
|
OnReorderItems func(idxs []int, reorderTo int)
|
||||||
|
|
||||||
useNonQueueMenu bool
|
useNonQueueMenu bool
|
||||||
menu *widget.PopUpMenu // ctx menu for when only tracks are selected
|
menu *util.TrackContextMenu // ctx menu for when only tracks are selected
|
||||||
radiosMenu *widget.PopUpMenu // ctx menu for when selection contains radios
|
radiosMenu *widget.PopUpMenu // ctx menu for when selection contains radios
|
||||||
ratingSubmenu *fyne.MenuItem
|
|
||||||
infoMenuItem *fyne.MenuItem
|
|
||||||
shareMenuItem *fyne.MenuItem
|
|
||||||
|
|
||||||
nowPlayingID string
|
nowPlayingID string
|
||||||
|
|
||||||
@@ -256,82 +254,24 @@ func (p *PlayQueueList) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var menu *widget.PopUpMenu
|
|
||||||
if allTracks {
|
if allTracks {
|
||||||
p.ensureTracksMenu()
|
p.ensureTracksMenu()
|
||||||
p.ratingSubmenu.Disabled = p.DisableRating
|
p.menu.SetRatingDisabled(p.DisableRating)
|
||||||
p.infoMenuItem.Disabled = len(selected) != 1
|
p.menu.SetInfoDisabled(len(selected) != 1)
|
||||||
p.shareMenuItem.Disabled = p.DisableSharing || len(selected) != 1
|
p.menu.SetShareDisabled(p.DisableSharing || len(selected) != 1)
|
||||||
menu = p.menu
|
p.menu.ShowAtPosition(e.AbsolutePosition, fyne.CurrentApp().Driver().CanvasForObject(p))
|
||||||
} else {
|
} else {
|
||||||
p.ensureRadiosMenu()
|
p.ensureRadiosMenu()
|
||||||
menu = p.radiosMenu
|
p.radiosMenu.ShowAtPosition(e.AbsolutePosition)
|
||||||
}
|
}
|
||||||
menu.ShowAtPosition(e.AbsolutePosition)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PlayQueueList) ensureTracksMenu() {
|
func (p *PlayQueueList) ensureTracksMenu() {
|
||||||
if p.menu != nil {
|
if p.menu != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var menuItems []*fyne.MenuItem
|
var auxItems []*fyne.MenuItem
|
||||||
if p.useNonQueueMenu {
|
|
||||||
menuItems = append(menuItems, p.createQueueActionMenuItems()...)
|
|
||||||
menuItems = append(menuItems, fyne.NewMenuItemSeparator())
|
|
||||||
}
|
|
||||||
|
|
||||||
playlist := fyne.NewMenuItem(lang.L("Add to playlist")+"...", func() {
|
|
||||||
if p.OnAddToPlaylist != nil {
|
|
||||||
p.OnAddToPlaylist(p.selectedItemIDs())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
playlist.Icon = myTheme.PlaylistIcon
|
|
||||||
download := fyne.NewMenuItem(lang.L("Download")+"...", func() {
|
|
||||||
if p.OnDownload != nil {
|
|
||||||
p.OnDownload(p.selectedTracks(), "Selected tracks")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
download.Icon = theme.DownloadIcon()
|
|
||||||
p.infoMenuItem = fyne.NewMenuItem(lang.L("Show info")+"...", func() {
|
|
||||||
if p.OnShowTrackInfo != nil {
|
|
||||||
p.OnShowTrackInfo(p.selectedTracks()[0])
|
|
||||||
}
|
|
||||||
})
|
|
||||||
p.infoMenuItem.Icon = theme.InfoIcon()
|
|
||||||
p.shareMenuItem = fyne.NewMenuItem(lang.L("Share")+"...", func() {
|
|
||||||
if p.OnShare != nil {
|
|
||||||
p.OnShare(p.selectedTracks())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
p.shareMenuItem.Icon = myTheme.ShareIcon
|
|
||||||
favorite := fyne.NewMenuItem(lang.L("Set favorite"), func() {
|
|
||||||
if p.OnSetFavorite != nil {
|
|
||||||
p.OnSetFavorite(p.selectedItemIDs(), true)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
favorite.Icon = myTheme.FavoriteIcon
|
|
||||||
unfavorite := fyne.NewMenuItem(lang.L("Unset favorite"), func() {
|
|
||||||
if p.OnSetFavorite != nil {
|
|
||||||
p.OnSetFavorite(p.selectedItemIDs(), false)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
unfavorite.Icon = myTheme.NotFavoriteIcon
|
|
||||||
p.ratingSubmenu = util.NewRatingSubmenu(func(rating int) {
|
|
||||||
if p.OnSetRating != nil {
|
|
||||||
p.OnSetRating(p.selectedItemIDs(), rating)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
menuItems = append(menuItems,
|
|
||||||
playlist,
|
|
||||||
download,
|
|
||||||
p.infoMenuItem,
|
|
||||||
p.shareMenuItem,
|
|
||||||
fyne.NewMenuItemSeparator(),
|
|
||||||
favorite,
|
|
||||||
unfavorite,
|
|
||||||
p.ratingSubmenu,
|
|
||||||
)
|
|
||||||
|
|
||||||
if !p.useNonQueueMenu {
|
if !p.useNonQueueMenu {
|
||||||
remove := fyne.NewMenuItem(lang.L("Remove from queue"), func() {
|
remove := fyne.NewMenuItem(lang.L("Remove from queue"), func() {
|
||||||
if p.OnRemoveFromQueue != nil {
|
if p.OnRemoveFromQueue != nil {
|
||||||
@@ -339,15 +279,40 @@ func (p *PlayQueueList) ensureTracksMenu() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
remove.Icon = theme.ContentRemoveIcon()
|
remove.Icon = theme.ContentRemoveIcon()
|
||||||
menuItems = append(menuItems,
|
auxItems = append(auxItems, remove)
|
||||||
fyne.NewMenuItemSeparator(),
|
}
|
||||||
remove)
|
p.menu = util.NewTrackContextMenu(!p.useNonQueueMenu, auxItems)
|
||||||
|
p.menu.OnPlay = func(shuffle bool) {
|
||||||
|
p.OnPlaySelection(p.selectedItems(), shuffle)
|
||||||
|
}
|
||||||
|
p.menu.OnAddToQueue = func(next bool) {
|
||||||
|
if next {
|
||||||
|
p.OnPlaySelectionNext(p.selectedItems())
|
||||||
|
} else {
|
||||||
|
p.OnAddToQueue(p.selectedItems())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p.menu.OnPlaySongRadio = func() {
|
||||||
|
p.OnPlaySongRadio(p.selectedTracks()[0])
|
||||||
|
}
|
||||||
|
p.menu.OnDownload = func() {
|
||||||
|
p.OnDownload(p.selectedTracks(), "Selected tracks")
|
||||||
|
}
|
||||||
|
p.menu.OnAddToPlaylist = func() {
|
||||||
|
p.OnAddToPlaylist(p.selectedItemIDs())
|
||||||
|
}
|
||||||
|
p.menu.OnShowInfo = func() {
|
||||||
|
p.OnShowTrackInfo(p.selectedTracks()[0])
|
||||||
|
}
|
||||||
|
p.menu.OnShare = func() {
|
||||||
|
p.OnShare(p.selectedTracks())
|
||||||
|
}
|
||||||
|
p.menu.OnSetRating = func(rating int) {
|
||||||
|
p.OnSetRating(p.selectedItemIDs(), rating)
|
||||||
|
}
|
||||||
|
p.menu.OnFavorite = func(fav bool) {
|
||||||
|
p.OnSetFavorite(p.selectedItemIDs(), fav)
|
||||||
}
|
}
|
||||||
|
|
||||||
p.menu = widget.NewPopUpMenu(
|
|
||||||
fyne.NewMenu("", menuItems...),
|
|
||||||
fyne.CurrentApp().Driver().CanvasForObject(p),
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PlayQueueList) ensureRadiosMenu() {
|
func (p *PlayQueueList) ensureRadiosMenu() {
|
||||||
@@ -366,34 +331,6 @@ func (p *PlayQueueList) ensureRadiosMenu() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PlayQueueList) createQueueActionMenuItems() []*fyne.MenuItem {
|
|
||||||
play := fyne.NewMenuItem(lang.L("Play"), func() {
|
|
||||||
if p.OnPlaySelection != nil {
|
|
||||||
p.OnPlaySelection(p.selectedItems(), false)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
play.Icon = theme.MediaPlayIcon()
|
|
||||||
shuffle := fyne.NewMenuItem(lang.L("Shuffle"), func() {
|
|
||||||
if p.OnPlaySelection != nil {
|
|
||||||
p.OnPlaySelection(p.selectedItems(), true)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
shuffle.Icon = myTheme.ShuffleIcon
|
|
||||||
playNext := fyne.NewMenuItem(lang.L("Play next"), func() {
|
|
||||||
if p.OnPlaySelection != nil {
|
|
||||||
p.OnPlaySelectionNext(p.selectedItems())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
playNext.Icon = myTheme.PlayNextIcon
|
|
||||||
add := fyne.NewMenuItem(lang.L("Add to queue"), func() {
|
|
||||||
if p.OnPlaySelection != nil {
|
|
||||||
p.OnAddToQueue(p.selectedItems())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
add.Icon = theme.ContentAddIcon()
|
|
||||||
return []*fyne.MenuItem{play, shuffle, playNext, add}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *PlayQueueList) selectedItems() []mediaprovider.MediaItem {
|
func (t *PlayQueueList) selectedItems() []mediaprovider.MediaItem {
|
||||||
t.tracksMutex.RLock()
|
t.tracksMutex.RLock()
|
||||||
defer t.tracksMutex.RUnlock()
|
defer t.tracksMutex.RUnlock()
|
||||||
|
|||||||
Reference in New Issue
Block a user