| 43 | 43 |
rmOnComplete bool
|
| 44 | 44 |
noPop bool
|
| 45 | 45 |
autoRefresh bool
|
| 46 | |
aDecorators []decor.Decorator
|
| 47 | |
pDecorators []decor.Decorator
|
|
46 |
buffers [3]*bytes.Buffer
|
|
47 |
decorators [2][]decor.Decorator
|
| 48 | 48 |
averageDecorators []decor.AverageDecorator
|
| 49 | 49 |
ewmaDecorators []decor.EwmaDecorator
|
| 50 | 50 |
shutdownListeners []decor.ShutdownListener
|
| 51 | |
buffers [3]*bytes.Buffer
|
| 52 | 51 |
filler BarFiller
|
| 53 | 52 |
extender extenderFunc
|
| 54 | 53 |
renderReq chan<- time.Time
|
|
| 158 | 157 |
iter := make(chan decor.Decorator)
|
| 159 | 158 |
select {
|
| 160 | 159 |
case b.operateState <- func(s *bState) {
|
| 161 | |
for _, decorators := range [][]decor.Decorator{
|
| 162 | |
s.pDecorators,
|
| 163 | |
s.aDecorators,
|
| 164 | |
} {
|
|
160 |
for _, decorators := range s.decorators {
|
| 165 | 161 |
for _, d := range decorators {
|
| 166 | 162 |
iter <- d
|
| 167 | 163 |
}
|
|
| 483 | 479 |
}
|
| 484 | 480 |
}
|
| 485 | 481 |
|
| 486 | |
func (s *bState) draw(stat decor.Statistics) (io.Reader, error) {
|
| 487 | |
r, err := s.drawImpl(stat)
|
| 488 | |
if err != nil {
|
| 489 | |
for _, b := range s.buffers {
|
| 490 | |
b.Reset()
|
| 491 | |
}
|
| 492 | |
return nil, err
|
| 493 | |
}
|
| 494 | |
return io.MultiReader(r, strings.NewReader("\n")), nil
|
| 495 | |
}
|
| 496 | |
|
| 497 | |
func (s *bState) drawImpl(stat decor.Statistics) (io.Reader, error) {
|
|
482 |
func (s *bState) draw(stat decor.Statistics) (_ io.Reader, err error) {
|
|
483 |
defer func() {
|
|
484 |
if err != nil {
|
|
485 |
for _, b := range s.buffers {
|
|
486 |
b.Reset()
|
|
487 |
}
|
|
488 |
}
|
|
489 |
}()
|
| 498 | 490 |
decorFiller := func(buf *bytes.Buffer, decorators []decor.Decorator) (err error) {
|
| 499 | 491 |
for _, d := range decorators {
|
| 500 | 492 |
// need to call Decor in any case becase of width synchronization
|
|
| 514 | 506 |
return err
|
| 515 | 507 |
}
|
| 516 | 508 |
|
| 517 | |
bufP, bufB, bufA := s.buffers[0], s.buffers[1], s.buffers[2]
|
| 518 | |
|
| 519 | |
err := firstNonNil(decorFiller(bufP, s.pDecorators), decorFiller(bufA, s.aDecorators))
|
|
509 |
for i, buf := range s.buffers[:2] {
|
|
510 |
err = decorFiller(buf, s.decorators[i])
|
|
511 |
if err != nil {
|
|
512 |
return nil, err
|
|
513 |
}
|
|
514 |
}
|
|
515 |
|
|
516 |
spaces := []io.Reader{
|
|
517 |
strings.NewReader(" "),
|
|
518 |
strings.NewReader(" "),
|
|
519 |
}
|
|
520 |
if s.trimSpace || stat.AvailableWidth < 2 {
|
|
521 |
for _, r := range spaces {
|
|
522 |
_, _ = io.Copy(io.Discard, r)
|
|
523 |
}
|
|
524 |
} else {
|
|
525 |
stat.AvailableWidth -= 2
|
|
526 |
}
|
|
527 |
|
|
528 |
err = s.filler.Fill(s.buffers[2], stat)
|
| 520 | 529 |
if err != nil {
|
| 521 | 530 |
return nil, err
|
| 522 | 531 |
}
|
| 523 | 532 |
|
| 524 | |
if !s.trimSpace && stat.AvailableWidth >= 2 {
|
| 525 | |
stat.AvailableWidth -= 2
|
| 526 | |
writeFiller := func(buf *bytes.Buffer) error {
|
| 527 | |
return s.filler.Fill(buf, stat)
|
| 528 | |
}
|
| 529 | |
for _, fn := range []func(*bytes.Buffer) error{
|
| 530 | |
writeSpace,
|
| 531 | |
writeFiller,
|
| 532 | |
writeSpace,
|
| 533 | |
} {
|
| 534 | |
if err := fn(bufB); err != nil {
|
| 535 | |
return nil, err
|
| 536 | |
}
|
| 537 | |
}
|
| 538 | |
} else {
|
| 539 | |
err := s.filler.Fill(bufB, stat)
|
| 540 | |
if err != nil {
|
| 541 | |
return nil, err
|
| 542 | |
}
|
| 543 | |
}
|
| 544 | |
|
| 545 | |
return io.MultiReader(bufP, bufB, bufA), nil
|
|
533 |
return io.MultiReader(
|
|
534 |
s.buffers[0],
|
|
535 |
spaces[0],
|
|
536 |
s.buffers[2],
|
|
537 |
spaces[1],
|
|
538 |
s.buffers[1],
|
|
539 |
strings.NewReader("\n"),
|
|
540 |
), nil
|
| 546 | 541 |
}
|
| 547 | 542 |
|
| 548 | 543 |
func (s *bState) wSyncTable() (table syncTable) {
|
| 549 | 544 |
var count int
|
| 550 | 545 |
var row []chan int
|
| 551 | 546 |
|
| 552 | |
for i, decorators := range [][]decor.Decorator{
|
| 553 | |
s.pDecorators,
|
| 554 | |
s.aDecorators,
|
| 555 | |
} {
|
|
547 |
for i, decorators := range s.decorators {
|
| 556 | 548 |
for _, d := range decorators {
|
| 557 | 549 |
if ch, ok := d.Sync(); ok {
|
| 558 | 550 |
row = append(row, ch)
|
|
| 643 | 635 |
func writeSpace(buf *bytes.Buffer) error {
|
| 644 | 636 |
return buf.WriteByte(' ')
|
| 645 | 637 |
}
|
| 646 | |
|
| 647 | |
func firstNonNil(errors ...error) error {
|
| 648 | |
for _, err := range errors {
|
| 649 | |
if err != nil {
|
| 650 | |
return err
|
| 651 | |
}
|
| 652 | |
}
|
| 653 | |
return nil
|
| 654 | |
}
|