switch album card behavior to play on double-tap

This commit is contained in:
Drew Weymouth
2022-12-24 10:54:16 -08:00
parent 024557d49e
commit 3b3927bfda
2 changed files with 50 additions and 28 deletions
+49 -26
View File
@@ -3,35 +3,58 @@ package ui
import ( import (
"context" "context"
"image" "image"
"log"
"supersonic/ui/layout" "supersonic/ui/layout"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas" "fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/driver/desktop"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/dweymouth/go-subsonic" "github.com/dweymouth/go-subsonic"
) )
var _ fyne.Widget = (*AlbumCard)(nil) var _ fyne.Widget = (*AlbumCard)(nil)
var _ fyne.Tappable = (*TappableImage)(nil) var _ fyne.Widget = (*albumCover)(nil)
var _ fyne.Tappable = (*albumCover)(nil)
var _ fyne.DoubleTappable = (*albumCover)(nil)
type TappableImage struct { type albumCover struct {
im *canvas.Image widget.BaseWidget
onTapped func() Im *canvas.Image
OnDoubleTapped func()
OnTapped func()
} }
func (t *TappableImage) Tapped(*fyne.PointEvent) { func newAlbumCover() *albumCover {
log.Println("tapped!") a := &albumCover{}
t.onTapped() a.ExtendBaseWidget(a)
a.Im = &canvas.Image{FillMode: canvas.ImageFillContain}
a.Im.SetMinSize(fyne.NewSize(200, 200))
return a
} }
func (t *TappableImage) SetImage(im image.Image) { func (a *albumCover) CreateRenderer() fyne.WidgetRenderer {
t.im.Image = im return widget.NewSimpleRenderer(a.Im)
t.im.Refresh() }
func (a *albumCover) DoubleTapped(e *fyne.PointEvent) {
if a.OnDoubleTapped != nil {
a.OnDoubleTapped()
}
}
func (a *albumCover) Tapped(e *fyne.PointEvent) {
if a.OnTapped != nil {
a.OnTapped()
}
}
func (a *albumCover) SetImage(im image.Image) {
a.Im.Image = im
a.Refresh()
} }
type AlbumCard struct { type AlbumCard struct {
@@ -43,29 +66,36 @@ type AlbumCard struct {
container *fyne.Container container *fyne.Container
// updated by AlbumGrid // updated by AlbumGrid
Cover *TappableImage Cover *albumCover
// these fields are used by AlbumGrid to track async update tasks // these fields are used by AlbumGrid to track async update tasks
PrevAlbumID string PrevAlbumID string
ImgLoadCancel context.CancelFunc ImgLoadCancel context.CancelFunc
OnTapped func() OnPlay func()
} }
func (a *AlbumCard) MouseIn(*desktop.MouseEvent) {}
func (a *AlbumCard) MouseOut() {}
func (a *AlbumCard) MouseMoved(*desktop.MouseEvent) {}
func NewAlbumCard() *AlbumCard { func NewAlbumCard() *AlbumCard {
a := &AlbumCard{ a := &AlbumCard{
title: widget.NewLabel(""), title: widget.NewLabel(""),
artist: widget.NewLabel(""), artist: widget.NewLabel(""),
Cover: &TappableImage{ Cover: newAlbumCover(),
im: &canvas.Image{},
},
} }
a.ExtendBaseWidget(a) a.ExtendBaseWidget(a)
a.Cover.OnDoubleTapped = func() {
if a.OnPlay != nil {
a.OnPlay()
}
}
a.title.Wrapping = fyne.TextTruncate a.title.Wrapping = fyne.TextTruncate
a.artist.Wrapping = fyne.TextTruncate a.artist.Wrapping = fyne.TextTruncate
a.title.TextStyle = fyne.TextStyle{Bold: true} a.title.TextStyle = fyne.TextStyle{Bold: true}
a.Cover.im.SetMinSize(fyne.NewSize(200, 200))
a.Cover.im.FillMode = canvas.ImageFillContain
a.createContainer() a.createContainer()
return a return a
@@ -73,7 +103,7 @@ func NewAlbumCard() *AlbumCard {
func (a *AlbumCard) createContainer() { func (a *AlbumCard) createContainer() {
titleArtist := container.New(&layout.VboxCustomPadding{ExtraPad: -16}, a.title, a.artist) titleArtist := container.New(&layout.VboxCustomPadding{ExtraPad: -16}, a.title, a.artist)
c := container.New(&layout.VboxCustomPadding{ExtraPad: -5}, a.Cover.im, titleArtist) c := container.New(&layout.VboxCustomPadding{ExtraPad: -5}, a.Cover, titleArtist)
pad := &layout.CenterPadLayout{PadLeftRight: 20, PadTopBottom: 10} pad := &layout.CenterPadLayout{PadLeftRight: 20, PadTopBottom: 10}
a.container = container.New(pad, c) a.container = container.New(pad, c)
} }
@@ -90,11 +120,4 @@ func (a *AlbumCard) AlbumID() string {
func (a *AlbumCard) CreateRenderer() fyne.WidgetRenderer { func (a *AlbumCard) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(a.container) return widget.NewSimpleRenderer(a.container)
//return widget.NewSimpleRenderer(container.New(&layout.VboxCustomPadding{-10}, a.Cover.im, a.title, a.artist))
}
func (a *AlbumCard) Tapped(*fyne.PointEvent) {
if a.OnTapped != nil {
a.OnTapped()
}
} }
+1 -2
View File
@@ -36,7 +36,7 @@ func NewAlbumGrid(iter backend.AlbumIterator, pm *backend.PlaybackManager, im *b
// create func // create func
func() fyne.CanvasObject { func() fyne.CanvasObject {
ac := NewAlbumCard() ac := NewAlbumCard()
ac.OnTapped = func() { ac.OnPlay = func() {
pm.PlayAlbum(ac.AlbumID()) pm.PlayAlbum(ac.AlbumID())
} }
return ac return ac
@@ -77,7 +77,6 @@ func (ag *AlbumGrid) doUpdateAlbumCard(albumIdx int, ac *AlbumCard) {
default: default:
if err == nil { if err == nil {
ac.Cover.SetImage(i) ac.Cover.SetImage(i)
ac.Refresh()
} }
} }
}(ctx) }(ctx)