Add Marquee decorator for long message scrolling#126
Add Marquee decorator for long message scrolling#126DeathKing wants to merge 2 commits intovbauerster:masterfrom
Conversation
|
Implementation assumes that (string width = bytes width), therefore it's going to fail with non Latin strings. Try it for example with |
|
@vbauerster Da, I know what you mean, I noticed that issue too. After opened this PR and some investigation of mpb source code, I found the I implement this feature in my project like this (https://github.com/DeathKing/pico/blob/master/cmd/pdf2image/bar.go#L14-L28): bar.movFor this specific implementation, the API requires a getter function to obtain the text for display, which may not suitable for most case, a I'd like to know your opinion about this feature. |
|
Try this?🤔 func Marquee(t string, ws int, divider string, wcc ...decor.WC) decor.Decorator {
var count int
var f = func(s decor.Statistics) string {
length := runewidth.StringWidth(t + divider)
if runewidth.StringWidth(t) < ws {
return runewidth.FillRight(t, ws)
}
text := t + divider
var msg string
if count-ws > length {
msg = TruncateLeft(Truncate(text, count+ws), ws)
} else {
msg = TruncateLeft(Truncate(text, count+ws), count)
}
if count+ws > length {
msg += Truncate(text, count+ws-length)
}
count++
if count+ws >= len(t)+len(divider)-1 {
count = 0
}
return runewidth.FillRight(msg, ws)
}
return decor.Any(f, wcc...)
}
func Truncate(s string, size int) string {
return runewidth.Truncate(s, size, "")
}
func TruncateLeft(s string, size int) string {
return runewidth.TruncateLeft(s, size, "")
} |
Add Marquee decorator that scrolls text from right to
left, it is useful when displaying long messages. The codes are not carefully written, modifications are welcomed.