diff --git a/bar.go b/bar.go index 2600f13..22935a1 100644 --- a/bar.go +++ b/bar.go @@ -54,8 +54,12 @@ buffers [3]*bytes.Buffer filler BarFiller middleware func(BarFiller) BarFiller - extender extenderFunc debugOut io.Writer + + extender struct { + fn extenderFunc + rev bool + } afterBar *Bar // key for (*pState).queueBars sync bool @@ -378,11 +382,16 @@ } } s.aborted = !s.completed - s.extender = makePanicExtender(p) + s.extender.fn = makePanicExtender(p) b.recoveredPanic = p } - if s.extender != nil { - rows = s.extender(rows, s.reqWidth, stat) + if fn := s.extender.fn; fn != nil { + rows = fn(rows, s.reqWidth, stat) + if s.extender.rev { + for left, right := 0, len(rows)-1; left < right; left, right = left+1, right-1 { + rows[left], rows[right] = rows[right], rows[left] + } + } } frame := &renderFrame{ rows: rows, @@ -403,8 +412,13 @@ if b.recoveredPanic == nil { rows = append(rows, s.draw(stat)) } - if s.extender != nil { - rows = s.extender(rows, s.reqWidth, stat) + if fn := s.extender.fn; fn != nil { + rows = fn(rows, s.reqWidth, stat) + if s.extender.rev { + for left, right := 0, len(rows)-1; left < right; left, right = left+1, right-1 { + rows[left], rows[right] = rows[right], rows[left] + } + } } frame := &renderFrame{ rows: rows, diff --git a/bar_option.go b/bar_option.go index c8f0688..9e0b9d8 100644 --- a/bar_option.go +++ b/bar_option.go @@ -119,13 +119,27 @@ } } -// BarExtender provides a way to extend bar to the next new line. +// BarExtender extends bar with arbitrary lines. Provided BarFiller will be +// called at each render/flush cycle. Any lines written to the underlying +// io.Writer will be printed after the bar itself. func BarExtender(filler BarFiller) BarOption { + return barExtender(filler, false) +} + +// BarExtenderRev extends bar with arbitrary lines in reverse order. Provided +// BarFiller will be called at each render/flush cycle. Any lines written +// to the underlying io.Writer will be printed before the bar itself. +func BarExtenderRev(filler BarFiller) BarOption { + return barExtender(filler, true) +} + +func barExtender(filler BarFiller, rev bool) BarOption { if filler == nil { return nil } return func(s *bState) { - s.extender = makeExtenderFunc(filler) + s.extender.fn = makeExtenderFunc(filler) + s.extender.rev = rev } }