func (b *BarContainer) redrawAll(moveUp int) { c, _ := curse.New() newHistory := make(map[int]string) for line, printed := range b.history { newHistory[line+moveUp] = printed c.Move(1, line) c.EraseCurrentLine() c.Move(1, line+moveUp) c.EraseCurrentLine() fmt.Print(printed) } b.history = newHistory c.Move(c.StartingPosition.X, c.StartingPosition.Y) }
func (p *ProgressBar) Update(progress int) { bar := make([]string, p.Width) // avoid division by zero errors on non-properly constructed progressbars if p.Width == 0 { p.Width = 1 } if p.Total == 0 { p.Total = 1 } justGotToFirstEmptySpace := true for i, _ := range bar { if float32(progress)/float32(p.Total) > float32(i)/float32(p.Width) { bar[i] = string(p.Fill) } else { bar[i] = string(p.Empty) if justGotToFirstEmptySpace { bar[i] = string(p.Head) justGotToFirstEmptySpace = false } } } percent := "" if p.ShowPercent { asInt := int(100 * (float32(progress) / float32(p.Total))) padding := "" if asInt < 10 { padding = " " } else if asInt < 99 { padding = " " } percent = padding + strconv.Itoa(asInt) + "% " } timeElapsed := "" if p.ShowTimeElapsed { timeElapsed = " " + prettyTime(time.Since(p.StartTime)) } // record where we are, jump to the progress bar, update it, jump back c, _ := curse.New() c.Move(1, p.Line) c.EraseCurrentLine() fmt.Printf("\r%s %s%c%s%c%s", p.Prepend, percent, p.LeftEnd, strings.Join(bar, ""), p.RightEnd, timeElapsed) c.Move(c.StartingPosition.X, c.StartingPosition.Y) }