diff --git a/ui/widgets/gridview.go b/ui/widgets/gridview.go index 36ada94..a60006c 100644 --- a/ui/widgets/gridview.go +++ b/ui/widgets/gridview.go @@ -75,7 +75,9 @@ type GridView struct { fetchCancel context.CancelFunc GridViewState - grid *xwidget.GridWrap + grid *xwidget.GridWrap + menu *widget.PopUpMenu + menuGridViewItemId string } type GridViewState struct { @@ -214,16 +216,7 @@ func (g *GridView) createGridWrap() { // create func func() fyne.CanvasObject { card := NewGridViewItem(g.Placeholder) - card.OnPlay = func(shuffle bool) { - if g.OnPlay != nil { - g.OnPlay(card.ItemID(), shuffle) - } - } - card.OnAddToQueue = func() { - if g.OnAddToQueue != nil { - g.OnAddToQueue(card.ItemID()) - } - } + card.OnPlay = func() { g.onPlay(card.ItemID(), false) } card.OnShowSecondaryPage = func() { if g.OnShowSecondaryPage != nil { g.OnShowSecondaryPage(card.SecondaryID()) @@ -234,15 +227,8 @@ func (g *GridView) createGridWrap() { g.OnShowItemPage(card.ItemID()) } } - card.OnAddToPlaylist = func() { - if g.OnAddToPlaylist != nil { - g.OnAddToPlaylist(card.ItemID()) - } - } - card.OnDownload = func() { - if g.OnDownload != nil { - g.OnDownload(card.ItemID()) - } + card.OnShowContextMenu = func(p fyne.Position) { + g.showContextMenu(card, p) } return card }, @@ -353,6 +339,38 @@ func (g *GridView) fetchMoreItems(count int) { }() } +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) + } + })), + fyne.CurrentApp().Driver().CanvasForObject(g)) + } + g.menu.ShowAtPosition(pos) +} + +func (g *GridView) onPlay(itemID string, shuffle bool) { + if g.OnPlay != nil { + g.OnPlay(itemID, false) + } +} + func (g *GridView) CreateRenderer() fyne.WidgetRenderer { return widget.NewSimpleRenderer(g.grid) } diff --git a/ui/widgets/gridviewitem.go b/ui/widgets/gridviewitem.go index 9d0ed83..01bacb0 100644 --- a/ui/widgets/gridviewitem.go +++ b/ui/widgets/gridviewitem.go @@ -136,7 +136,6 @@ type GridViewItem struct { secondaryID string primaryText *CustomHyperlink secondaryText *CustomHyperlink - menu *widget.PopUpMenu container *fyne.Container // updated by GridView @@ -146,10 +145,8 @@ type GridViewItem struct { PrevID string ImgLoadCancel context.CancelFunc - OnPlay func(shuffle bool) - OnAddToQueue func() - OnAddToPlaylist func() - OnDownload func() + OnPlay func() + OnShowContextMenu func(fyne.Position) OnShowItemPage func() OnShowSecondaryPage func() } @@ -162,8 +159,16 @@ func NewGridViewItem(placeholderResource fyne.Resource) *GridViewItem { } g.primaryText.SetTextStyle(fyne.TextStyle{Bold: true}) g.ExtendBaseWidget(g) - g.Cover.OnPlay = func() { g.onPlay(false) } - g.Cover.OnShowContextMenu = g.showContextMenu + g.Cover.OnPlay = func() { + if g.OnPlay != nil { + g.OnPlay() + } + } + g.Cover.OnShowContextMenu = func(pos fyne.Position) { + if g.OnShowContextMenu != nil { + g.OnShowContextMenu(pos) + } + } showItemFn := func() { if g.OnShowItemPage != nil { g.OnShowItemPage() @@ -188,19 +193,6 @@ func (g *GridViewItem) createContainer() { g.container = container.New(pad, c) } -func (g *GridViewItem) showContextMenu(pos fyne.Position) { - if g.menu == nil { - g.menu = widget.NewPopUpMenu(fyne.NewMenu("", - fyne.NewMenuItem("Play", func() { g.onPlay(false) }), - fyne.NewMenuItem("Shuffle", func() { g.onPlay(true) }), - fyne.NewMenuItem("Add to queue", g.onAddToQueue), - fyne.NewMenuItem("Add to playlist...", g.onAddToPlaylist), - fyne.NewMenuItem("Download...", g.onDownload)), - fyne.CurrentApp().Driver().CanvasForObject(g)) - } - g.menu.ShowAtPosition(pos) -} - func (g *GridViewItem) Update(model GridViewItemModel) { g.itemID = model.ID g.secondaryID = model.SecondaryID @@ -226,27 +218,3 @@ func (g *GridViewItem) SecondaryID() string { func (g *GridViewItem) CreateRenderer() fyne.WidgetRenderer { return widget.NewSimpleRenderer(g.container) } - -func (g *GridViewItem) onPlay(shuffle bool) { - if g.OnPlay != nil { - g.OnPlay(shuffle) - } -} - -func (g *GridViewItem) onAddToQueue() { - if g.OnAddToQueue != nil { - g.OnAddToQueue() - } -} - -func (g *GridViewItem) onAddToPlaylist() { - if g.OnAddToPlaylist != nil { - g.OnAddToPlaylist() - } -} - -func (g *GridViewItem) onDownload() { - if g.OnDownload != nil { - g.OnDownload() - } -}