k9s/views/flash.go

86 lines
1.4 KiB
Go

package views
import (
"context"
"strings"
"time"
"github.com/gdamore/tcell"
"github.com/k8sland/tview"
)
const (
flashInfo flashLevel = iota
flashWarn
flashErr
flashFatal
flashDelay = 5
)
type (
flashLevel int
flashView struct {
*tview.TextView
cancel context.CancelFunc
app *tview.Application
}
)
func newFlashView(app *tview.Application, m string) *flashView {
f := flashView{app: app, TextView: tview.NewTextView()}
f.SetTextColor(tcell.ColorAqua)
f.SetTextAlign(tview.AlignLeft)
f.SetBorderPadding(0, 0, 1, 1)
return &f
}
func (f *flashView) setMessage(level flashLevel, msg ...string) {
if f.cancel != nil {
f.cancel()
}
ctx, cancel := context.WithTimeout(context.TODO(), flashDelay*time.Second)
f.cancel = cancel
go func(ctx context.Context) {
m := strings.Join(msg, " ")
f.SetTextColor(flashColor(level))
f.SetText(flashEmoji(level) + " " + m)
f.app.Draw()
for {
select {
case <-ctx.Done():
f.Clear()
f.app.Draw()
return
}
}
}(ctx)
}
func flashEmoji(l flashLevel) string {
switch l {
case flashWarn:
return "😗"
case flashErr:
return "😡"
case flashFatal:
return "💀"
default:
return "😎"
}
}
func flashColor(l flashLevel) tcell.Color {
switch l {
case flashWarn:
return tcell.ColorOrange
case flashErr:
return tcell.ColorOrangeRed
case flashFatal:
return tcell.ColorFuchsia
default:
return tcell.ColorNavajoWhite
}
}