-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
log_indicator.go
120 lines (102 loc) · 2.74 KB
/
log_indicator.go
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package view
import (
"sync/atomic"
"github.com/derailed/k9s/internal/config"
"github.com/derailed/tview"
)
const (
autoscroll = "Autoscroll"
fullscreen = "FullScreen"
timestamp = "Timestamps"
wrap = "Wrap"
on = "On"
off = "Off"
spacer = " "
bold = "[::b]"
)
// LogIndicator represents a log view indicator.
type LogIndicator struct {
*tview.TextView
styles *config.Styles
scrollStatus int32
fullScreen bool
textWrap bool
showTime bool
}
// NewLogIndicator returns a new indicator.
func NewLogIndicator(cfg *config.Config, styles *config.Styles) *LogIndicator {
l := LogIndicator{
styles: styles,
TextView: tview.NewTextView(),
scrollStatus: 1,
fullScreen: cfg.K9s.Logger.FullScreenLogs,
textWrap: cfg.K9s.Logger.TextWrap,
showTime: cfg.K9s.Logger.ShowTime,
}
l.StylesChanged(styles)
styles.AddListener(&l)
l.SetTextAlign(tview.AlignCenter)
l.SetDynamicColors(true)
return &l
}
// StylesChanged notifies listener the skin changed.
func (l *LogIndicator) StylesChanged(styles *config.Styles) {
l.SetBackgroundColor(styles.K9s.Views.Log.Indicator.BgColor.Color())
l.SetTextColor(styles.K9s.Views.Log.Indicator.FgColor.Color())
}
// AutoScroll reports the current scrolling status.
func (l *LogIndicator) AutoScroll() bool {
return atomic.LoadInt32(&l.scrollStatus) == 1
}
// Timestamp reports the current timestamp mode.
func (l *LogIndicator) Timestamp() bool {
return l.showTime
}
// TextWrap reports the current wrap mode.
func (l *LogIndicator) TextWrap() bool {
return l.textWrap
}
// FullScreen reports the current screen mode.
func (l *LogIndicator) FullScreen() bool {
return l.fullScreen
}
// ToggleTimestamp toggles the current timestamp mode.
func (l *LogIndicator) ToggleTimestamp() {
l.showTime = !l.showTime
}
// ToggleFullScreen toggles the screen mode.
func (l *LogIndicator) ToggleFullScreen() {
l.fullScreen = !l.fullScreen
l.Refresh()
}
// ToggleTextWrap toggles the wrap mode.
func (l *LogIndicator) ToggleTextWrap() {
l.textWrap = !l.textWrap
l.Refresh()
}
// ToggleAutoScroll toggles the scroll mode.
func (l *LogIndicator) ToggleAutoScroll() {
var val int32 = 1
if l.AutoScroll() {
val = 0
}
atomic.StoreInt32(&l.scrollStatus, val)
l.Refresh()
}
// Refresh updates the view.
func (l *LogIndicator) Refresh() {
l.Clear()
l.update(autoscroll, l.AutoScroll(), spacer)
l.update(fullscreen, l.fullScreen, spacer)
l.update(timestamp, l.showTime, spacer)
l.update(wrap, l.textWrap, "")
}
func (l *LogIndicator) update(title string, state bool, padding string) {
bb := []byte(bold + title + ":")
if state {
bb = append(bb, []byte(on)...)
} else {
bb = append(bb, []byte(off)...)
}
_, _ = l.Write(append(bb, []byte(padding)...))
}