// 25 february 2014 package ui import ( "sync" ) // A ProgressBar is a horizontal rectangle that fills up from left to right to indicate the progress of a long-running task. // This progress is typically a percentage, so within the range [0,100]. type ProgressBar struct { lock sync.Mutex created bool sysData *sysData initProg int } // NewProgressBar creates a new ProgressBar. func NewProgressBar() *ProgressBar { return &ProgressBar{ sysData: mksysdata(c_progressbar), } } // SetProgress sets the currently indicated progress amount on the ProgressBar. If this amount is outside the range [0,100] (ideally -1), the function will panic (it should allow indeterminate progress bars, alas those are not supported on Windows 2000). func (p *ProgressBar) SetProgress(percent int) { p.lock.Lock() defer p.lock.Unlock() if percent < 0 || percent > 100 { panic("invalid percent") // TODO } if p.created { p.sysData.setProgress(percent) return } p.initProg = percent } func (p *ProgressBar) make(window *sysData) error { p.lock.Lock() defer p.lock.Unlock() err := p.sysData.make("", window) if err != nil { return err } p.sysData.setProgress(p.initProg) p.created = true return nil } func (p *ProgressBar) setRect(x int, y int, width int, height int) error { p.lock.Lock() defer p.lock.Unlock() return p.sysData.setRect(x, y, width, height) } func (p *ProgressBar) preferredSize() (width int, height int, err error) { p.lock.Lock() defer p.lock.Unlock() width, height = p.sysData.preferredSize() return }