From e30bdc3edcf02efcc8845d718dd89f2baef5ef7e Mon Sep 17 00:00:00 2001 From: Oliver 'kfsone' Smith Date: Wed, 24 Feb 2021 13:42:34 -0800 Subject: [PATCH] ToggleButton cleanup --- raygui/togglebutton.go | 75 +++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 44 deletions(-) diff --git a/raygui/togglebutton.go b/raygui/togglebutton.go index a9278c1..73fbc83 100644 --- a/raygui/togglebutton.go +++ b/raygui/togglebutton.go @@ -2,60 +2,47 @@ package raygui import "github.com/gen2brain/raylib-go/raylib" +// togglebuttonColoring describes the per-state colors for a ToggleBox control. +type togglebuttonColoring struct { + Border, Inside, Text Property +} + +// togglebuttonColors lists the styling for each supported state. +var togglebuttonColors = map[ControlState]togglebuttonColoring { + Normal: {ToggleDefaultBorderColor, ToggleDefaultInsideColor, ToggleDefaultTextColor}, + // Hijacking 'Clicked' for the 'active' state. + Clicked: {ToggleActiveBorderColor, ToggleActiveInsideColor, ToggleDefaultTextColor}, + Pressed: {TogglePressedBorderColor, TogglePressedInsideColor, TogglePressedTextColor}, + Focused: {ToggleHoverBorderColor, ToggleHoverInsideColor, ToggleHoverTextColor}, +} + // ToggleButton - Toggle Button element, returns true when active func ToggleButton(bounds rl.Rectangle, text string, active bool) bool { - b := bounds.ToInt32() - state := Normal - mousePoint := rl.GetMousePosition() - textHeight := int32(style[GlobalTextFontsize]) textWidth := rl.MeasureText(text, textHeight) - // Update control - if b.Width < textWidth { - b.Width = textWidth + int32(style[ToggleTextPadding]) - } - if b.Height < textHeight { - b.Height = textHeight + int32(style[ToggleTextPadding])/2 + ConstrainRectangle(&bounds, textWidth, textWidth + GetStyle32(ToggleTextPadding), textHeight, textHeight + GetStyle32(ToggleTextPadding)) + + state := GetInteractionState(bounds) + if state == Clicked { + active = !active + state = Normal } - if rl.CheckCollisionPointRec(mousePoint, bounds) { - if rl.IsMouseButtonDown(rl.MouseLeftButton) { - state = Pressed - } else if rl.IsMouseButtonReleased(rl.MouseLeftButton) || rl.IsMouseButtonPressed(rl.MouseLeftButton) { - state = Normal - active = !active - } else { - state = Focused - } + // Hijack 'Clicked' as the 'active' state + if state == Normal && active { + state = Clicked + } + + colors, exists := togglebuttonColors[state] + if !exists { + return active } // Draw control - switch state { - case Normal: - if active { - rl.DrawRectangle(b.X, b.Y, b.Width, b.Height, rl.GetColor(int32(style[ToggleActiveBorderColor]))) - rl.DrawRectangle(b.X+int32(style[ToggleBorderWidth]), b.Y+int32(style[ToggleBorderWidth]), b.Width-(2*int32(style[ToggleBorderWidth])), b.Height-(2*int32(style[ToggleBorderWidth])), rl.GetColor(int32(style[ToggleActiveInsideColor]))) - rl.DrawText(text, b.X+((b.Width/2)-(rl.MeasureText(text, textHeight)/2)), b.Y+((b.Height/2)-(textHeight/2)), textHeight, rl.GetColor(int32(style[ToggleDefaultTextColor]))) - } else { - rl.DrawRectangle(b.X, b.Y, b.Width, b.Height, rl.GetColor(int32(style[ToggleDefaultBorderColor]))) - rl.DrawRectangle(b.X+int32(style[ToggleBorderWidth]), b.Y+int32(style[ToggleBorderWidth]), b.Width-(2*int32(style[ToggleBorderWidth])), b.Height-(2*int32(style[ToggleBorderWidth])), rl.GetColor(int32(style[ToggleDefaultInsideColor]))) - rl.DrawText(text, b.X+((b.Width/2)-(rl.MeasureText(text, textHeight)/2)), b.Y+((b.Height/2)-(textHeight/2)), textHeight, rl.GetColor(int32(style[ToggleDefaultTextColor]))) - } - break - case Focused: - rl.DrawRectangle(b.X, b.Y, b.Width, b.Height, rl.GetColor(int32(style[ToggleHoverBorderColor]))) - rl.DrawRectangle(b.X+int32(style[ToggleBorderWidth]), b.Y+int32(style[ToggleBorderWidth]), b.Width-(2*int32(style[ToggleBorderWidth])), b.Height-(2*int32(style[ToggleBorderWidth])), rl.GetColor(int32(style[ToggleHoverInsideColor]))) - rl.DrawText(text, b.X+((b.Width/2)-(rl.MeasureText(text, textHeight)/2)), b.Y+((b.Height/2)-(textHeight/2)), textHeight, rl.GetColor(int32(style[ToggleHoverTextColor]))) - break - case Pressed: - rl.DrawRectangle(b.X, b.Y, b.Width, b.Height, rl.GetColor(int32(style[TogglePressedBorderColor]))) - rl.DrawRectangle(b.X+int32(style[ToggleBorderWidth]), b.Y+int32(style[ToggleBorderWidth]), b.Width-(2*int32(style[ToggleBorderWidth])), b.Height-(2*int32(style[ToggleBorderWidth])), rl.GetColor(int32(style[TogglePressedInsideColor]))) - rl.DrawText(text, b.X+((b.Width/2)-(rl.MeasureText(text, textHeight)/2)), b.Y+((b.Height/2)-(textHeight/2)), textHeight, rl.GetColor(int32(style[TogglePressedTextColor]))) - break - default: - break - } + b := bounds.ToInt32() + DrawBorderedRectangle(b, GetStyle32(ToggleBorderWidth), GetStyleColor(colors.Border), GetStyleColor(colors.Inside)) + rl.DrawText(text, b.X+((b.Width/2)-(rl.MeasureText(text, textHeight)/2)), b.Y+((b.Height/2)-(textHeight/2)), textHeight, GetStyleColor(colors.Text)) return active }