From ffeca25f115a57051c7da3870bf5d17a1b81b643 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Tue, 23 Feb 2021 17:14:49 +0000 Subject: [PATCH 1/3] 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 From ceff3c9c9d199b198050adaff183ff0c6b354a35 Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 24 Feb 2021 10:40:00 +0000 Subject: [PATCH 2/3] Multiply hover over button colour to support other themes. Correct, and optimise, maths for non-pre-mul channels. --- widget/button.go | 23 +++++++++++------- .../button/high_importance_hovered.png | Bin 1263 -> 1290 bytes widget/testdata/button/hovered.png | Bin 1238 -> 1226 bytes 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/widget/button.go b/widget/button.go index 0a1f2cf394..07e390287e 100644 --- a/widget/button.go +++ b/widget/button.go @@ -313,17 +313,22 @@ func (r *buttonRenderer) buttonColor() color.Color { case r.button.Disabled(): return theme.DisabledButtonColor() case r.button.hovered: + bg := theme.ButtonColor() 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)} + bg = theme.PrimaryColor() } - return theme.HoverColor() + + dstR, dstG, dstB, dstA := bg.RGBA() + srcR, srcG, srcB, srcA := theme.HoverColor().RGBA() + srcAlpha := float32(srcA) / 0xFFFF + dstAlpha := float32(dstA) / 0xFFFF + targetAlpha := 1 - srcAlpha*dstAlpha + + outAlpha := srcAlpha + targetAlpha + outR := (srcAlpha*float32(srcR) + targetAlpha*float32(dstR)) / outAlpha + outG := (srcAlpha*float32(srcG) + targetAlpha*float32(dstG)) / outAlpha + outB := (srcAlpha*float32(srcB) + targetAlpha*float32(dstB)) / outAlpha + return color.RGBA{R: uint8(uint32(outR) >> 8), G: uint8(uint32(outG) >> 8), B: uint8(uint32(outB) >> 8), A: uint8(outAlpha * 0xFF)} case r.button.Importance == HighImportance: return theme.PrimaryColor() default: diff --git a/widget/testdata/button/high_importance_hovered.png b/widget/testdata/button/high_importance_hovered.png index 5a0cfa9c6fdf3b186e3f33015bf2c92de3688f02..ef5bf89f80ba9abeb11196ce1670e33baf29fc63 100644 GIT binary patch delta 1270 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 From 9145c4e08711e58da6787250533212e008cea40a Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Wed, 24 Feb 2021 11:19:49 +0000 Subject: [PATCH 3/3] Fix impacted image --- .../testdata/menu_bar_hovered_content.png | Bin 3838 -> 3812 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/internal/driver/glfw/testdata/menu_bar_hovered_content.png b/internal/driver/glfw/testdata/menu_bar_hovered_content.png index 05694113557ee1ce0f4da15723fefdd3be457d15..fc5c0c3a9b78d850cdff31f6509dd9fcbb54c28d 100644 GIT binary patch delta 2987 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 delta 3013 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 Hu0mjf6mU&`