progresscircle.go 991 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // SPDX-License-Identifier: Unlicense OR MIT
  2. package material
  3. import (
  4. "image"
  5. "image/color"
  6. "math"
  7. "gioui.org/layout"
  8. "gioui.org/op"
  9. "gioui.org/op/paint"
  10. )
  11. type ProgressCircleStyle struct {
  12. Color color.NRGBA
  13. Progress float32
  14. }
  15. func ProgressCircle(th *Theme, progress float32) ProgressCircleStyle {
  16. return ProgressCircleStyle{
  17. Color: th.Palette.ContrastBg,
  18. Progress: progress,
  19. }
  20. }
  21. func (p ProgressCircleStyle) Layout(gtx layout.Context) layout.Dimensions {
  22. diam := gtx.Constraints.Min.X
  23. if minY := gtx.Constraints.Min.Y; minY > diam {
  24. diam = minY
  25. }
  26. if diam == 0 {
  27. diam = gtx.Dp(24)
  28. }
  29. sz := gtx.Constraints.Constrain(image.Pt(diam, diam))
  30. radius := sz.X / 2
  31. defer op.Offset(image.Pt(radius, radius)).Push(gtx.Ops).Pop()
  32. defer clipLoader(gtx.Ops, -math.Pi/2, -math.Pi/2+math.Pi*2*p.Progress, float32(radius)).Push(gtx.Ops).Pop()
  33. paint.ColorOp{
  34. Color: p.Color,
  35. }.Add(gtx.Ops)
  36. paint.PaintOp{}.Add(gtx.Ops)
  37. return layout.Dimensions{
  38. Size: sz,
  39. }
  40. }