Refactor and temporarily disable sharing artists

This commit is contained in:
Michael Manganiello
2024-03-03 21:01:48 -03:00
parent d9bbe03e81
commit a6fefc992d
15 changed files with 110 additions and 84 deletions
+1
View File
@@ -151,6 +151,7 @@ type SupportsRating interface {
type SupportsSharing interface { type SupportsSharing interface {
CreateShareURL(id string) (*url.URL, error) CreateShareURL(id string) (*url.URL, error)
CanShareArtists() bool
} }
type JukeboxProvider interface { type JukeboxProvider interface {
@@ -330,6 +330,12 @@ func (s *subsonicMediaProvider) CreateShareURL(id string) (*url.URL, error) {
return shareUrl, nil return shareUrl, nil
} }
func (s *subsonicMediaProvider) CanShareArtists() bool {
// TODO: Change to true when we decide to allow sharing artists, in case an OpenSubsonic extension
// is approved to share artists in addition to albums and tracks.
return false
}
func (s *subsonicMediaProvider) DownloadTrack(trackID string) (io.Reader, error) { func (s *subsonicMediaProvider) DownloadTrack(trackID string) (io.Reader, error) {
return s.client.Download(trackID) return s.client.Download(trackID)
} }
+8 -11
View File
@@ -94,9 +94,9 @@ func newAlbumPage(
a.tracklist.SetVisibleColumns(a.cfg.TracklistColumns) a.tracklist.SetVisibleColumns(a.cfg.TracklistColumns)
a.tracklist.SetSorting(sort) a.tracklist.SetSorting(sort)
_, canRate := a.mp.(mediaprovider.SupportsRating) _, canRate := a.mp.(mediaprovider.SupportsRating)
_, canShare := a.mp.(mediaprovider.SupportsRating) _, canShare := a.mp.(mediaprovider.SupportsSharing)
a.tracklist.Options.DisableRating = !canRate a.tracklist.Options.DisableRating = !canRate
a.tracklist.Options.HideSharing = !canShare a.tracklist.Options.DisableSharing = !canShare
a.tracklist.OnVisibleColumnsChanged = func(cols []string) { a.tracklist.OnVisibleColumnsChanged = func(cols []string) {
a.cfg.TracklistColumns = cols a.cfg.TracklistColumns = cols
} }
@@ -185,6 +185,7 @@ type AlbumPageHeader struct {
artistLabelSpace *util.HSpace // TODO: remove when no longer needed artistLabelSpace *util.HSpace // TODO: remove when no longer needed
genreLabel *widgets.MultiHyperlink genreLabel *widgets.MultiHyperlink
miscLabel *widget.Label miscLabel *widget.Label
shareMenuItem *fyne.MenuItem
toggleFavButton *widgets.FavoriteButton toggleFavButton *widgets.FavoriteButton
@@ -248,19 +249,15 @@ func NewAlbumPageHeader(page *AlbumPage) *AlbumPageHeader {
a.page.contr.ShowAlbumInfoDialog(a.albumID, a.titleLabel.String(), a.cover.Image()) a.page.contr.ShowAlbumInfoDialog(a.albumID, a.titleLabel.String(), a.cover.Image())
}) })
info.Icon = theme.InfoIcon() info.Icon = theme.InfoIcon()
menuItems := []*fyne.MenuItem{queue, playlist, download, info} a.shareMenuItem = fyne.NewMenuItem("Share...", func() {
_, canShare := page.mp.(mediaprovider.SupportsSharing)
if canShare {
share := fyne.NewMenuItem("Share...", func() {
a.page.contr.ShowShareDialog(a.albumID) a.page.contr.ShowShareDialog(a.albumID)
}) })
share.Icon = myTheme.ShareIcon a.shareMenuItem.Icon = myTheme.ShareIcon
menuItems = append(menuItems, share) menu := fyne.NewMenu("", queue, playlist, download, info, a.shareMenuItem)
}
menu := fyne.NewMenu("", menuItems...)
pop = widget.NewPopUpMenu(menu, fyne.CurrentApp().Driver().CanvasForObject(a)) pop = widget.NewPopUpMenu(menu, fyne.CurrentApp().Driver().CanvasForObject(a))
} }
_, canShare := page.mp.(mediaprovider.SupportsSharing)
a.shareMenuItem.Disabled = !canShare
pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(menuBtn) pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(menuBtn)
pop.ShowAtPosition(fyne.NewPos(pos.X, pos.Y+menuBtn.Size().Height)) pop.ShowAtPosition(fyne.NewPos(pos.X, pos.Y+menuBtn.Size().Height))
} }
+22 -18
View File
@@ -239,7 +239,7 @@ func (a *ArtistPage) showTopTracks() {
_, canRate := a.mp.(mediaprovider.SupportsRating) _, canRate := a.mp.(mediaprovider.SupportsRating)
_, canShare := a.mp.(mediaprovider.SupportsSharing) _, canShare := a.mp.(mediaprovider.SupportsSharing)
tl.Options.DisableRating = !canRate tl.Options.DisableRating = !canRate
tl.Options.HideSharing = !canShare tl.Options.DisableSharing = !canShare
tl.SetVisibleColumns(a.cfg.TracklistColumns) tl.SetVisibleColumns(a.cfg.TracklistColumns)
tl.SetSorting(a.trackSort) tl.SetSorting(a.trackSort)
tl.OnVisibleColumnsChanged = func(cols []string) { tl.OnVisibleColumnsChanged = func(cols []string) {
@@ -296,6 +296,7 @@ type ArtistPageHeader struct {
playRadioBtn *widget.Button playRadioBtn *widget.Button
menuBtn *widget.Button menuBtn *widget.Button
container *fyne.Container container *fyne.Container
shareMenuItem *fyne.MenuItem
} }
func NewArtistPageHeader(page *ArtistPage) *ArtistPageHeader { func NewArtistPageHeader(page *ArtistPage) *ArtistPageHeader {
@@ -322,23 +323,26 @@ func NewArtistPageHeader(page *ArtistPage) *ArtistPageHeader {
}) })
a.playRadioBtn = widget.NewButtonWithIcon("Play Artist Radio", myTheme.ShuffleIcon, a.artistPage.playArtistRadio) a.playRadioBtn = widget.NewButtonWithIcon("Play Artist Radio", myTheme.ShuffleIcon, a.artistPage.playArtistRadio)
_, canShare := a.artistPage.mp.(mediaprovider.SupportsSharing) // TODO: Uncomment when at least one media provider supports sharing artists.
if canShare { // a.shareMenuItem = fyne.NewMenuItem("Share...", func() {
var pop *widget.PopUpMenu // a.artistPage.contr.ShowShareDialog(a.artistID)
a.menuBtn = widget.NewButtonWithIcon("", theme.MoreHorizontalIcon(), nil) // })
a.menuBtn.OnTapped = func() { // a.shareMenuItem.Icon = myTheme.ShareIcon
if pop == nil { // var pop *widget.PopUpMenu
share := fyne.NewMenuItem("Share...", func() { // a.menuBtn = widget.NewButtonWithIcon("", theme.MoreHorizontalIcon(), nil)
a.artistPage.contr.ShowShareDialog(a.artistID) // a.menuBtn.OnTapped = func() {
}) // if pop == nil {
share.Icon = myTheme.ShareIcon // menu := fyne.NewMenu("", a.shareMenuItem)
menu := fyne.NewMenu("", share) // pop = widget.NewPopUpMenu(menu, fyne.CurrentApp().Driver().CanvasForObject(a))
pop = widget.NewPopUpMenu(menu, fyne.CurrentApp().Driver().CanvasForObject(a)) // }
} // pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(a.menuBtn)
pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(a.menuBtn) // pop.ShowAtPosition(fyne.NewPos(pos.X, pos.Y+a.menuBtn.Size().Height))
pop.ShowAtPosition(fyne.NewPos(pos.X, pos.Y+a.menuBtn.Size().Height)) // }
} // canShareArtists := false
} // if r, canShare := a.artistPage.mp.(mediaprovider.SupportsSharing); canShare {
// canShareArtists = r.CanShareArtists()
// }
// a.shareMenuItem.Disabled = !canShareArtists
a.biographyDisp.Wrapping = fyne.TextWrapWord a.biographyDisp.Wrapping = fyne.TextWrapWord
a.biographyDisp.Truncation = fyne.TextTruncateEllipsis a.biographyDisp.Truncation = fyne.TextTruncateEllipsis
+5
View File
@@ -86,6 +86,11 @@ func newArtistsPage(
} else { } else {
a.grid = widgets.NewFixedGridView(nil, a.im, myTheme.ArtistIcon) a.grid = widgets.NewFixedGridView(nil, a.im, myTheme.ArtistIcon)
} }
canShareArtists := false
if r, canShare := mp.(mediaprovider.SupportsSharing); canShare {
canShareArtists = r.CanShareArtists()
}
a.grid.DisableSharing = !canShareArtists
a.contr.ConnectArtistGridActions(a.grid) a.contr.ConnectArtistGridActions(a.grid)
searchVbox := container.NewVBox(layout.NewSpacer(), a.searcher, layout.NewSpacer()) searchVbox := container.NewVBox(layout.NewSpacer(), a.searcher, layout.NewSpacer())
+6 -1
View File
@@ -336,6 +336,11 @@ func (a *FavoritesPage) onShowFavoriteArtists() {
} else { } else {
a.artistGrid = widgets.NewFixedGridView(model, a.im, myTheme.ArtistIcon) a.artistGrid = widgets.NewFixedGridView(model, a.im, myTheme.ArtistIcon)
} }
canShareArtists := false
if r, canShare := a.mp.(mediaprovider.SupportsSharing); canShare {
canShareArtists = r.CanShareArtists()
}
a.artistGrid.DisableSharing = !canShareArtists
a.contr.ConnectArtistGridActions(a.artistGrid) a.contr.ConnectArtistGridActions(a.artistGrid)
a.container.Objects[0] = a.artistGrid a.container.Objects[0] = a.artistGrid
a.Refresh() a.Refresh()
@@ -397,7 +402,7 @@ func (a *FavoritesPage) onShowFavoriteSongs() {
_, canRate := a.mp.(mediaprovider.SupportsRating) _, canRate := a.mp.(mediaprovider.SupportsRating)
_, canShare := a.mp.(mediaprovider.SupportsSharing) _, canShare := a.mp.(mediaprovider.SupportsSharing)
tracklist.Options.DisableRating = !canRate tracklist.Options.DisableRating = !canRate
tracklist.Options.HideSharing = !canShare tracklist.Options.DisableSharing = !canShare
tracklist.SetVisibleColumns(a.cfg.TracklistColumns) tracklist.SetVisibleColumns(a.cfg.TracklistColumns)
tracklist.SetSorting(a.trackSort) tracklist.SetSorting(a.trackSort)
tracklist.OnVisibleColumnsChanged = func(cols []string) { tracklist.OnVisibleColumnsChanged = func(cols []string) {
+2
View File
@@ -112,6 +112,7 @@ func NewGridViewPage(
gp.ExtendBaseWidget(gp) gp.ExtendBaseWidget(gp)
gp.createTitleAndSort() gp.createTitleAndSort()
_, canShare := mp.(mediaprovider.SupportsSharing)
iter := adapter.Iter(gp.getSortOrder(), gp.getFilter()) iter := adapter.Iter(gp.getSortOrder(), gp.getFilter())
if g := pool.Obtain(util.WidgetTypeGridView); g != nil { if g := pool.Obtain(util.WidgetTypeGridView); g != nil {
gp.grid = g.(*widgets.GridView) gp.grid = g.(*widgets.GridView)
@@ -120,6 +121,7 @@ func NewGridViewPage(
} else { } else {
gp.grid = widgets.NewGridView(iter, im, adapter.PlaceholderResource()) gp.grid = widgets.NewGridView(iter, im, adapter.PlaceholderResource())
} }
gp.grid.DisableSharing = !canShare
adapter.ConnectGridActions(gp.grid) adapter.ConnectGridActions(gp.grid)
gp.createSearchAndFilter() gp.createSearchAndFilter()
gp.createContainer() gp.createContainer()
+11 -2
View File
@@ -48,6 +48,7 @@ type nowPlayingPageState struct {
pm *backend.PlaybackManager pm *backend.PlaybackManager
im *backend.ImageManager im *backend.ImageManager
canRate bool canRate bool
canShare bool
} }
func NewNowPlayingPage( func NewNowPlayingPage(
@@ -56,9 +57,10 @@ func NewNowPlayingPage(
im *backend.ImageManager, im *backend.ImageManager,
pm *backend.PlaybackManager, pm *backend.PlaybackManager,
canRate bool, canRate bool,
canShare bool,
) *NowPlayingPage { ) *NowPlayingPage {
a := &NowPlayingPage{nowPlayingPageState: nowPlayingPageState{ a := &NowPlayingPage{nowPlayingPageState: nowPlayingPageState{
contr: contr, pool: pool, im: im, pm: pm, canRate: canRate, contr: contr, pool: pool, im: im, pm: pm, canRate: canRate, canShare: canShare,
}} }}
a.ExtendBaseWidget(a) a.ExtendBaseWidget(a)
@@ -82,8 +84,15 @@ func NewNowPlayingPage(
} }
a.queueList = widgets.NewPlayQueueList(a.im) a.queueList = widgets.NewPlayQueueList(a.im)
a.queueList.DisableRating = !canRate
a.queueList.DisableSharing = !canShare
a.queueList.OnReorderTracks = a.doSetNewTrackOrder a.queueList.OnReorderTracks = a.doSetNewTrackOrder
a.queueList.OnDownload = contr.ShowDownloadDialog a.queueList.OnDownload = contr.ShowDownloadDialog
a.queueList.OnShare = func(tracks []*mediaprovider.Track) {
if len(tracks) > 0 {
a.contr.ShowShareDialog(tracks[0].ID)
}
}
a.queueList.OnAddToPlaylist = contr.DoAddTracksToPlaylistWorkflow a.queueList.OnAddToPlaylist = contr.DoAddTracksToPlaylistWorkflow
a.queueList.OnPlayTrackAt = func(tracknum int) { a.queueList.OnPlayTrackAt = func(tracknum int) {
_ = a.pm.PlayTrackAt(tracknum) _ = a.pm.PlayTrackAt(tracknum)
@@ -199,7 +208,7 @@ func (s *nowPlayingPageState) Restore() Page {
page.Reload() page.Reload()
return page return page
} }
return NewNowPlayingPage(s.contr, s.pool, s.im, s.pm, s.canRate) return NewNowPlayingPage(s.contr, s.pool, s.im, s.pm, s.canRate, s.canShare)
} }
var _ CanShowPlayTime = (*NowPlayingPage)(nil) var _ CanShowPlayTime = (*NowPlayingPage)(nil)
+1 -1
View File
@@ -92,7 +92,7 @@ func newPlaylistPage(
remove.Icon = theme.ContentClearIcon() remove.Icon = theme.ContentClearIcon()
a.tracklist.Options = widgets.TracklistOptions{ a.tracklist.Options = widgets.TracklistOptions{
DisableRating: !canRate, DisableRating: !canRate,
HideSharing: !canShare, DisableSharing: !canShare,
AuxiliaryMenuItems: []*fyne.MenuItem{ AuxiliaryMenuItems: []*fyne.MenuItem{
util.NewReorderTracksSubmenu(a.doSetNewTrackOrder), util.NewReorderTracksSubmenu(a.doSetNewTrackOrder),
remove, remove,
+3 -2
View File
@@ -31,6 +31,7 @@ func NewRouter(app *backend.App, controller *controller.Controller, nav Navigati
func (r Router) CreatePage(rte controller.Route) Page { func (r Router) CreatePage(rte controller.Route) Page {
_, canRate := r.App.ServerManager.Server.(mediaprovider.SupportsRating) _, canRate := r.App.ServerManager.Server.(mediaprovider.SupportsRating)
_, canShare := r.App.ServerManager.Server.(mediaprovider.SupportsSharing)
switch rte.Page { switch rte.Page {
case controller.Album: case controller.Album:
return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager, r.Controller) return NewAlbumPage(rte.Arg, &r.App.Config.AlbumPage, r.widgetPool, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager, r.Controller)
@@ -43,13 +44,13 @@ func (r Router) CreatePage(rte controller.Route) Page {
case controller.Favorites: case controller.Favorites:
return NewFavoritesPage(&r.App.Config.FavoritesPage, r.widgetPool, r.Controller, r.App.ServerManager.Server, r.App.PlaybackManager, r.App.ImageManager) return NewFavoritesPage(&r.App.Config.FavoritesPage, r.widgetPool, r.Controller, r.App.ServerManager.Server, r.App.PlaybackManager, r.App.ImageManager)
case controller.Fullscreen: case controller.Fullscreen:
return NewNowPlayingPage(r.Controller, r.widgetPool, r.App.ImageManager, r.App.PlaybackManager, canRate) return NewNowPlayingPage(r.Controller, r.widgetPool, r.App.ImageManager, r.App.PlaybackManager, canRate, canShare)
case controller.Genre: case controller.Genre:
return NewGenrePage(rte.Arg, r.widgetPool, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager) return NewGenrePage(rte.Arg, r.widgetPool, r.Controller, r.App.PlaybackManager, r.App.ServerManager.Server, r.App.ImageManager)
case controller.Genres: case controller.Genres:
return NewGenresPage(r.Controller, r.App.ServerManager.Server) return NewGenresPage(r.Controller, r.App.ServerManager.Server)
case controller.NowPlaying: case controller.NowPlaying:
return NewNowPlayingPage(r.Controller, r.widgetPool, r.App.ImageManager, r.App.PlaybackManager, canRate) return NewNowPlayingPage(r.Controller, r.widgetPool, r.App.ImageManager, r.App.PlaybackManager, canRate, canShare)
case controller.Playlist: case controller.Playlist:
return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, r.widgetPool, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager) return NewPlaylistPage(rte.Arg, &r.App.Config.PlaylistPage, r.widgetPool, r.Controller, r.App.ServerManager, r.App.PlaybackManager, r.App.ImageManager)
case controller.Playlists: case controller.Playlists:
+2 -2
View File
@@ -53,7 +53,7 @@ func NewTracksPage(contr *controller.Controller, conf *backend.TracksPageConfig,
t.tracklist.Options = widgets.TracklistOptions{ t.tracklist.Options = widgets.TracklistOptions{
DisableSorting: true, DisableSorting: true,
DisableRating: !t.canRate, DisableRating: !t.canRate,
HideSharing: !t.canShare, DisableSharing: !t.canShare,
AutoNumber: true, AutoNumber: true,
} }
t.tracklist.SetVisibleColumns(conf.TracklistColumns) t.tracklist.SetVisibleColumns(conf.TracklistColumns)
@@ -140,7 +140,7 @@ func (t *TracksPage) doSearch(query string) {
AutoNumber: true, AutoNumber: true,
DisableSorting: true, DisableSorting: true,
DisableRating: !t.canRate, DisableRating: !t.canRate,
HideSharing: !t.canShare, DisableSharing: !t.canShare,
} }
t.searchTracklist.SetVisibleColumns(t.conf.TracklistColumns) t.searchTracklist.SetVisibleColumns(t.conf.TracklistColumns)
t.searchTracklist.SetNowPlaying(t.nowPlayingID) t.searchTracklist.SetNowPlaying(t.nowPlayingID)
-8
View File
@@ -141,13 +141,9 @@ func (m *Controller) connectTracklistActionsWithReplayGainMode(tracklist *widget
m.ClosePopUpOnEscape(pop) m.ClosePopUpOnEscape(pop)
} }
tracklist.OnDownload = m.ShowDownloadDialog tracklist.OnDownload = m.ShowDownloadDialog
_, canShare := m.App.ServerManager.Server.(mediaprovider.SupportsSharing)
if canShare {
tracklist.OnShare = func(trackID string) { tracklist.OnShare = func(trackID string) {
go m.ShowShareDialog(trackID) go m.ShowShareDialog(trackID)
} }
}
} }
func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) { func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) {
@@ -183,13 +179,9 @@ func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) {
m.ShowDownloadDialog(album.Tracks, album.Name) m.ShowDownloadDialog(album.Tracks, album.Name)
}() }()
} }
_, canShare := m.App.ServerManager.Server.(mediaprovider.SupportsSharing)
if canShare {
grid.OnShare = func(albumID string) { grid.OnShare = func(albumID string) {
go m.ShowShareDialog(albumID) go m.ShowShareDialog(albumID)
} }
}
} }
func (m *Controller) ConnectArtistGridActions(grid *widgets.GridView) { func (m *Controller) ConnectArtistGridActions(grid *widgets.GridView) {
+7 -9
View File
@@ -79,6 +79,7 @@ type GridView struct {
itemForIndex map[int]*GridViewItem itemForIndex map[int]*GridViewItem
itemWidth float32 itemWidth float32
numColsCached int numColsCached int
shareMenuItem *fyne.MenuItem
} }
type GridViewState struct { type GridViewState struct {
@@ -89,6 +90,8 @@ type GridViewState struct {
highestShown int highestShown int
done bool done bool
DisableSharing bool
OnPlay func(id string, shuffle bool) OnPlay func(id string, shuffle bool)
OnAddToQueue func(id string) OnAddToQueue func(id string)
OnAddToPlaylist func(id string) OnAddToPlaylist func(id string)
@@ -408,19 +411,14 @@ func (g *GridView) showContextMenu(card *GridViewItem, pos fyne.Position) {
} }
}) })
download.Icon = theme.DownloadIcon() download.Icon = theme.DownloadIcon()
menuItems := []*fyne.MenuItem{play, shuffle, queue, playlist, download} g.shareMenuItem = fyne.NewMenuItem("Share...", func() {
if g.OnShare != nil {
share := fyne.NewMenuItem("Share...", func() {
g.OnShare(g.menuGridViewItemId) g.OnShare(g.menuGridViewItemId)
}) })
share.Icon = myTheme.ShareIcon g.shareMenuItem.Icon = myTheme.ShareIcon
menuItems = append(menuItems, share) g.menu = widget.NewPopUpMenu(fyne.NewMenu("", play, shuffle, queue, playlist, download, g.shareMenuItem),
}
g.menu = widget.NewPopUpMenu(fyne.NewMenu("", menuItems...),
fyne.CurrentApp().Driver().CanvasForObject(g)) fyne.CurrentApp().Driver().CanvasForObject(g))
} }
g.shareMenuItem.Disabled = g.DisableSharing
g.menu.ShowAtPosition(pos) g.menu.ShowAtPosition(pos)
} }
+11
View File
@@ -27,6 +27,7 @@ type PlayQueueList struct {
widget.BaseWidget widget.BaseWidget
DisableRating bool DisableRating bool
DisableSharing bool
// user action callbacks // user action callbacks
OnAddToPlaylist func(trackIDs []string) OnAddToPlaylist func(trackIDs []string)
@@ -34,6 +35,7 @@ type PlayQueueList struct {
OnSetRating func(trackIDs []string, rating int) OnSetRating func(trackIDs []string, rating int)
OnRemoveFromQueue func(trackIDs []string) OnRemoveFromQueue func(trackIDs []string)
OnDownload func(tracks []*mediaprovider.Track, downloadName string) OnDownload func(tracks []*mediaprovider.Track, downloadName string)
OnShare func(tracks []*mediaprovider.Track)
OnShowArtistPage func(artistID string) OnShowArtistPage func(artistID string)
OnPlayTrackAt func(idx int) OnPlayTrackAt func(idx int)
OnReorderTracks func(trackIDs []string, op sharedutil.TrackReorderOp) OnReorderTracks func(trackIDs []string, op sharedutil.TrackReorderOp)
@@ -41,6 +43,7 @@ type PlayQueueList struct {
list *FocusList list *FocusList
menu *widget.PopUpMenu menu *widget.PopUpMenu
ratingSubmenu *fyne.MenuItem ratingSubmenu *fyne.MenuItem
shareMenuItem *fyne.MenuItem
nowPlayingID string nowPlayingID string
colLayout *layouts.ColumnsLayout colLayout *layouts.ColumnsLayout
@@ -200,6 +203,12 @@ func (p *PlayQueueList) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
} }
}) })
download.Icon = theme.DownloadIcon() download.Icon = theme.DownloadIcon()
p.shareMenuItem = fyne.NewMenuItem("Share...", func() {
if p.OnShare != nil {
p.OnShare(p.selectedTracks())
}
})
p.shareMenuItem.Icon = myTheme.ShareIcon
favorite := fyne.NewMenuItem("Set favorite", func() { favorite := fyne.NewMenuItem("Set favorite", func() {
if p.OnSetFavorite != nil { if p.OnSetFavorite != nil {
p.OnSetFavorite(p.selectedTrackIDs(), true) p.OnSetFavorite(p.selectedTrackIDs(), true)
@@ -233,6 +242,7 @@ func (p *PlayQueueList) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
fyne.NewMenu("", fyne.NewMenu("",
playlist, playlist,
download, download,
p.shareMenuItem,
fyne.NewMenuItemSeparator(), fyne.NewMenuItemSeparator(),
favorite, favorite,
unfavorite, unfavorite,
@@ -245,6 +255,7 @@ func (p *PlayQueueList) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
) )
} }
p.ratingSubmenu.Disabled = p.DisableRating p.ratingSubmenu.Disabled = p.DisableRating
p.shareMenuItem.Disabled = p.DisableSharing || len(p.selectedTracks()) != 1
p.menu.ShowAtPosition(e.AbsolutePosition) p.menu.ShowAtPosition(e.AbsolutePosition)
} }
+5 -10
View File
@@ -73,8 +73,8 @@ type TracklistOptions struct {
// Disables the five star rating widget. // Disables the five star rating widget.
DisableRating bool DisableRating bool
// Hides the sharing option. // Disables the sharing option.
HideSharing bool DisableSharing bool
} }
type Tracklist struct { type Tracklist struct {
@@ -560,13 +560,11 @@ func (t *Tracklist) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
}) })
unfavorite.Icon = myTheme.NotFavoriteIcon unfavorite.Icon = myTheme.NotFavoriteIcon
t.ctxMenu.Items = append(t.ctxMenu.Items, playlist, download) t.ctxMenu.Items = append(t.ctxMenu.Items, playlist, download)
if !t.Options.HideSharing {
t.shareMenuItem = fyne.NewMenuItem("Share...", func() { t.shareMenuItem = fyne.NewMenuItem("Share...", func() {
t.onShare(t.selectedTracks()) t.onShare(t.selectedTracks())
}) })
t.shareMenuItem.Icon = myTheme.ShareIcon t.shareMenuItem.Icon = myTheme.ShareIcon
t.ctxMenu.Items = append(t.ctxMenu.Items, t.shareMenuItem) t.ctxMenu.Items = append(t.ctxMenu.Items, t.shareMenuItem)
}
t.ctxMenu.Items = append(t.ctxMenu.Items, fyne.NewMenuItemSeparator()) t.ctxMenu.Items = append(t.ctxMenu.Items, fyne.NewMenuItemSeparator())
t.ctxMenu.Items = append(t.ctxMenu.Items, favorite, unfavorite) t.ctxMenu.Items = append(t.ctxMenu.Items, favorite, unfavorite)
t.ratingSubmenu = util.NewRatingSubmenu(func(rating int) { t.ratingSubmenu = util.NewRatingSubmenu(func(rating int) {
@@ -579,9 +577,7 @@ func (t *Tracklist) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
} }
} }
t.ratingSubmenu.Disabled = t.Options.DisableRating t.ratingSubmenu.Disabled = t.Options.DisableRating
if t.shareMenuItem != nil { t.shareMenuItem.Disabled = t.Options.DisableSharing || len(t.selectedTracks()) != 1
t.shareMenuItem.Disabled = len(t.selectedTracks()) != 1
}
widget.ShowPopUpMenuAtPosition(t.ctxMenu, fyne.CurrentApp().Driver().CanvasForObject(t), e.AbsolutePosition) widget.ShowPopUpMenuAtPosition(t.ctxMenu, fyne.CurrentApp().Driver().CanvasForObject(t), e.AbsolutePosition)
} }
@@ -646,9 +642,8 @@ func (t *Tracklist) onDownload(tracks []*mediaprovider.Track, downloadName strin
func (t *Tracklist) onShare(tracks []*mediaprovider.Track) { func (t *Tracklist) onShare(tracks []*mediaprovider.Track) {
if t.OnShare != nil { if t.OnShare != nil {
selectedTrackIDs := t.SelectedTrackIDs() if len(tracks) > 0 {
if len(selectedTrackIDs) > 0 { t.OnShare(tracks[0].ID)
t.OnShare(selectedTrackIDs[0])
} }
} }
} }