aerc/widgets/status.go
y0ast 03650474e2 update tcell to v2 and enable TrueColor support
Also update to the tcell v2 PaletteColor api, which should keep the chosen
theme of the user intact.

Note, that if $TRUECOLOR is defined and a truecolor given, aerc will now stop
clipping the value to one of the theme colors.
Generally this is desired behaviour though.
2020-12-18 07:23:22 +01:00

117 lines
2.6 KiB
Go

package widgets
import (
"time"
"github.com/gdamore/tcell/v2"
"github.com/mattn/go-runewidth"
"git.sr.ht/~sircmpwn/aerc/config"
"git.sr.ht/~sircmpwn/aerc/lib/ui"
)
type StatusLine struct {
ui.Invalidatable
stack []*StatusMessage
fallback StatusMessage
aerc *Aerc
uiConfig config.UIConfig
}
type StatusMessage struct {
style tcell.Style
message string
}
func NewStatusLine(uiConfig config.UIConfig) *StatusLine {
return &StatusLine{
fallback: StatusMessage{
style: uiConfig.GetStyle(config.STYLE_STATUSLINE_DEFAULT),
message: "Idle",
},
uiConfig: uiConfig,
}
}
func (status *StatusLine) Invalidate() {
status.DoInvalidate(status)
}
func (status *StatusLine) Draw(ctx *ui.Context) {
line := &status.fallback
if len(status.stack) != 0 {
line = status.stack[len(status.stack)-1]
}
ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', line.style)
pendingKeys := ""
if status.aerc != nil {
for _, pendingKey := range status.aerc.pendingKeys {
pendingKeys += string(pendingKey.Rune)
}
}
message := runewidth.FillRight(line.message, ctx.Width()-len(pendingKeys)-5)
ctx.Printf(0, 0, line.style, "%s%s", message, pendingKeys)
}
func (status *StatusLine) Set(text string) *StatusMessage {
status.fallback = StatusMessage{
style: status.uiConfig.GetStyle(config.STYLE_STATUSLINE_DEFAULT),
message: text,
}
status.Invalidate()
return &status.fallback
}
func (status *StatusLine) SetError(text string) *StatusMessage {
status.fallback = StatusMessage{
style: status.uiConfig.GetStyle(config.STYLE_STATUSLINE_ERROR),
message: text,
}
status.Invalidate()
return &status.fallback
}
func (status *StatusLine) Push(text string, expiry time.Duration) *StatusMessage {
msg := &StatusMessage{
style: status.uiConfig.GetStyle(config.STYLE_STATUSLINE_DEFAULT),
message: text,
}
status.stack = append(status.stack, msg)
go (func() {
time.Sleep(expiry)
for i, m := range status.stack {
if m == msg {
status.stack = append(status.stack[:i], status.stack[i+1:]...)
break
}
}
status.Invalidate()
})()
status.Invalidate()
return msg
}
func (status *StatusLine) PushError(text string) *StatusMessage {
msg := status.Push(text, 10*time.Second)
msg.Color(status.uiConfig.GetStyle(config.STYLE_STATUSLINE_ERROR))
return msg
}
func (status *StatusLine) PushSuccess(text string) *StatusMessage {
msg := status.Push(text, 10*time.Second)
msg.Color(status.uiConfig.GetStyle(config.STYLE_STATUSLINE_SUCCESS))
return msg
}
func (status *StatusLine) Expire() {
status.stack = nil
}
func (status *StatusLine) SetAerc(aerc *Aerc) {
status.aerc = aerc
}
func (msg *StatusMessage) Color(style tcell.Style) {
msg.style = style
}