| 43 | 43 |
refreshRate time.Duration
|
| 44 | 44 |
reqWidth int
|
| 45 | 45 |
popCompleted bool
|
| 46 | |
manualRefresh bool
|
| 47 | 46 |
autoRefresh bool
|
| 48 | 47 |
renderDelay <-chan struct{}
|
|
48 |
manualRC <-chan interface{}
|
| 49 | 49 |
shutdownNotifier chan<- interface{}
|
| 50 | 50 |
queueBars map[*Bar]*Bar
|
| 51 | 51 |
output io.Writer
|
|
| 83 | 83 |
}
|
| 84 | 84 |
}
|
| 85 | 85 |
|
| 86 | |
go s.hm.run()
|
| 87 | |
|
| 88 | |
cw := cwriter.New(s.output)
|
| 89 | |
if (cw.IsTerminal() || s.autoRefresh) && !s.manualRefresh {
|
| 90 | |
s.autoRefresh = true
|
| 91 | |
go s.newTicker(s.renderDelay != nil)
|
| 92 | |
} else {
|
| 93 | |
s.autoRefresh = false
|
| 94 | |
}
|
| 95 | |
|
| 96 | 86 |
p := &Progress{
|
| 97 | 87 |
uwg: s.uwg,
|
| 98 | 88 |
operateState: make(chan func(*pState)),
|
| 99 | 89 |
interceptIO: make(chan func(io.Writer)),
|
| 100 | |
done: ctx.Done(),
|
| 101 | 90 |
cancel: cancel,
|
|
91 |
}
|
|
92 |
|
|
93 |
cw := cwriter.New(s.output)
|
|
94 |
if s.manualRC != nil {
|
|
95 |
done := make(chan struct{})
|
|
96 |
p.done = done
|
|
97 |
s.autoRefresh = false
|
|
98 |
go s.manualRefreshListener(done)
|
|
99 |
} else if cw.IsTerminal() || s.autoRefresh {
|
|
100 |
done := make(chan struct{})
|
|
101 |
p.done = done
|
|
102 |
s.autoRefresh = true
|
|
103 |
go s.autoRefreshListener(done)
|
|
104 |
} else {
|
|
105 |
p.done = s.ctx.Done()
|
|
106 |
s.autoRefresh = false
|
| 102 | 107 |
}
|
| 103 | 108 |
|
| 104 | 109 |
p.pwg.Add(1)
|
| 105 | 110 |
go p.serve(s, cw)
|
|
111 |
go s.hm.run()
|
| 106 | 112 |
return p
|
| 107 | 113 |
}
|
| 108 | 114 |
|
|
| 266 | 272 |
}
|
| 267 | 273 |
}
|
| 268 | 274 |
|
| 269 | |
func (s *pState) newTicker(delay bool) {
|
| 270 | |
if delay {
|
|
275 |
func (s pState) autoRefreshListener(done chan struct{}) {
|
|
276 |
if s.renderDelay != nil {
|
| 271 | 277 |
<-s.renderDelay
|
| 272 | 278 |
}
|
| 273 | 279 |
ticker := time.NewTicker(s.refreshRate)
|
|
| 277 | 283 |
case t := <-ticker.C:
|
| 278 | 284 |
s.refreshCh <- t
|
| 279 | 285 |
case <-s.ctx.Done():
|
|
286 |
close(done)
|
|
287 |
return
|
|
288 |
}
|
|
289 |
}
|
|
290 |
}
|
|
291 |
|
|
292 |
func (s pState) manualRefreshListener(done chan struct{}) {
|
|
293 |
for {
|
|
294 |
select {
|
|
295 |
case x := <-s.manualRC:
|
|
296 |
if t, ok := x.(time.Time); ok {
|
|
297 |
s.refreshCh <- t
|
|
298 |
} else {
|
|
299 |
s.refreshCh <- time.Now()
|
|
300 |
}
|
|
301 |
case <-s.ctx.Done():
|
|
302 |
close(done)
|
| 280 | 303 |
return
|
| 281 | 304 |
}
|
| 282 | 305 |
}
|
|
| 384 | 407 |
|
| 385 | 408 |
func (s *pState) makeBarState(total int64, filler BarFiller, options ...BarOption) *bState {
|
| 386 | 409 |
bs := &bState{
|
| 387 | |
id: s.idCount,
|
| 388 | |
priority: s.idCount,
|
| 389 | |
reqWidth: s.reqWidth,
|
| 390 | |
total: total,
|
| 391 | |
filler: filler,
|
| 392 | |
refreshCh: s.refreshCh,
|
| 393 | |
autoRefresh: s.autoRefresh,
|
| 394 | |
manualRefresh: s.manualRefresh,
|
|
410 |
id: s.idCount,
|
|
411 |
priority: s.idCount,
|
|
412 |
reqWidth: s.reqWidth,
|
|
413 |
total: total,
|
|
414 |
filler: filler,
|
|
415 |
refreshCh: s.refreshCh,
|
|
416 |
autoRefresh: s.autoRefresh,
|
| 395 | 417 |
}
|
| 396 | 418 |
|
| 397 | 419 |
if total > 0 {
|