From ffeca25f115a57051c7da3870bf5d17a1b81b643 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 23 Feb 2021 17:14:49 +0000 Subject: [PATCH] Add calculations to apply hover over high importance buttons Fixes #1785 --- widget/button.go | 14 ++++++++-- widget/button_test.go | 25 ++++++++++++++++++ widget/testdata/button/high_importance.png | Bin 0 -> 1251 bytes .../button/high_importance_hovered.png | Bin 0 -> 1263 bytes widget/testdata/button/hovered.png | Bin 0 -> 1238 bytes 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 widget/testdata/button/high_importance.png create mode 100644 widget/testdata/button/high_importance_hovered.png create mode 100644 widget/testdata/button/hovered.png diff --git a/widget/button.go b/widget/button.go index 5c2ecbcc37..0a1f2cf394 100644 --- a/widget/button.go +++ b/widget/button.go @@ -312,10 +312,20 @@ func (r *buttonRenderer) buttonColor() color.Color { switch { case r.button.Disabled(): return theme.DisabledButtonColor() - case r.button.Importance == HighImportance: - return theme.PrimaryColor() case r.button.hovered: + if r.button.Importance == HighImportance { + srcR, srcG, srcB, srcA := theme.PrimaryColor().RGBA() + dstR, dstG, dstB, dstA := theme.HoverColor().RGBA() + alpha := float32(dstA) / 0xFFFF + outR := alpha*float32(dstR) + (1-alpha)*float32(srcR) + outG := alpha*float32(dstG) + (1-alpha)*float32(srcG) + outB := alpha*float32(dstB) + (1-alpha)*float32(srcB) + outA := alpha*float32(dstA) + (1-alpha)*float32(srcA) + return color.RGBA{R: uint8(uint32(outR) >> 8), G: uint8(uint32(outG) >> 8), B: uint8(uint32(outB) >> 8), A: uint8(uint32(outA) >> 8)} + } return theme.HoverColor() + case r.button.Importance == HighImportance: + return theme.PrimaryColor() default: return theme.ButtonColor() } diff --git a/widget/button_test.go b/widget/button_test.go index d2818ffbf6..f9478dd361 100644 --- a/widget/button_test.go +++ b/widget/button_test.go @@ -121,6 +121,31 @@ func TestButton_Disabled(t *testing.T) { assert.False(t, button.Disabled()) } +func TestButton_Hover(t *testing.T) { + app := test.NewApp() + defer test.NewApp() + app.Settings().SetTheme(theme.LightTheme()) + + b := widget.NewButtonWithIcon("Test", theme.HomeIcon(), func() {}) + w := test.NewWindow(b) + defer w.Close() + + test.MoveMouse(w.Canvas(), fyne.NewPos(5, 5)) + test.AssertImageMatches(t, "button/hovered.png", w.Canvas().Capture()) + + b.Importance = widget.HighImportance + b.Refresh() + test.AssertImageMatches(t, "button/high_importance_hovered.png", w.Canvas().Capture()) + + test.MoveMouse(w.Canvas(), fyne.NewPos(0, 0)) + b.Refresh() + test.AssertImageMatches(t, "button/high_importance.png", w.Canvas().Capture()) + + b.Importance = widget.MediumImportance + b.Refresh() + test.AssertImageMatches(t, "button/initial.png", w.Canvas().Capture()) +} + func TestButton_Layout(t *testing.T) { test.NewApp() defer test.NewApp() diff --git a/widget/testdata/button/high_importance.png b/widget/testdata/button/high_importance.png new file mode 100644 index 0000000000000000000000000000000000000000..1339bd9cacb28629efe2ab5a5626ae79a3c94bbd GIT binary patch literal 1251 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 A*#H0l literal 0 HcmV?d00001