From 6fc34c4c3cbb68f6f7cb8049a6d68bd315c07984 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sun, 6 Apr 2025 09:24:20 -0700 Subject: Fix terminal resize --- progress.go | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) (limited to 'progress.go') diff --git a/progress.go b/progress.go index 0f1a785..3a638ed 100644 --- a/progress.go +++ b/progress.go @@ -24,7 +24,7 @@ import ( "strings" "time" - "gitlab.com/rhogenson/vecdeque" + "gitlab.com/rhogenson/deque" "golang.org/x/term" ) @@ -36,8 +36,7 @@ type measurement struct { // Bar is a progess bar. type Bar struct { max int - measurements vecdeque.DQ[measurement] - cols int + measurements deque.Deque[measurement] secondPrint bool } @@ -48,8 +47,8 @@ func New(max int) *Bar { // Set sets the current value to val. func (b *Bar) Set(val int) { // Measurements must be strictly increasing - for b.measurements.Len() > 0 && b.measurements.Get(b.measurements.Len()-1).i > val { - b.measurements.PopBack() + if b.measurements.Len() > 0 && b.measurements.At(b.measurements.Len()-1).i > val { + b.measurements.Reset() } b.measurements.PushBack(measurement{time.Now(), val}) } @@ -61,11 +60,11 @@ func (b *Bar) Print() { } now := time.Now() - for b.measurements.Len() > 2 && now.Sub(b.measurements.Get(0).t) > 2*time.Minute { + for b.measurements.Len() > 2 && now.Sub(b.measurements.At(0).t) > 2*time.Minute { b.measurements.PopFront() } - first := b.measurements.Get(0) - last := b.measurements.Get(b.measurements.Len() - 1) + first := b.measurements.At(0) + last := b.measurements.At(b.measurements.Len() - 1) deltaT := last.t.Sub(first.t) delta := last.i - first.i eta := time.Duration(-1) @@ -77,14 +76,10 @@ func (b *Bar) Print() { fmt.Fprint(os.Stderr, "\033[2F\033[J") } b.secondPrint = true - if b.cols == 0 { - var err error - if b.cols, _, err = term.GetSize(int(os.Stderr.Fd())); err != nil { - fmt.Fprintf(os.Stderr, "Unable to determine terminal size: %s\n", err) - } - } - p := last.i * b.cols / b.max - if b.cols > 0 { + if cols, _, err := term.GetSize(int(os.Stderr.Fd())); err != nil { + fmt.Fprintf(os.Stderr, "Unable to determine terminal size: %s\n", err) + } else { + p := last.i * cols / b.max fmt.Fprintf(os.Stderr, "%s>\n", strings.Repeat("=", max(p-1, 0))) } if eta < 0 { -- cgit v1.3.1