1
1
package tui
2
2
3
3
import (
4
+ "regexp"
4
5
"strings"
5
6
"time"
6
7
7
8
"github.com/pterm/pterm"
8
9
)
9
10
11
+ var (
12
+ stripControl = regexp .MustCompile ("( ?\x1b \\ [[0-9;]+m ?)+\n +$" )
13
+ defaultDuration = 200 * time .Millisecond
14
+ )
15
+
10
16
type display struct {
11
- area * pterm. AreaPrinter
17
+ area area
12
18
prompter * prompter
13
19
last time.Time
14
20
lastDuration time.Duration
15
21
stopped bool
16
22
}
17
23
18
24
func newDisplay (tool string ) (* display , error ) {
19
- area , err := pterm .DefaultArea .Start ()
20
- if err != nil {
21
- return nil , err
22
- }
23
-
24
25
prompter , err := newReadlinePrompter (tool )
25
26
if err != nil {
26
27
return nil , err
27
28
}
28
29
29
30
return & display {
30
- area : area ,
31
- prompter : prompter ,
31
+ prompter : prompter ,
32
+ lastDuration : defaultDuration ,
32
33
}, nil
33
34
}
34
35
@@ -44,7 +45,7 @@ func (a *display) setMultiLinePrompt(text string) {
44
45
lines := strings .Split (text , "\n " )
45
46
a .prompter .SetPrompt (lines [len (lines )- 1 ])
46
47
if len (lines ) > 1 {
47
- a .area .Update (a .area .GetContent () + "\n " + strings .Join (lines [:len (lines )- 1 ], "\n " ) + "\n " )
48
+ a .area .Update (a .area .content + "\n " + strings .Join (lines [:len (lines )- 1 ], "\n " ) + "\n " )
48
49
}
49
50
}
50
51
@@ -80,15 +81,17 @@ func (a *display) Prompt(text string) (string, bool, error) {
80
81
}
81
82
82
83
func (a * display ) Progress (text string ) error {
84
+ if text == "" {
85
+ return nil
86
+ }
87
+
88
+ text = stripControl .ReplaceAllString (text , "" )
89
+
83
90
if a .stopped {
84
- area , err := pterm .DefaultArea .Start ()
85
- if err != nil {
86
- return err
87
- }
88
- a .area = area
91
+ a .area = area {}
89
92
a .stopped = false
90
93
a .last = time.Time {}
91
- a .lastDuration = 200 * time . Millisecond
94
+ a .lastDuration = defaultDuration
92
95
}
93
96
94
97
start := time .Now ()
@@ -99,15 +102,13 @@ func (a *display) Progress(text string) error {
99
102
lines = lines [len (lines )- height :]
100
103
}
101
104
newText := strings .Join (lines , "\n " )
102
- if a .area .GetContent () != newText {
103
- a .area .Update (newText )
104
- }
105
+ a .area .Update (newText )
105
106
done := time .Now ()
106
107
delta := done .Sub (start )
107
108
if delta > a .lastDuration {
108
109
a .lastDuration = delta
109
110
}
110
- a .last = start
111
+ a .last = done
111
112
}
112
113
113
114
return nil
@@ -117,11 +118,10 @@ func (a *display) Close() error {
117
118
return a .prompter .Close ()
118
119
}
119
120
120
- func (a * display ) Finished (text string ) error {
121
+ func (a * display ) Finished (text string ) {
121
122
if ! strings .HasSuffix (text , "\n " ) {
122
123
text += "\n "
123
124
}
124
125
a .stopped = true
125
- a .area .Update (text )
126
- return a .area .Stop ()
126
+ a .area .Finish (text )
127
127
}
0 commit comments