Add progress bar
parent
d96fffabf8
commit
85251b17b1
|
|
@ -0,0 +1,114 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/vbauerster/mpb/v7"
|
||||||
|
"github.com/vbauerster/mpb/v7/decor"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ProgressState string
|
||||||
|
|
||||||
|
const (
|
||||||
|
ProgressStateConnecting ProgressState = "connecting"
|
||||||
|
ProgressStateDownloading ProgressState = "downloading"
|
||||||
|
ProgressStateCompleted ProgressState = "done"
|
||||||
|
ProgressStateAborted ProgressState = "aborted"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ProgressBar interface {
|
||||||
|
Increment(n int)
|
||||||
|
SetTotal(n int)
|
||||||
|
SetFileName(fileName string)
|
||||||
|
SetState(state ProgressState)
|
||||||
|
}
|
||||||
|
|
||||||
|
type progressBarImpl struct {
|
||||||
|
progress *mpb.Progress
|
||||||
|
*mpb.Bar
|
||||||
|
state ProgressState
|
||||||
|
total int
|
||||||
|
fileName string
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
barRefreshRateDefault = 180 * time.Millisecond
|
||||||
|
barWidthDefault = 40
|
||||||
|
barMaxFileNameWidth = 35
|
||||||
|
)
|
||||||
|
|
||||||
|
func createMpbBar(p *mpb.Progress, total int, taskName string, state ProgressState, queueBar *mpb.Bar) *mpb.Bar {
|
||||||
|
displayName := cutStr(taskName, barMaxFileNameWidth)
|
||||||
|
|
||||||
|
len := len(displayName)
|
||||||
|
if len != 0 {
|
||||||
|
displayName += ":"
|
||||||
|
len += 2
|
||||||
|
}
|
||||||
|
|
||||||
|
options := []mpb.BarOption{
|
||||||
|
mpb.PrependDecorators(
|
||||||
|
decor.Name(displayName, decor.WC{W: len, C: decor.DidentRight}),
|
||||||
|
decor.Name(string(state), decor.WCSyncSpaceR),
|
||||||
|
decor.CountersKibiByte("% .2f / % .2f"),
|
||||||
|
),
|
||||||
|
mpb.AppendDecorators(
|
||||||
|
decor.EwmaETA(decor.ET_STYLE_GO, 90),
|
||||||
|
decor.Name(" ] "),
|
||||||
|
decor.EwmaSpeed(decor.UnitKiB, "% .2f", 60),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
if queueBar != nil {
|
||||||
|
options = append([]mpb.BarOption{
|
||||||
|
mpb.BarQueueAfter(queueBar),
|
||||||
|
mpb.BarFillerClearOnComplete(),
|
||||||
|
}, options...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return p.Add(int64(total),
|
||||||
|
mpb.NewBarFiller(mpb.BarStyle().Rbound("|")),
|
||||||
|
options...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newProgressBarImpl() *progressBarImpl {
|
||||||
|
progress := mpb.New(
|
||||||
|
mpb.WithWidth(barWidthDefault),
|
||||||
|
mpb.WithRefreshRate(barRefreshRateDefault),
|
||||||
|
)
|
||||||
|
|
||||||
|
bar := createMpbBar(progress, 0, "", ProgressStateConnecting, nil)
|
||||||
|
return &progressBarImpl{
|
||||||
|
progress: progress,
|
||||||
|
total: 0,
|
||||||
|
state: ProgressStateConnecting,
|
||||||
|
Bar: bar,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bar *progressBarImpl) SetTotal(n int) {
|
||||||
|
bar.total = n
|
||||||
|
bar.Bar.SetTotal(int64(n), false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bar *progressBarImpl) SetFileName(fileName string) {
|
||||||
|
bar.fileName = fileName
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bar *progressBarImpl) Increment(n int) {
|
||||||
|
bar.IncrBy(n)
|
||||||
|
bar.DecoratorEwmaUpdate(time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bar *progressBarImpl) SetState(state ProgressState) {
|
||||||
|
if state != bar.state {
|
||||||
|
oldBar := bar.Bar
|
||||||
|
bar.Bar = createMpbBar(bar.progress, bar.total, bar.fileName, state, bar.Bar)
|
||||||
|
oldBar.SetTotal(0, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewProgressBar() ProgressBar {
|
||||||
|
return newProgressBarImpl()
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue