Fix #136: add context menu to album and playlist grid views
This commit is contained in:
+18
-6
@@ -58,14 +58,16 @@ type GridViewState struct {
|
||||
items []GridViewItemModel
|
||||
itemsMutex sync.RWMutex
|
||||
iter GridViewIterator
|
||||
imageFetcher ImageFetcher
|
||||
highestShown int
|
||||
fetching bool
|
||||
done bool
|
||||
|
||||
imageFetcher ImageFetcher
|
||||
OnPlay func(string)
|
||||
OnShowItemPage func(string)
|
||||
OnShowSecondaryPage func(string)
|
||||
OnPlay func(id string, shuffle bool)
|
||||
OnAddToQueue func(id string)
|
||||
OnAddToPlaylist func(id string)
|
||||
OnShowItemPage func(id string)
|
||||
OnShowSecondaryPage func(id string)
|
||||
|
||||
scrollPos float32
|
||||
}
|
||||
@@ -152,9 +154,14 @@ func (g *GridView) createGridWrapList() {
|
||||
// create func
|
||||
func() fyne.CanvasObject {
|
||||
card := NewGridViewItem()
|
||||
card.OnPlay = func() {
|
||||
card.OnPlay = func(shuffle bool) {
|
||||
if g.OnPlay != nil {
|
||||
g.OnPlay(card.ItemID())
|
||||
g.OnPlay(card.ItemID(), shuffle)
|
||||
}
|
||||
}
|
||||
card.OnAddToQueue = func() {
|
||||
if g.OnAddToQueue != nil {
|
||||
g.OnAddToQueue(card.ItemID())
|
||||
}
|
||||
}
|
||||
card.OnShowSecondaryPage = func() {
|
||||
@@ -167,6 +174,11 @@ func (g *GridView) createGridWrapList() {
|
||||
g.OnShowItemPage(card.ItemID())
|
||||
}
|
||||
}
|
||||
card.OnAddToPlaylist = func() {
|
||||
if g.OnAddToPlaylist != nil {
|
||||
g.OnAddToPlaylist(card.ItemID())
|
||||
}
|
||||
}
|
||||
return card
|
||||
},
|
||||
// update func
|
||||
|
||||
+53
-15
@@ -18,14 +18,16 @@ var _ fyne.Widget = (*GridViewItem)(nil)
|
||||
|
||||
var _ fyne.Widget = (*coverImage)(nil)
|
||||
var _ fyne.Tappable = (*coverImage)(nil)
|
||||
var _ fyne.SecondaryTappable = (*coverImage)(nil)
|
||||
|
||||
type coverImage struct {
|
||||
widget.BaseWidget
|
||||
|
||||
Im *canvas.Image
|
||||
playbtn *canvas.Image
|
||||
OnDoubleTapped func()
|
||||
OnTapped func()
|
||||
Im *canvas.Image
|
||||
playbtn *canvas.Image
|
||||
OnPlay func()
|
||||
OnShowPage func()
|
||||
OnShowContextMenu func(fyne.Position)
|
||||
}
|
||||
|
||||
func newCoverImage() *coverImage {
|
||||
@@ -51,13 +53,19 @@ func (c *coverImage) Cursor() desktop.Cursor {
|
||||
|
||||
func (c *coverImage) Tapped(e *fyne.PointEvent) {
|
||||
if isInside(c.center(), c.playbtn.Size().Height/2, e.Position) {
|
||||
if c.OnDoubleTapped != nil {
|
||||
c.OnDoubleTapped()
|
||||
if c.OnPlay != nil {
|
||||
c.OnPlay()
|
||||
}
|
||||
return
|
||||
}
|
||||
if c.OnTapped != nil {
|
||||
c.OnTapped()
|
||||
if c.OnShowPage != nil {
|
||||
c.OnShowPage()
|
||||
}
|
||||
}
|
||||
|
||||
func (c *coverImage) TappedSecondary(e *fyne.PointEvent) {
|
||||
if c.OnShowContextMenu != nil {
|
||||
c.OnShowContextMenu(e.AbsolutePosition)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,6 +124,7 @@ type GridViewItem struct {
|
||||
secondaryID string
|
||||
primaryText *CustomHyperlink
|
||||
secondaryText *CustomHyperlink
|
||||
menu *widget.PopUpMenu
|
||||
container *fyne.Container
|
||||
|
||||
// updated by GridView
|
||||
@@ -125,7 +134,9 @@ type GridViewItem struct {
|
||||
PrevID string
|
||||
ImgLoadCancel context.CancelFunc
|
||||
|
||||
OnPlay func()
|
||||
OnPlay func(shuffle bool)
|
||||
OnAddToQueue func()
|
||||
OnAddToPlaylist func()
|
||||
OnShowItemPage func()
|
||||
OnShowSecondaryPage func()
|
||||
}
|
||||
@@ -137,17 +148,14 @@ func NewGridViewItem() *GridViewItem {
|
||||
Cover: newCoverImage(),
|
||||
}
|
||||
g.ExtendBaseWidget(g)
|
||||
g.Cover.OnDoubleTapped = func() {
|
||||
if g.OnPlay != nil {
|
||||
g.OnPlay()
|
||||
}
|
||||
}
|
||||
g.Cover.OnPlay = func() { g.onPlay(false) }
|
||||
g.Cover.OnShowContextMenu = g.showContextMenu
|
||||
showItemFn := func() {
|
||||
if g.OnShowItemPage != nil {
|
||||
g.OnShowItemPage()
|
||||
}
|
||||
}
|
||||
g.Cover.OnTapped = showItemFn
|
||||
g.Cover.OnShowPage = showItemFn
|
||||
g.primaryText.OnTapped = showItemFn
|
||||
g.secondaryText.OnTapped = func() {
|
||||
if g.OnShowSecondaryPage != nil {
|
||||
@@ -166,6 +174,18 @@ 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.CurrentApp().Driver().CanvasForObject(g))
|
||||
}
|
||||
g.menu.ShowAtPosition(pos)
|
||||
}
|
||||
|
||||
func (g *GridViewItem) Update(model GridViewItemModel) {
|
||||
g.itemID = model.ID
|
||||
g.secondaryID = model.SecondaryID
|
||||
@@ -187,3 +207,21 @@ 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()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user