Refactor and temporarily disable sharing artists
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -141,14 +141,10 @@ 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) {
|
||||||
grid.OnAddToQueue = func(albumID string) {
|
grid.OnAddToQueue = func(albumID string) {
|
||||||
@@ -183,14 +179,10 @@ 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) {
|
||||||
grid.OnShowItemPage = func(id string) { m.NavigateTo(ArtistRoute(id)) }
|
grid.OnShowItemPage = func(id string) { m.NavigateTo(ArtistRoute(id)) }
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
@@ -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])
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user