| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- package giu
- import (
- "image"
- "math"
- "time"
- "github.com/AllenDang/imgui-go"
- )
- var _ Disposable = &progressIndicatorState{}
- type progressIndicatorState struct {
- angle float64
- stop bool
- }
- func (ps *progressIndicatorState) update() {
- ticker := time.NewTicker(time.Second / 60)
- for !ps.stop {
- if ps.angle > 6.2 {
- ps.angle = 0
- }
- ps.angle += 0.1
- Update()
- <-ticker.C
- }
- ticker.Stop()
- }
- // Dispose implements Disposable interface.
- func (ps *progressIndicatorState) Dispose() {
- ps.stop = true
- }
- // static check to ensure if ProgressIndicatorWidget implements Widget interface.
- var _ Widget = &ProgressIndicatorWidget{}
- // ProgressIndicatorWidget represents progress indicator widget
- // see examples/extrawidgets/.
- type ProgressIndicatorWidget struct {
- internalID string
- width float32
- height float32
- radius float32
- label string
- }
- // ProgressIndicator creates a new ProgressIndicatorWidget.
- func ProgressIndicator(label string, width, height, radius float32) *ProgressIndicatorWidget {
- return &ProgressIndicatorWidget{
- internalID: "###giu-progress-indicator",
- width: width,
- height: height,
- radius: radius,
- label: label,
- }
- }
- // Build implements Widget interface.
- func (p *ProgressIndicatorWidget) Build() {
- // State exists
- if s := Context.GetState(p.internalID); s == nil {
- // Register state and start go routine
- ps := progressIndicatorState{angle: 0.0, stop: false}
- Context.SetState(p.internalID, &ps)
- go ps.update()
- } else {
- var isOk bool
- state, isOk := s.(*progressIndicatorState)
- Assert(isOk, "ProgressIndicatorWidget", "Build", "got unexpected type of widget's sate")
- child := Child().Border(false).Size(p.width, p.height).Layout(Layout{
- Custom(func() {
- // Process width and height
- width, height := GetAvailableRegion()
- canvas := GetCanvas()
- pos := GetCursorScreenPos()
- centerPt := pos.Add(image.Pt(int(width/2), int(height/2)))
- centerPt2 := image.Pt(
- int(float64(p.radius)*math.Sin(state.angle)+float64(centerPt.X)),
- int(float64(p.radius)*math.Cos(state.angle)+float64(centerPt.Y)),
- )
- color := imgui.CurrentStyle().GetColor(imgui.StyleColorText)
- rgba := Vec4ToRGBA(color)
- canvas.AddCircle(centerPt, p.radius, rgba, int(p.radius), p.radius/20.0)
- canvas.AddCircleFilled(centerPt2, p.radius/5, rgba)
- // Draw text
- if len(p.label) > 0 {
- labelWidth, _ := CalcTextSize(tStr(p.label))
- labelPos := centerPt.Add(image.Pt(-1*int(labelWidth/2), int(p.radius+p.radius/5+8)))
- canvas.AddText(labelPos, rgba, p.label)
- }
- }),
- })
- child.Build()
- }
- }
|