diff --git a/internal/f32color/rgba.go b/internal/f32color/rgba.go index a566a2b7..c5b5d198 100644 --- a/internal/f32color/rgba.go +++ b/internal/f32color/rgba.go @@ -172,6 +172,17 @@ func Disabled(c color.NRGBA) (d color.NRGBA) { } } +// Hovered blends color towards a brighter color. +func Hovered(c color.NRGBA) (d color.NRGBA) { + const r = 0x20 // lighten ratio + return color.NRGBA{ + R: byte(255 - int(255-c.R)*(255-r)/256), + G: byte(255 - int(255-c.G)*(255-r)/256), + B: byte(255 - int(255-c.B)*(255-r)/256), + A: c.A, + } +} + // approxLuminance is a fast approximate version of RGBA.Luminance. func approxLuminance(c color.NRGBA) byte { const ( diff --git a/widget/material/button.go b/widget/material/button.go index 29b07982..4d6f201a 100644 --- a/widget/material/button.go +++ b/widget/material/button.go @@ -128,8 +128,11 @@ func (b ButtonLayoutStyle) Layout(gtx layout.Context, w layout.Widget) layout.Di Y: float32(gtx.Constraints.Min.Y), }}, rr).Add(gtx.Ops) background := b.Background - if gtx.Queue == nil { + switch { + case gtx.Queue == nil: background = f32color.Disabled(b.Background) + case b.Button.Hovered(): + background = f32color.Hovered(b.Background) } paint.Fill(gtx.Ops, background) for _, c := range b.Button.History() { @@ -155,8 +158,11 @@ func (b IconButtonStyle) Layout(gtx layout.Context) layout.Dimensions { Max: f32.Point{X: sizexf, Y: sizeyf}, }, rr).Add(gtx.Ops) background := b.Background - if gtx.Queue == nil { + switch { + case gtx.Queue == nil: background = f32color.Disabled(b.Background) + case b.Button.Hovered(): + background = f32color.Hovered(b.Background) } paint.Fill(gtx.Ops, background) for _, c := range b.Button.History() {