add play button to center of album cover in album grid

This commit is contained in:
Drew Weymouth
2023-01-18 18:49:12 -08:00
parent a2104059e2
commit 348d2b0861
6 changed files with 81 additions and 16 deletions
+1 -1
View File
@@ -44,4 +44,4 @@ require (
honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect
) )
replace fyne.io/fyne/v2 v2.2.4 => github.com/dweymouth/fyne/v2 v2.2.5-0.20230110171955-98071d7f072f replace fyne.io/fyne/v2 v2.2.4 => github.com/dweymouth/fyne/v2 v2.2.5-0.20230119024415-238e09217d09
+2 -2
View File
@@ -72,8 +72,8 @@ github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7h
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dweymouth/fyne/v2 v2.2.5-0.20230110171955-98071d7f072f h1:Tgz5Tx14yQLkKl4JH5eGWnUpq9J8+cbLTuj8lfzgqG0= github.com/dweymouth/fyne/v2 v2.2.5-0.20230119024415-238e09217d09 h1:huJvmT36/E7MsuAVILCK7VPFd0UiPQDpphn215e1rCo=
github.com/dweymouth/fyne/v2 v2.2.5-0.20230110171955-98071d7f072f/go.mod h1:MBoGuHzLLSXdQOWFAwWhIhYTEMp33zqtGCReSWhaQTA= github.com/dweymouth/fyne/v2 v2.2.5-0.20230119024415-238e09217d09/go.mod h1:MBoGuHzLLSXdQOWFAwWhIhYTEMp33zqtGCReSWhaQTA=
github.com/dweymouth/go-subsonic v0.0.0-20221214005741-bd8048fa1863 h1:bOWMpFJ9zY839T1EngQ5nxVCiMlatPtpGkg/yHK6szg= github.com/dweymouth/go-subsonic v0.0.0-20221214005741-bd8048fa1863 h1:bOWMpFJ9zY839T1EngQ5nxVCiMlatPtpGkg/yHK6szg=
github.com/dweymouth/go-subsonic v0.0.0-20221214005741-bd8048fa1863/go.mod h1:fUez6NFiEJiQTZizZ1BThZr5GJXAbigzGYjEPNm4tdI= github.com/dweymouth/go-subsonic v0.0.0-20221214005741-bd8048fa1863/go.mod h1:fUez6NFiEJiQTZizZ1BThZr5GJXAbigzGYjEPNm4tdI=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+5
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -12,6 +12,7 @@ fyne bundle -append -prefix Res icons/musicnotes.png >> bundled.go
fyne bundle -append -prefix Res icons/musicnotes-invert.png >> bundled.go fyne bundle -append -prefix Res icons/musicnotes-invert.png >> bundled.go
fyne bundle -append -prefix Res icons/people.png >> bundled.go fyne bundle -append -prefix Res icons/people.png >> bundled.go
fyne bundle -append -prefix Res icons/people-invert.png >> bundled.go fyne bundle -append -prefix Res icons/people-invert.png >> bundled.go
fyne bundle -append -prefix Res icons/playbutton.png >> bundled.go
fyne bundle -append -prefix Res icons/playlist.png >> bundled.go fyne bundle -append -prefix Res icons/playlist.png >> bundled.go
fyne bundle -append -prefix Res icons/playlist-invert.png >> bundled.go fyne bundle -append -prefix Res icons/playlist-invert.png >> bundled.go
fyne bundle -append -prefix Res icons/podcast.png >> bundled.go fyne bundle -append -prefix Res icons/podcast.png >> bundled.go
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

+72 -13
View File
@@ -3,14 +3,17 @@ package widgets
import ( import (
"context" "context"
"image" "image"
"image/color"
"strconv" "strconv"
"supersonic/res"
"supersonic/ui/layouts" "supersonic/ui/layouts"
"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/driver/desktop"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget" "fyne.io/fyne/v2/widget"
"github.com/dweymouth/go-subsonic" "github.com/dweymouth/go-subsonic"
@@ -20,45 +23,105 @@ var _ fyne.Widget = (*AlbumCard)(nil)
var _ fyne.Widget = (*albumCover)(nil) var _ fyne.Widget = (*albumCover)(nil)
var _ fyne.Tappable = (*albumCover)(nil) var _ fyne.Tappable = (*albumCover)(nil)
var _ fyne.DoubleTappable = (*albumCover)(nil)
type albumCover struct { type albumCover struct {
widget.BaseWidget widget.BaseWidget
Im *canvas.Image Im *canvas.Image
playbtn *canvas.Image
btnCircle *btnCircle
OnDoubleTapped func() OnDoubleTapped func()
OnTapped func() OnTapped func()
} }
type btnCircle struct {
canvas.Circle
Diameter float32
}
func (b *btnCircle) MinSize() fyne.Size {
return fyne.NewSize(b.Diameter, b.Diameter)
}
func newAlbumCover() *albumCover { func newAlbumCover() *albumCover {
a := &albumCover{} a := &albumCover{}
a.ExtendBaseWidget(a) a.ExtendBaseWidget(a)
a.Im = &canvas.Image{FillMode: canvas.ImageFillContain} a.Im = &canvas.Image{FillMode: canvas.ImageFillContain}
a.Im.SetMinSize(fyne.NewSize(200, 200)) a.Im.SetMinSize(fyne.NewSize(200, 200))
a.playbtn = &canvas.Image{FillMode: canvas.ImageFillContain, Resource: res.ResPlaybuttonPng}
a.playbtn.SetMinSize(fyne.NewSize(60, 60))
a.playbtn.Hidden = true
// TODO:
a.btnCircle = &btnCircle{
Diameter: 63,
Circle: canvas.Circle{
FillColor: color.Transparent,
StrokeColor: theme.PrimaryColor(),
StrokeWidth: 2,
Hidden: true,
},
}
return a return a
} }
func (a *albumCover) CreateRenderer() fyne.WidgetRenderer { func (a *albumCover) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(a.Im) return widget.NewSimpleRenderer(
container.NewMax(a.Im, container.NewCenter(a.playbtn), container.NewCenter(a.btnCircle)),
)
} }
func (a *albumCover) DoubleTapped(e *fyne.PointEvent) { func (a *albumCover) Cursor() desktop.Cursor {
if a.OnDoubleTapped != nil { return desktop.PointerCursor
a.OnDoubleTapped()
}
} }
func (a *albumCover) Tapped(e *fyne.PointEvent) { func (a *albumCover) Tapped(e *fyne.PointEvent) {
if isInside(a.center(), a.playbtn.Size().Height/2, e.Position) {
if a.OnDoubleTapped != nil {
a.OnDoubleTapped()
}
return
}
if a.OnTapped != nil { if a.OnTapped != nil {
a.OnTapped() a.OnTapped()
} }
} }
func (a *albumCover) MouseIn(*desktop.MouseEvent) {
a.playbtn.Hidden = false
a.Refresh()
}
func (a *albumCover) MouseOut() {
a.playbtn.Hidden = true
a.Refresh()
}
// TODO: figure out why circle around play button isn't being displayed
func (a *albumCover) MouseMoved(e *desktop.MouseEvent) {
if inside := isInside(a.center(), a.btnCircle.Diameter/2, e.Position); inside && !a.btnCircle.Visible() {
a.btnCircle.Show()
a.Refresh()
} else if !inside && a.btnCircle.Visible() {
a.btnCircle.Hide()
a.Refresh()
}
}
func (a *albumCover) center() fyne.Position {
return fyne.NewPos(a.Size().Width/2, a.Size().Height/2)
}
func (a *albumCover) SetImage(im image.Image) { func (a *albumCover) SetImage(im image.Image) {
a.Im.Image = im a.Im.Image = im
a.Refresh() a.Refresh()
} }
func isInside(origin fyne.Position, radius float32, point fyne.Position) bool {
x, y := (point.X - origin.X), (point.Y - origin.Y)
return x*x+y*y <= radius*radius
}
type AlbumCard struct { type AlbumCard struct {
widget.BaseWidget widget.BaseWidget
@@ -83,12 +146,6 @@ type AlbumCard struct {
OnShowArtistPage func() OnShowArtistPage func()
} }
func (a *AlbumCard) MouseIn(*desktop.MouseEvent) {}
func (a *AlbumCard) MouseOut() {}
func (a *AlbumCard) MouseMoved(*desktop.MouseEvent) {}
func NewAlbumCard(showYear bool) *AlbumCard { func NewAlbumCard(showYear bool) *AlbumCard {
a := &AlbumCard{ a := &AlbumCard{
title: NewCustomHyperlink(), title: NewCustomHyperlink(),
@@ -103,11 +160,13 @@ func NewAlbumCard(showYear bool) *AlbumCard {
a.OnPlay() a.OnPlay()
} }
} }
a.title.OnTapped = func() { showAlbumFn := func() {
if a.OnShowAlbumPage != nil { if a.OnShowAlbumPage != nil {
a.OnShowAlbumPage() a.OnShowAlbumPage()
} }
} }
a.Cover.OnTapped = showAlbumFn
a.title.OnTapped = showAlbumFn
a.artist.OnTapped = func() { a.artist.OnTapped = func() {
if a.OnShowArtistPage != nil { if a.OnShowArtistPage != nil {
a.OnShowArtistPage() a.OnShowArtistPage()