From a87206c3647cbcb9b8706a5fcd11e2e4508ab946 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 26 Jun 2021 18:05:13 +0200 Subject: [PATCH] widget/material: add ProgressCircle Signed-off-by: Elias Naur --- widget/material/progresscircle.go | 51 +++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 widget/material/progresscircle.go diff --git a/widget/material/progresscircle.go b/widget/material/progresscircle.go new file mode 100644 index 00000000..3e7bcd51 --- /dev/null +++ b/widget/material/progresscircle.go @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: Unlicense OR MIT + +package material + +import ( + "image" + "image/color" + "math" + + "gioui.org/f32" + "gioui.org/layout" + "gioui.org/op" + "gioui.org/op/paint" + "gioui.org/unit" +) + +type ProgressCircleStyle struct { + Color color.NRGBA + Progress float32 +} + +func ProgressCircle(th *Theme, progress float32) ProgressCircleStyle { + return ProgressCircleStyle{ + Color: th.Palette.ContrastBg, + Progress: progress, + } +} + +func (p ProgressCircleStyle) Layout(gtx layout.Context) layout.Dimensions { + diam := gtx.Constraints.Min.X + if minY := gtx.Constraints.Min.Y; minY > diam { + diam = minY + } + if diam == 0 { + diam = gtx.Px(unit.Dp(24)) + } + sz := gtx.Constraints.Constrain(image.Pt(diam, diam)) + radius := float32(sz.X) * .5 + defer op.Save(gtx.Ops).Load() + op.Offset(f32.Pt(radius, radius)).Add(gtx.Ops) + + clipLoader(gtx.Ops, -math.Pi/2, -math.Pi/2+math.Pi*2*p.Progress, radius) + paint.ColorOp{ + Color: p.Color, + }.Add(gtx.Ops) + op.Offset(f32.Pt(-radius, -radius)).Add(gtx.Ops) + paint.PaintOp{}.Add(gtx.Ops) + return layout.Dimensions{ + Size: sz, + } +}