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"),
-}
var ResStarOutlineSvg = &fyne.StaticResource{
StaticName: "star-outline.svg",
StaticContent: []byte(
@@ -100,6 +95,11 @@ var ResShuffleSvg = &fyne.StaticResource{
StaticContent: []byte(
"\n"),
}
+var ResUpdownarrowSvg = &fyne.StaticResource{
+ StaticName: "updownarrow.svg",
+ StaticContent: []byte(
+ "\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)
})