diff --git a/res/bundled.go b/res/bundled.go index 4846850..87e5d94 100644 --- a/res/bundled.go +++ b/res/bundled.go @@ -50,11 +50,6 @@ var ResPlaylistSvg = &fyne.StaticResource{ StaticContent: []byte( "\n"), } -var ResShuffleInvertSvg = &fyne.StaticResource{ - StaticName: "shuffle-invert.svg", - StaticContent: []byte( - "\n\n\n\r\n\r\n\r \n\r"), -} var ResStarOutlineSvg = &fyne.StaticResource{ StaticName: "star-outline.svg", StaticContent: []byte( @@ -100,6 +95,11 @@ var ResShuffleSvg = &fyne.StaticResource{ StaticContent: []byte( "\n\n \n \n \n \n"), } +var ResUpdownarrowSvg = &fyne.StaticResource{ + StaticName: "updownarrow.svg", + StaticContent: []byte( + "\n\n\n \n \n \n \n\n"), +} var ResDefaultToml = &fyne.StaticResource{ StaticName: "default.toml", StaticContent: []byte( diff --git a/res/bundled_gen.sh b/res/bundled_gen.sh index 17b13bd..633d175 100755 --- a/res/bundled_gen.sh +++ b/res/bundled_gen.sh @@ -9,7 +9,6 @@ fyne bundle -append -prefix Res icons/publicdomain/heart-outline.svg >> bundled. fyne bundle -append -prefix Res icons/publicdomain/musicnotes.svg >> bundled.go fyne bundle -append -prefix Res icons/publicdomain/people.svg >> bundled.go fyne bundle -append -prefix Res icons/publicdomain/playlist.svg >> bundled.go -fyne bundle -append -prefix Res icons/publicdomain/shuffle-invert.svg >> bundled.go fyne bundle -append -prefix Res icons/publicdomain/star-outline.svg >> bundled.go fyne bundle -append -prefix Res icons/publicdomain/star-filled.svg >> bundled.go fyne bundle -append -prefix Res icons/publicdomain/theatermasks.svg >> bundled.go @@ -19,6 +18,7 @@ fyne bundle -append -prefix Res icons/publicdomain/filter.svg >> bundled.go fyne bundle -append -prefix Res icons/remix_design/repeat.svg >> bundled.go fyne bundle -append -prefix Res icons/remix_design/repeatone.svg >> bundled.go fyne bundle -append -prefix Res icons/remix_design/shuffle.svg >> bundled.go +fyne bundle -append -prefix Res icons/remix_design/updownarrow.svg >> bundled.go fyne bundle -append -prefix Res themes/default.toml >> bundled.go diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index eb9cb56..3d1ffa5 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -223,20 +223,24 @@ func NewAlbumPageHeader(page *AlbumPage) *AlbumPageHeader { menuBtn := widget.NewButtonWithIcon("", theme.MoreHorizontalIcon(), nil) menuBtn.OnTapped = func() { if pop == nil { - menu := fyne.NewMenu("", - fyne.NewMenuItem("Add to queue", func() { - go a.page.pm.LoadAlbum(a.albumID, true /*append*/, false /*shuffle*/) - }), - fyne.NewMenuItem("Add to playlist...", func() { - a.page.contr.DoAddTracksToPlaylistWorkflow( - sharedutil.TracksToIDs(a.page.tracks)) - }), - fyne.NewMenuItem("Download...", func() { - a.page.contr.ShowDownloadDialog(a.page.tracks, a.titleLabel.String()) - }), - fyne.NewMenuItem("Show Info...", func() { - a.page.contr.ShowAlbumInfoDialog(a.albumID, a.titleLabel.String(), a.cover.Image()) - })) + queue := fyne.NewMenuItem("Add to queue", func() { + go a.page.pm.LoadAlbum(a.albumID, true /*append*/, false /*shuffle*/) + }) + queue.Icon = theme.ContentAddIcon() + playlist := fyne.NewMenuItem("Add to playlist...", func() { + a.page.contr.DoAddTracksToPlaylistWorkflow( + sharedutil.TracksToIDs(a.page.tracks)) + }) + playlist.Icon = myTheme.PlaylistIcon + download := fyne.NewMenuItem("Download...", func() { + a.page.contr.ShowDownloadDialog(a.page.tracks, a.titleLabel.String()) + }) + download.Icon = theme.DownloadIcon() + info := fyne.NewMenuItem("Show Info...", func() { + a.page.contr.ShowAlbumInfoDialog(a.albumID, a.titleLabel.String(), a.cover.Image()) + }) + info.Icon = theme.InfoIcon() + menu := fyne.NewMenu("", queue, playlist, download, info) pop = widget.NewPopUpMenu(menu, fyne.CurrentApp().Driver().CanvasForObject(a)) } pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(menuBtn) diff --git a/ui/browsing/nowplayingpage.go b/ui/browsing/nowplayingpage.go index 92d039d..1f62fc8 100644 --- a/ui/browsing/nowplayingpage.go +++ b/ui/browsing/nowplayingpage.go @@ -72,13 +72,15 @@ func NewNowPlayingPage( a.tracklist.OnVisibleColumnsChanged = func(cols []string) { a.conf.TracklistColumns = cols } + remove := fyne.NewMenuItem("Remove from queue", a.onRemoveSelectedFromQueue) + remove.Icon = theme.ContentRemoveIcon() a.tracklist.Options = widgets.TracklistOptions{ AutoNumber: true, DisablePlaybackMenu: true, DisableRating: !canRate, AuxiliaryMenuItems: []*fyne.MenuItem{ util.NewReorderTracksSubmenu(a.doSetNewTrackOrder), - fyne.NewMenuItem("Remove from queue", a.onRemoveSelectedFromQueue), + remove, }, } contr.ConnectTracklistActions(a.tracklist) diff --git a/ui/browsing/playlistpage.go b/ui/browsing/playlistpage.go index c9df1a2..898228d 100644 --- a/ui/browsing/playlistpage.go +++ b/ui/browsing/playlistpage.go @@ -87,11 +87,13 @@ func newPlaylistPage( conf.TracklistColumns = cols } _, canRate := a.sm.Server.(mediaprovider.SupportsRating) + remove := fyne.NewMenuItem("Remove from playlist", a.onRemoveSelectedFromPlaylist) + remove.Icon = theme.ContentClearIcon() a.tracklist.Options = widgets.TracklistOptions{ DisableRating: !canRate, AuxiliaryMenuItems: []*fyne.MenuItem{ util.NewReorderTracksSubmenu(a.doSetNewTrackOrder), - fyne.NewMenuItem("Remove from playlist", a.onRemoveSelectedFromPlaylist), + remove, }, } // connect tracklist actions @@ -256,20 +258,20 @@ func NewPlaylistPageHeader(page *PlaylistPage) *PlaylistPageHeader { menuBtn := widget.NewButtonWithIcon("", theme.MoreHorizontalIcon(), nil) menuBtn.OnTapped = func() { if pop == nil { - menu := fyne.NewMenu("", - fyne.NewMenuItem("Add to queue", func() { - a.page.pm.LoadPlaylist(a.page.playlistID, true /*append*/, false /*shuffle*/) - }), - fyne.NewMenuItem("Add to playlist...", func() { - a.page.contr.DoAddTracksToPlaylistWorkflow( - sharedutil.TracksToIDs(a.page.tracks)) - }), - fyne.NewMenuItem("Download...", func() { - if a.playlistInfo == nil { - return - } - a.page.contr.ShowDownloadDialog(a.page.tracks, a.playlistInfo.Name) - })) + queue := fyne.NewMenuItem("Add to queue", func() { + go a.page.pm.LoadPlaylist(a.page.playlistID, true /*append*/, false /*shuffle*/) + }) + queue.Icon = theme.ContentAddIcon() + playlist := fyne.NewMenuItem("Add to playlist...", func() { + a.page.contr.DoAddTracksToPlaylistWorkflow( + sharedutil.TracksToIDs(a.page.tracks)) + }) + playlist.Icon = myTheme.PlaylistIcon + download := fyne.NewMenuItem("Download...", func() { + a.page.contr.ShowDownloadDialog(a.page.tracks, a.titleLabel.String()) + }) + download.Icon = theme.DownloadIcon() + menu := fyne.NewMenu("", queue, playlist, download) pop = widget.NewPopUpMenu(menu, fyne.CurrentApp().Driver().CanvasForObject(a)) } pos := fyne.CurrentApp().Driver().AbsolutePositionForObject(menuBtn) diff --git a/ui/theme/theme.go b/ui/theme/theme.go index 6413a80..e5c6d1a 100644 --- a/ui/theme/theme.go +++ b/ui/theme/theme.go @@ -37,6 +37,7 @@ var ( FilterIcon fyne.Resource = theme.NewThemedResource(res.ResFilterSvg) RepeatIcon fyne.Resource = theme.NewThemedResource(res.ResRepeatSvg) RepeatOneIcon fyne.Resource = theme.NewThemedResource(res.ResRepeatoneSvg) + SortIcon fyne.Resource = theme.NewThemedResource(res.ResUpdownarrowSvg) ) type AppearanceMode string diff --git a/ui/util/util.go b/ui/util/util.go index 070491b..81e90ad 100644 --- a/ui/util/util.go +++ b/ui/util/util.go @@ -15,6 +15,7 @@ import ( "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "github.com/dweymouth/supersonic/backend/mediaprovider" + "github.com/dweymouth/supersonic/res" "github.com/dweymouth/supersonic/sharedutil" "github.com/dweymouth/supersonic/ui/layouts" myTheme "github.com/dweymouth/supersonic/ui/theme" @@ -170,6 +171,7 @@ func NewRatingSubmenu(onSetRating func(int)) *fyne.MenuItem { }) } ratingMenu := fyne.NewMenuItem("Set rating", nil) + ratingMenu.Icon = theme.NewThemedResource(res.ResStarOutlineSvg) ratingMenu.ChildMenu = fyne.NewMenu("", []*fyne.MenuItem{ newRatingMenuItem(0), newRatingMenuItem(1), @@ -183,6 +185,7 @@ func NewRatingSubmenu(onSetRating func(int)) *fyne.MenuItem { func NewReorderTracksSubmenu(onReorderTracks func(sharedutil.TrackReorderOp)) *fyne.MenuItem { reorderMenu := fyne.NewMenuItem("Reorder tracks", nil) + reorderMenu.Icon = myTheme.SortIcon reorderMenu.ChildMenu = fyne.NewMenu("", []*fyne.MenuItem{ fyne.NewMenuItem("Move to top", func() { onReorderTracks(sharedutil.MoveToTop) }), fyne.NewMenuItem("Move up", func() { onReorderTracks(sharedutil.MoveUp) }), diff --git a/ui/widgets/gridview.go b/ui/widgets/gridview.go index 01f1f6f..9f81ae7 100644 --- a/ui/widgets/gridview.go +++ b/ui/widgets/gridview.go @@ -6,9 +6,11 @@ import ( "github.com/dweymouth/supersonic/backend/mediaprovider" "github.com/dweymouth/supersonic/sharedutil" + myTheme "github.com/dweymouth/supersonic/ui/theme" "github.com/dweymouth/supersonic/ui/util" "fyne.io/fyne/v2" + "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" ) @@ -311,24 +313,30 @@ func (g *GridView) cancelFetch() { func (g *GridView) showContextMenu(card *GridViewItem, pos fyne.Position) { g.menuGridViewItemId = card.ItemID() if g.menu == nil { - g.menu = widget.NewPopUpMenu(fyne.NewMenu("", - fyne.NewMenuItem("Play", func() { g.onPlay(g.menuGridViewItemId, false) }), - fyne.NewMenuItem("Shuffle", func() { g.onPlay(g.menuGridViewItemId, true) }), - fyne.NewMenuItem("Add to queue", func() { - if g.OnAddToQueue != nil { - g.OnAddToQueue(g.menuGridViewItemId) - } - }), - fyne.NewMenuItem("Add to playlist...", func() { - if g.OnAddToPlaylist != nil { - g.OnAddToPlaylist(g.menuGridViewItemId) - } - }), - fyne.NewMenuItem("Download...", func() { - if g.OnDownload != nil { - g.OnDownload(g.menuGridViewItemId) - } - })), + play := fyne.NewMenuItem("Play", func() { g.onPlay(g.menuGridViewItemId, false) }) + play.Icon = theme.MediaPlayIcon() + shuffle := fyne.NewMenuItem("Shuffle", func() { g.onPlay(g.menuGridViewItemId, true) }) + shuffle.Icon = myTheme.ShuffleIcon + queue := fyne.NewMenuItem("Add to queue", func() { + if g.OnAddToQueue != nil { + g.OnAddToQueue(g.menuGridViewItemId) + } + }) + queue.Icon = theme.ContentAddIcon() + playlist := fyne.NewMenuItem("Add to playlist...", func() { + if g.OnAddToPlaylist != nil { + g.OnAddToPlaylist(g.menuGridViewItemId) + } + }) + playlist.Icon = myTheme.PlaylistIcon + download := fyne.NewMenuItem("Download...", func() { + if g.OnDownload != nil { + g.OnDownload(g.menuGridViewItemId) + } + }) + download.Icon = theme.DownloadIcon() + + g.menu = widget.NewPopUpMenu(fyne.NewMenu("", play, shuffle, queue, playlist, download), fyne.CurrentApp().Driver().CanvasForObject(g)) } g.menu.ShowAtPosition(pos) diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index 42595fe..ec3634d 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -4,6 +4,7 @@ import ( "image" "github.com/dweymouth/supersonic/ui/layouts" + myTheme "github.com/dweymouth/supersonic/ui/theme" "github.com/dweymouth/supersonic/ui/util" "fyne.io/fyne/v2" @@ -129,11 +130,14 @@ func (n *NowPlayingCard) Update(track string, artists, artistIDs []string, album func (n *NowPlayingCard) showMenu(e *fyne.PointEvent) { if n.menu == nil { n.ratingMenu = util.NewRatingSubmenu(n.onSetRating) - m := fyne.NewMenu("", - fyne.NewMenuItem("Set favorite", func() { n.onSetFavorite(true) }), - fyne.NewMenuItem("Unset favorite", func() { n.onSetFavorite(false) }), - n.ratingMenu, - fyne.NewMenuItem("Add to playlist...", func() { n.onAddToPlaylist() })) + favorite := fyne.NewMenuItem("Set favorite", func() { n.onSetFavorite(true) }) + favorite.Icon = myTheme.FavoriteIcon + unfavorite := fyne.NewMenuItem("Unset favorite", func() { n.onSetFavorite(false) }) + unfavorite.Icon = myTheme.NotFavoriteIcon + playlist := fyne.NewMenuItem("Add to playlist...", func() { n.onAddToPlaylist() }) + playlist.Icon = myTheme.PlaylistIcon + + m := fyne.NewMenu("", favorite, unfavorite, n.ratingMenu, playlist) n.menu = widget.NewPopUpMenu(m, fyne.CurrentApp().Driver().CanvasForObject(n)) } n.ratingMenu.Disabled = n.DisableRating diff --git a/ui/widgets/tracklist.go b/ui/widgets/tracklist.go index e5a2a34..9e4f6f8 100644 --- a/ui/widgets/tracklist.go +++ b/ui/widgets/tracklist.go @@ -534,44 +534,48 @@ func (t *Tracklist) onShowContextMenu(e *fyne.PointEvent, trackIdx int) { if t.ctxMenu == nil { t.ctxMenu = fyne.NewMenu("") if !t.Options.DisablePlaybackMenu { - t.ctxMenu.Items = append(t.ctxMenu.Items, - fyne.NewMenuItem("Play", func() { - if t.OnPlaySelection != nil { - t.OnPlaySelection(t.selectedTracks(), false) - } - })) - t.ctxMenu.Items = append(t.ctxMenu.Items, - fyne.NewMenuItem("Shuffle", func() { - if t.OnPlaySelection != nil { - t.OnPlaySelection(t.selectedTracks(), true) - } - })) - t.ctxMenu.Items = append(t.ctxMenu.Items, - fyne.NewMenuItem("Add to queue", func() { - if t.OnPlaySelection != nil { - t.OnAddToQueue(t.selectedTracks()) - } - })) - } - t.ctxMenu.Items = append(t.ctxMenu.Items, - fyne.NewMenuItem("Add to playlist...", func() { - if t.OnAddToPlaylist != nil { - t.OnAddToPlaylist(t.SelectedTrackIDs()) + play := fyne.NewMenuItem("Play", func() { + if t.OnPlaySelection != nil { + t.OnPlaySelection(t.selectedTracks(), false) } - })) - t.ctxMenu.Items = append(t.ctxMenu.Items, - fyne.NewMenuItem("Download...", func() { - t.onDownload(t.selectedTracks(), "Selected tracks") - })) + }) + play.Icon = theme.MediaPlayIcon() + shuffle := fyne.NewMenuItem("Shuffle", func() { + if t.OnPlaySelection != nil { + t.OnPlaySelection(t.selectedTracks(), true) + } + }) + shuffle.Icon = myTheme.ShuffleIcon + add := fyne.NewMenuItem("Add to queue", func() { + if t.OnPlaySelection != nil { + t.OnAddToQueue(t.selectedTracks()) + } + }) + add.Icon = theme.ContentAddIcon() + t.ctxMenu.Items = append(t.ctxMenu.Items, + play, shuffle, add) + } + playlist := fyne.NewMenuItem("Add to playlist...", func() { + if t.OnAddToPlaylist != nil { + t.OnAddToPlaylist(t.SelectedTrackIDs()) + } + }) + playlist.Icon = myTheme.PlaylistIcon + download := fyne.NewMenuItem("Download...", func() { + t.onDownload(t.selectedTracks(), "Selected tracks") + }) + download.Icon = theme.DownloadIcon() + favorite := fyne.NewMenuItem("Set favorite", func() { + t.onSetFavorites(t.selectedTracks(), true, true) + }) + favorite.Icon = myTheme.FavoriteIcon + unfavorite := fyne.NewMenuItem("Unset favorite", func() { + t.onSetFavorites(t.selectedTracks(), false, true) + }) + unfavorite.Icon = myTheme.NotFavoriteIcon + t.ctxMenu.Items = append(t.ctxMenu.Items, playlist, download) t.ctxMenu.Items = append(t.ctxMenu.Items, fyne.NewMenuItemSeparator()) - t.ctxMenu.Items = append(t.ctxMenu.Items, - fyne.NewMenuItem("Set favorite", func() { - t.onSetFavorites(t.selectedTracks(), true, true) - })) - t.ctxMenu.Items = append(t.ctxMenu.Items, - fyne.NewMenuItem("Unset favorite", func() { - t.onSetFavorites(t.selectedTracks(), false, true) - })) + t.ctxMenu.Items = append(t.ctxMenu.Items, favorite, unfavorite) t.ratingSubmenu = util.NewRatingSubmenu(func(rating int) { t.onSetRatings(t.selectedTracks(), rating, true) })