aerc/widgets/status.go -rw-r--r-- 2.0 KiB View raw
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package widgets

import (
	"time"

	"github.com/gdamore/tcell"
	"github.com/mattn/go-runewidth"

	"git.sr.ht/~sircmpwn/aerc/lib/ui"
)

type StatusLine struct {
	ui.Invalidatable
	stack    []*StatusMessage
	fallback StatusMessage
	aerc     *Aerc
}

type StatusMessage struct {
	bg      tcell.Color
	fg      tcell.Color
	message string
}

func NewStatusLine() *StatusLine {
1 reference
return &StatusLine{ fallback: StatusMessage{ bg: tcell.ColorDefault, fg: tcell.ColorDefault, message: "Idle", }, } } func (status *StatusLine) Invalidate() {
3 references
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] } style := tcell.StyleDefault. Background(line.bg).Foreground(line.fg).Reverse(true) ctx.Fill(0, 0, ctx.Width(), ctx.Height(), ' ', 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, style, "%s%s", message, pendingKeys) } func (status *StatusLine) Set(text string) *StatusMessage {
1 reference
status.fallback = StatusMessage{ bg: tcell.ColorDefault, fg: tcell.ColorDefault, message: text, } status.Invalidate() return &status.fallback } func (status *StatusLine) Push(text string, expiry time.Duration) *StatusMessage {
1 reference
msg := &StatusMessage{ bg: tcell.ColorDefault, fg: tcell.ColorDefault, 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() })() return msg } func (status *StatusLine) Expire() {
1 reference
status.stack = nil } func (status *StatusLine) SetAerc(aerc *Aerc) {
1 reference
status.aerc = aerc } func (msg *StatusMessage) Color(bg tcell.Color, fg tcell.Color) {
25 references
msg.bg = bg msg.fg = fg }