-
Notifications
You must be signed in to change notification settings - Fork 457
/
footer.go
127 lines (98 loc) · 2.72 KB
/
footer.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
121
122
123
124
125
126
127
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package components
import (
"fmt"
"sort"
"strings"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
"github.com/siderolabs/gen/maps"
)
// Footer represents the top bar with host info.
type Footer struct {
tview.TextView
selectedNode string
nodes []string
screenKeyToName map[string]string
selectedScreen string
}
// NewFooter initializes Footer.
func NewFooter(screenKeyToName map[string]string, nodes []string) *Footer {
var initialScreen string
for _, name := range screenKeyToName {
initialScreen = name
break
}
widget := &Footer{
TextView: *tview.NewTextView(),
screenKeyToName: screenKeyToName,
selectedScreen: initialScreen,
nodes: nodes,
}
widget.SetDynamicColors(true)
// set the background to be a horizontal line
widget.SetDrawFunc(func(screen tcell.Screen, x, y, width, height int) (int, int, int, int) {
for i := x; i < x+width; i++ {
for j := y; j < y+height; j++ {
screen.SetContent(
i,
j,
tview.BoxDrawingsLightHorizontal,
nil,
tcell.StyleDefault.Foreground(tcell.ColorWhite),
)
}
}
return x, y, width, height
})
widget.refresh()
return widget
}
// OnNodeSelect implements the NodeSelectListener interface.
func (widget *Footer) OnNodeSelect(node string) {
widget.selectedNode = node
widget.refresh()
}
// SelectScreen refreshes the footer with the tabs and screens data.
func (widget *Footer) SelectScreen(screen string) {
widget.selectedScreen = screen
widget.refresh()
}
func (widget *Footer) refresh() {
widget.SetText(fmt.Sprintf(
"[%s] --- %s",
widget.nodesText(),
widget.screensText(),
))
}
func (widget *Footer) nodesText() string {
nodesCopy := make([]string, 0, len(widget.nodes))
for _, node := range widget.nodes {
if node == widget.selectedNode {
name := node
if name == "" {
name = "(local)"
}
nodesCopy = append(nodesCopy, fmt.Sprintf("[red]%s[-]", name))
} else {
nodesCopy = append(nodesCopy, node)
}
}
return strings.Join(nodesCopy, " | ")
}
func (widget *Footer) screensText() string {
screenKeys := maps.Keys(widget.screenKeyToName)
sort.Strings(screenKeys)
screenTexts := make([]string, 0, len(widget.screenKeyToName))
for _, screenKey := range screenKeys {
screen := widget.screenKeyToName[screenKey]
if screen == widget.selectedScreen {
screenTexts = append(screenTexts, fmt.Sprintf("[[red]%s[-]]", screen))
} else {
screenTexts = append(screenTexts, fmt.Sprintf("[%s: %s]", screenKey, screen))
}
}
return strings.Join(screenTexts, " --- ")
}