diff --git a/pb.go b/pb.go index 01c7157..937b319 100644 --- a/pb.go +++ b/pb.go @@ -81,6 +81,8 @@ type ProgressBar struct { currentValue int64 prefix, postfix string + + lastPrint string BarStart string BarEnd string @@ -287,8 +289,9 @@ func (pb *ProgressBar) write(current int64) { if len(out) < width { end = strings.Repeat(" ", width-len(out)) } - + // and print! + pb.lastPrint = out+end switch { case pb.Output != nil: fmt.Fprint(pb.Output, "\r"+out+end) @@ -322,6 +325,10 @@ func (pb *ProgressBar) Update() { } } +func (pb *ProgressBar) String() string { + return pb.lastPrint +} + // Internal loop for writing progressbar func (pb *ProgressBar) writer() { for { diff --git a/pool.go b/pool.go new file mode 100644 index 0000000..0e84e79 --- /dev/null +++ b/pool.go @@ -0,0 +1,51 @@ +package pb + +import ( + "fmt" + "time" +) + +type Pool struct { + RefreshRate time.Duration + bars []*ProgressBar +} + +func (p *Pool) Add(pbs ...*ProgressBar) { + for _, bar := range pbs { + bar.ManualUpdate = true + bar.NotPrint = true + bar.Start() + p.bars = append(p.bars, bar) + } +} + +func (p *Pool) Start() { + p.RefreshRate = DefaultRefreshRate + go p.writer() +} + +func (p *Pool) writer() { + var first = true + var out string + for { + if first { + out = "" + first = false + } else { + out = fmt.Sprintf("\033[%dA", len(p.bars)) + } + isFinished := true + for _, bar := range p.bars { + bar.Update() + out += fmt.Sprintf("\r%s\n", bar.String()) + if !bar.isFinish { + isFinished = false + } + } + fmt.Print(out) + if isFinished { + return + } + time.Sleep(p.RefreshRate) + } +}