add context menu to cover thumbnail in bottom panel

This commit is contained in:
Drew Weymouth
2023-05-08 09:10:43 -07:00
parent f7b31e1514
commit 3e448ed995
6 changed files with 96 additions and 34 deletions
+37
View File
@@ -4,6 +4,7 @@ import (
"image"
"github.com/dweymouth/supersonic/ui/layouts"
"github.com/dweymouth/supersonic/ui/util"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
@@ -20,8 +21,12 @@ type NowPlayingCard struct {
artistName *CustomHyperlink
albumName *CustomHyperlink
cover *TappableImage
menu *widget.PopUpMenu
OnShowCoverImage func()
OnSetRating func(rating int)
OnSetFavorite func(favorite bool)
OnAddToPlaylist func()
c fyne.CanvasObject
}
@@ -34,6 +39,7 @@ func NewNowPlayingCard() *NowPlayingCard {
}
n.ExtendBaseWidget(n)
n.cover = NewTappableImage(n.onShowCoverImage)
n.cover.OnTappedSecondary = n.showMenu
n.trackName.Hidden = true
n.artistName.Hidden = true
n.albumName.Hidden = true
@@ -55,6 +61,24 @@ func (n *NowPlayingCard) onShowCoverImage() {
}
}
func (n *NowPlayingCard) onSetFavorite(fav bool) {
if n.OnSetFavorite != nil {
n.OnSetFavorite(fav)
}
}
func (n *NowPlayingCard) onSetRating(rating int) {
if n.OnSetRating != nil {
n.OnSetRating(rating)
}
}
func (n *NowPlayingCard) onAddToPlaylist() {
if n.OnAddToPlaylist != nil {
n.OnAddToPlaylist()
}
}
func (n *NowPlayingCard) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(n.c)
}
@@ -82,3 +106,16 @@ func (n *NowPlayingCard) OnAlbumNameTapped(f func()) {
func (n *NowPlayingCard) OnTrackNameTapped(f func()) {
n.trackName.OnTapped = f
}
func (n *NowPlayingCard) showMenu(pos fyne.Position) {
if n.menu == nil {
ratingMenu := util.NewRatingSubmenu(n.onSetRating)
m := fyne.NewMenu("",
fyne.NewMenuItem("Set favorite", func() { n.onSetFavorite(true) }),
fyne.NewMenuItem("Unset favorite", func() { n.onSetFavorite(false) }),
ratingMenu,
fyne.NewMenuItem("Add to playlist...", func() { n.onAddToPlaylist() }))
n.menu = widget.NewPopUpMenu(m, fyne.CurrentApp().Driver().CanvasForObject(n))
}
n.menu.ShowAtPosition(pos)
}
+9 -2
View File
@@ -50,7 +50,8 @@ type TappableImage struct {
widget.BaseWidget
canvas.Image
OnTapped func()
OnTapped func()
OnTappedSecondary func(pos fyne.Position)
}
func NewTappableImage(onTapped func()) *TappableImage {
@@ -86,12 +87,18 @@ func (t *TappableImage) Cursor() desktop.Cursor {
return desktop.DefaultCursor
}
func (t *TappableImage) Tapped(e *fyne.PointEvent) {
func (t *TappableImage) Tapped(_ *fyne.PointEvent) {
if t.haveImage() && t.OnTapped != nil {
t.OnTapped()
}
}
func (t *TappableImage) TappedSecondary(e *fyne.PointEvent) {
if t.haveImage() && t.OnTappedSecondary != nil {
t.OnTappedSecondary(e.AbsolutePosition)
}
}
func (t *TappableImage) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(&t.Image)
}
+3 -19
View File
@@ -308,15 +308,9 @@ func (t *Tracklist) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
fyne.NewMenuItem("Unset favorite", func() {
t.onSetFavorites(t.selectedTracks(), false, true)
}))
ratingMenu := fyne.NewMenuItem("Set rating", nil)
ratingMenu.ChildMenu = fyne.NewMenu("", []*fyne.MenuItem{
t.newRatingMenuItem(0),
t.newRatingMenuItem(1),
t.newRatingMenuItem(2),
t.newRatingMenuItem(3),
t.newRatingMenuItem(4),
t.newRatingMenuItem(5),
}...)
ratingMenu := util.NewRatingSubmenu(func(rating int) {
t.onSetRatings(t.selectedTracks(), rating, true)
})
t.ctxMenu.Items = append(t.ctxMenu.Items, ratingMenu)
if len(t.AuxiliaryMenuItems) > 0 {
t.ctxMenu.Items = append(t.ctxMenu.Items, fyne.NewMenuItemSeparator())
@@ -326,16 +320,6 @@ func (t *Tracklist) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
widget.ShowPopUpMenuAtPosition(t.ctxMenu, fyne.CurrentApp().Driver().CanvasForObject(t), e.AbsolutePosition)
}
func (t *Tracklist) newRatingMenuItem(rating int) *fyne.MenuItem {
label := "(none)"
if rating > 0 {
label = strconv.Itoa(rating)
}
return fyne.NewMenuItem(label, func() {
t.onSetRatings(t.selectedTracks(), rating, true)
})
}
func (t *Tracklist) onSetFavorite(trackID string, fav bool) {
t.tracksMutex.RLock()
tr := sharedutil.FindTrackByID(trackID, t.Tracks)