Skip to content

Commit

Permalink
progress: support pinned messages with multiple lines (#233)
Browse files Browse the repository at this point in the history
  • Loading branch information
jedib0t committed Oct 2, 2022
1 parent 7d299c2 commit e88b800
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 130 deletions.
6 changes: 2 additions & 4 deletions cmd/demo-progress/demo.go
Expand Up @@ -90,10 +90,8 @@ func trackSomething(pw progress.Writer, idx int64, updateMessage bool) {
tracker.MarkAsErrored()
}
pw.SetPinnedMessages(
fmt.Sprintf("Current Time: %s | Total Time: %s",
time.Now().Format(time.RFC3339),
time.Now().Sub(timeStart).Round(time.Second),
),
fmt.Sprintf(">> Current Time: %-32s", time.Now().Format(time.RFC3339)),
fmt.Sprintf(">> Total Time: %-32s", time.Now().Sub(timeStart).Round(time.Millisecond)),
)
case <-updateTicker:
if updateMessage {
Expand Down
15 changes: 4 additions & 11 deletions progress/progress.go
Expand Up @@ -35,7 +35,8 @@ type Progress struct {
overallTracker *Tracker
overallTrackerMutex sync.RWMutex
pinnedMessages []string
pinnedMessagesMutex sync.RWMutex
pinnedMessageMutex sync.RWMutex
pinnedMessageNumLines int
renderInProgress bool
renderInProgressMutex sync.RWMutex
sortBy SortBy
Expand Down Expand Up @@ -157,14 +158,6 @@ func (p *Progress) Log(msg string, a ...interface{}) {
p.logsToRenderMutex.Unlock()
}

// PinnedMessages returns the current pinned messages.
func (p *Progress) PinnedMessages() []string {
p.pinnedMessagesMutex.RLock()
defer p.pinnedMessagesMutex.RUnlock()

return p.pinnedMessages
}

// SetAutoStop toggles the auto-stop functionality. Auto-stop set to true would
// mean that the Render() function will automatically stop once all currently
// active Trackers reach their final states. When set to false, the client code
Expand Down Expand Up @@ -197,8 +190,8 @@ func (p *Progress) SetOutputWriter(writer io.Writer) {
// progress bar. This method can be used to overwrite all the pinned messages.
// Call this function without arguments to "clear" the pinned messages.
func (p *Progress) SetPinnedMessages(messages ...string) {
p.pinnedMessagesMutex.Lock()
defer p.pinnedMessagesMutex.Unlock()
p.pinnedMessageMutex.Lock()
defer p.pinnedMessageMutex.Unlock()

p.pinnedMessages = messages
}
Expand Down
8 changes: 0 additions & 8 deletions progress/progress_test.go
Expand Up @@ -95,14 +95,6 @@ func TestProgress_Log(t *testing.T) {
assert.Len(t, p.logsToRender, 1)
}

func TestProgress_PinnedMessages(t *testing.T) {
p := Progress{}
assert.Nil(t, p.pinnedMessages)

p.pinnedMessages = []string{"pin1", "pin2"}
assert.Equal(t, []string{"pin1", "pin2"}, p.PinnedMessages())
}

func TestProgress_SetAutoStop(t *testing.T) {
p := Progress{}
assert.False(t, p.autoStop)
Expand Down
21 changes: 13 additions & 8 deletions progress/render.go
Expand Up @@ -159,22 +159,28 @@ func (p *Progress) moveCursorToTheTop(out *strings.Builder) {
numLinesToMoveUp++
}
if p.style.Visibility.Pinned {
numLinesToMoveUp += len(p.pinnedMessages)
numLinesToMoveUp += p.pinnedMessageNumLines
}
if numLinesToMoveUp > 0 {
out.WriteString(text.CursorUp.Sprintn(numLinesToMoveUp))
for numLinesToMoveUp > 0 {
out.WriteString(text.CursorUp.Sprint())
out.WriteString(text.EraseLine.Sprint())
numLinesToMoveUp--
}
}

func (p *Progress) renderPinnedMessages(out *strings.Builder) {
p.pinnedMessagesMutex.RLock()
defer p.pinnedMessagesMutex.RUnlock()
p.pinnedMessageMutex.RLock()
defer p.pinnedMessageMutex.RUnlock()

numLines := len(p.pinnedMessages)
for _, msg := range p.pinnedMessages {
out.WriteString(text.EraseLine.Sprint())
out.WriteString(p.Style().Colors.Pinned.Sprint(msg))
msg = strings.TrimSpace(msg)
out.WriteString(p.style.Colors.Pinned.Sprint(msg))
out.WriteRune('\n')

numLines += strings.Count(msg, "\n")
}
p.pinnedMessageNumLines = numLines
}

func (p *Progress) renderTracker(out *strings.Builder, t *Tracker, hint renderHint) {
Expand All @@ -194,7 +200,6 @@ func (p *Progress) renderTracker(out *strings.Builder, t *Tracker, hint renderHi
}
}

out.WriteString(text.EraseLine.Sprint())
if hint.isOverallTracker {
if !t.IsDone() {
hint := renderHint{hideValue: true, isOverallTracker: true}
Expand Down

0 comments on commit e88b800

Please sign in to comment.