package util import ( "fyne.io/fyne/v2" "fyne.io/fyne/v2/lang" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" myTheme "github.com/dweymouth/supersonic/ui/theme" ) type TrackContextMenu struct { ratingSubmenu *fyne.MenuItem shareMenuItem *fyne.MenuItem songRadioMenuItem *fyne.MenuItem infoMenuItem *fyne.MenuItem OnPlay func(shuffle bool) OnAddToQueue func(next bool) OnPlaySongRadio func() OnDownload func() OnAddToPlaylist func() OnShowInfo func() OnShare func() OnFavorite func(fav bool) OnSetRating func(rating int) menu *fyne.Menu } func NewTrackContextMenu(disablePlaybackMenu bool, auxItems []*fyne.MenuItem) *TrackContextMenu { tcm := &TrackContextMenu{} tcm.menu = fyne.NewMenu("") if !disablePlaybackMenu { play := fyne.NewMenuItem(lang.L("Play"), func() { if tcm.OnPlay != nil { tcm.OnPlay(false) } }) play.Icon = theme.MediaPlayIcon() shuffle := fyne.NewMenuItem(lang.L("Shuffle"), func() { if tcm.OnPlay != nil { tcm.OnPlay(true) } }) shuffle.Icon = myTheme.ShuffleIcon playNext := fyne.NewMenuItem(lang.L("Play next"), func() { if tcm.OnAddToQueue != nil { tcm.OnAddToQueue(true) } }) playNext.Icon = myTheme.PlayNextIcon add := fyne.NewMenuItem(lang.L("Add to queue"), func() { if tcm.OnAddToQueue != nil { tcm.OnAddToQueue(false) } }) add.Icon = theme.ContentAddIcon() tcm.songRadioMenuItem = fyne.NewMenuItem(lang.L("Play song radio"), func() { if tcm.OnPlaySongRadio != nil { tcm.OnPlaySongRadio() } }) tcm.songRadioMenuItem.Icon = myTheme.RadioIcon tcm.menu.Items = append(tcm.menu.Items, play, shuffle, playNext, add, tcm.songRadioMenuItem) } playlist := fyne.NewMenuItem(lang.L("Add to playlist")+"...", func() { if tcm.OnAddToPlaylist != nil { tcm.OnAddToPlaylist() } }) playlist.Icon = myTheme.PlaylistIcon download := fyne.NewMenuItem(lang.L("Download")+"...", func() { if tcm.OnDownload != nil { tcm.OnDownload() } }) download.Icon = theme.DownloadIcon() tcm.infoMenuItem = fyne.NewMenuItem(lang.L("Show info")+"...", func() { if tcm.OnShowInfo != nil { tcm.OnShowInfo() } }) tcm.infoMenuItem.Icon = theme.InfoIcon() favorite := fyne.NewMenuItem(lang.L("Set favorite"), func() { if tcm.OnFavorite != nil { tcm.OnFavorite(true) } }) favorite.Icon = myTheme.FavoriteIcon unfavorite := fyne.NewMenuItem(lang.L("Unset favorite"), func() { if tcm.OnFavorite != nil { tcm.OnFavorite(false) } }) unfavorite.Icon = myTheme.NotFavoriteIcon tcm.menu.Items = append(tcm.menu.Items, fyne.NewMenuItemSeparator(), playlist, download, tcm.infoMenuItem) tcm.shareMenuItem = fyne.NewMenuItem(lang.L("Share")+"...", func() { if tcm.OnShare != nil { tcm.OnShare() } }) tcm.shareMenuItem.Icon = myTheme.ShareIcon tcm.menu.Items = append(tcm.menu.Items, tcm.shareMenuItem) tcm.menu.Items = append(tcm.menu.Items, fyne.NewMenuItemSeparator()) tcm.menu.Items = append(tcm.menu.Items, favorite, unfavorite) tcm.ratingSubmenu = NewRatingSubmenu(func(rating int) { if tcm.OnSetRating != nil { tcm.OnSetRating(rating) } }) tcm.menu.Items = append(tcm.menu.Items, tcm.ratingSubmenu) if len(auxItems) > 0 { tcm.menu.Items = append(tcm.menu.Items, fyne.NewMenuItemSeparator()) tcm.menu.Items = append(tcm.menu.Items, auxItems...) } return tcm } func (tcm *TrackContextMenu) SetRatingDisabled(disabled bool) { tcm.ratingSubmenu.Disabled = disabled } func (tcm *TrackContextMenu) SetShareDisabled(disabled bool) { tcm.shareMenuItem.Disabled = disabled } func (tcm *TrackContextMenu) SetInfoDisabled(disabled bool) { tcm.infoMenuItem.Disabled = disabled } func (tcm *TrackContextMenu) ShowAtPosition(pos fyne.Position, canvas fyne.Canvas) { widget.ShowPopUpMenuAtPosition(tcm.menu, canvas, pos) }