-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathview.go
More file actions
127 lines (112 loc) · 3.28 KB
/
view.go
File metadata and controls
127 lines (112 loc) · 3.28 KB
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
package main
import (
"slices"
"time"
"github.com/charmbracelet/bubbles/viewport"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
)
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmd tea.Cmd
var cmds []tea.Cmd
switch msg := msg.(type) {
case RedisWorkerResponse:
m.lastUpdated[msg.WorkerId] = time.Now()
switch msg.Command {
case "getId":
if !slices.Contains(m.workerNames, msg.WorkerId) {
m.workerNames = append(m.workerNames, msg.WorkerId)
}
case "getStatus":
if !slices.Contains(m.workerNames, msg.WorkerId) {
m.workerNames = append(m.workerNames, msg.WorkerId)
}
m.workers[msg.WorkerId] = msg.Payload
}
case tea.WindowSizeMsg:
verticalMarginHeight := 2
leftSideWidth := m.workerTable.Width()
BaseStyle.Height(msg.Height - verticalMarginHeight)
FocusStyle.Height(msg.Height - verticalMarginHeight)
if !m.ready {
// Since this program is using the full size of the viewport we
// need to wait until we've received the window dimensions before
// we can initialize the viewport. The initial dimensions come in
// quickly, though asynchronously, which is why we wait for them
// here.
m.viewport = viewport.New(msg.Width, msg.Height-verticalMarginHeight)
m.viewport.YPosition = 0
m.viewport.HighPerformanceRendering = false
m.viewport.SetContent(RenderWorkerDetails(m))
m.ready = true
} else {
m.viewport.Width = msg.Width - leftSideWidth
m.jobsTable.SetWidth(msg.Width)
m.viewport.Height = msg.Height - verticalMarginHeight
m.jobsTable.SetHeight(msg.Height - verticalMarginHeight * 2)
}
case tea.KeyMsg:
selectedWorkerName, _ := m.GetSelectedRowName()
m.workerTable, cmd = m.workerTable.Update(msg)
cmds = append(cmds, cmd)
switch msg.String() {
case "ctrl+c", "q", tea.KeyEsc.String():
return m, tea.Quit
case "+":
IncreaseInterval()
case "-":
DecreaseInterval()
case "s", "up", "k", "down", "j":
if selectedWorkerName != "" {
SendGetStatusByName(selectedWorkerName)
}
case tea.KeyTab.String():
if m.workerTable.Focused() {
m.workerTable.Blur()
} else {
m.workerTable.Focus()
}
case "enter", " ":
m.showDetails = !m.showDetails
}
}
m.CheckStaleWorkers()
m.workerTable.SetRows(m.GetWorkerNamesAsRows())
m.jobsTable.SetRows(m.GetSelectedWorkerJobSummariesAsRows())
// Handle keyboard and mouse events in the viewport
m.viewport.SetContent(RenderWorkerDetails(m))
if m.workerTable.Focused() {
m.viewport, cmd = m.viewport.Update("")
} else {
m.viewport, cmd = m.viewport.Update(msg)
}
cmds = append(cmds, cmd)
return m, tea.Batch(cmds...)
}
func (m model) View() string {
if !m.ready {
return "\n Initializing..."
}
var leftStyle lipgloss.Style
var rightStyle lipgloss.Style
if m.workerTable.Focused() {
leftStyle = FocusStyle
rightStyle = BaseStyle
} else {
leftStyle = BaseStyle
rightStyle = FocusStyle
}
var leftSide string
leftSide = leftStyle.Render(m.workerTable.View())
var rightSide string
if m.showDetails {
rightSide = rightStyle.Render(m.viewport.View())
} else {
rightSide = rightStyle.Render(m.jobsTable.View())
}
return lipgloss.JoinHorizontal(
lipgloss.Left,
leftSide,
rightSide,
)
}