From 5d09a5f8f3dd25b4d724a4c5aee11fa37a606e69 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Wed, 12 Jul 2023 14:39:22 -0700 Subject: [PATCH] avoid unnecessary refreshes when mousing over GridView covers --- ui/widgets/gridviewitem.go | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/ui/widgets/gridviewitem.go b/ui/widgets/gridviewitem.go index edd3cba..e978522 100644 --- a/ui/widgets/gridviewitem.go +++ b/ui/widgets/gridviewitem.go @@ -23,11 +23,17 @@ type coverImage struct { Im *ImagePlaceholder playbtn *canvas.Image + mouseInsideBtn bool OnPlay func() OnShowPage func() OnShowContextMenu func(fyne.Position) } +var ( + playBtnSize = fyne.NewSize(60, 60) + playBtnHoveredSize = fyne.NewSize(65, 65) +) + func newCoverImage(placeholderResource fyne.Resource) *coverImage { c := &coverImage{} c.Im = NewImagePlaceholder(placeholderResource, 200) @@ -35,7 +41,7 @@ func newCoverImage(placeholderResource fyne.Resource) *coverImage { c.Im.OnTappedSecondary = c.TappedSecondary c.Im.ScaleMode = canvas.ImageScaleFastest c.playbtn = &canvas.Image{FillMode: canvas.ImageFillContain, Resource: res.ResPlaybuttonPng} - c.playbtn.SetMinSize(fyne.NewSize(60, 60)) + c.playbtn.SetMinSize(playBtnSize) c.playbtn.Hidden = true c.ExtendBaseWidget(c) return c @@ -75,17 +81,25 @@ func (a *coverImage) MouseIn(*desktop.MouseEvent) { } func (a *coverImage) MouseOut() { + a.mouseInsideBtn = false a.playbtn.Hidden = true a.Refresh() } func (a *coverImage) MouseMoved(e *desktop.MouseEvent) { if isInside(a.center(), a.playbtn.MinSize().Height/2, e.Position) { - a.playbtn.SetMinSize(fyne.NewSize(65, 65)) + if !a.mouseInsideBtn { + a.playbtn.SetMinSize(playBtnHoveredSize) + a.playbtn.Refresh() + } + a.mouseInsideBtn = true } else { - a.playbtn.SetMinSize(fyne.NewSize(60, 60)) + if a.mouseInsideBtn { + a.playbtn.SetMinSize(playBtnSize) + a.playbtn.Refresh() + } + a.mouseInsideBtn = false } - a.Refresh() } func (a *coverImage) center() fyne.Position { @@ -96,6 +110,12 @@ func (a *coverImage) SetImage(im image.Image) { a.Im.SetImage(im, true) } +func (a *coverImage) ResetPlayButton() { + a.playbtn.SetMinSize(playBtnSize) + a.mouseInsideBtn = false + a.playbtn.Hidden = true +} + 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 @@ -188,7 +208,7 @@ func (g *GridViewItem) Update(model GridViewItemModel) { g.secondaryText.SetText(model.Secondary) g.secondaryText.Disabled = model.SecondaryID == "" g.secondaryText.Refresh() - g.Cover.playbtn.Hidden = true + g.Cover.ResetPlayButton() } func (g *GridViewItem) ItemID() string {