ctop/grid.go

155 lines
2.7 KiB
Go
Raw Normal View History

2016-12-22 17:15:22 +01:00
package main
import (
2016-12-27 03:24:02 +01:00
"fmt"
2016-12-22 17:15:22 +01:00
ui "github.com/gizak/termui"
)
type Grid struct {
2017-01-02 17:04:22 +01:00
cursorID string // id of currently selected container
containers []*Container
containerMap *ContainerMap
2016-12-22 17:15:22 +01:00
}
2016-12-30 22:14:07 +01:00
func NewGrid() *Grid {
2017-01-02 17:04:22 +01:00
containerMap := NewContainerMap()
2017-01-03 18:37:09 +01:00
containers := containerMap.All()
2016-12-30 22:14:07 +01:00
return &Grid{
2017-01-02 17:04:22 +01:00
cursorID: containers[0].id,
containers: containers,
containerMap: containerMap,
2016-12-30 22:14:07 +01:00
}
2016-12-26 19:39:15 +01:00
}
2017-01-02 17:04:22 +01:00
// Return current cursor index
2017-01-02 21:14:35 +01:00
func (g *Grid) cursorIdx() int {
2017-01-02 17:04:22 +01:00
for n, c := range g.containers {
if c.id == g.cursorID {
return n
}
}
return 0
}
2017-01-02 21:14:35 +01:00
func (g *Grid) cursorUp() {
idx := g.cursorIdx()
2017-01-02 17:04:22 +01:00
// decrement if possible
if idx > 0 {
g.cursorID = g.containers[idx-1].id
2017-01-02 21:14:35 +01:00
g.redrawCursor()
2017-01-02 17:04:22 +01:00
}
}
2017-01-02 21:14:35 +01:00
func (g *Grid) cursorDown() {
idx := g.cursorIdx()
2017-01-02 17:04:22 +01:00
// increment if possible
if idx < (len(g.containers) - 1) {
g.cursorID = g.containers[idx+1].id
2017-01-02 21:14:35 +01:00
g.redrawCursor()
2016-12-22 17:15:22 +01:00
}
}
2016-12-26 19:39:15 +01:00
// Redraw the cursor with the currently selected row
2017-01-02 21:14:35 +01:00
func (g *Grid) redrawCursor() {
2017-01-02 17:04:22 +01:00
for _, c := range g.containers {
if c.id == g.cursorID {
c.widgets.Highlight()
2016-12-26 19:39:15 +01:00
} else {
c.widgets.UnHighlight()
2016-12-26 19:39:15 +01:00
}
2017-01-02 17:04:22 +01:00
ui.Render(ui.Body)
2016-12-26 19:39:15 +01:00
}
}
2017-01-02 21:14:35 +01:00
func (g *Grid) redrawRows() {
2016-12-30 23:10:49 +01:00
// reinit body rows
ui.Body.Rows = []*ui.Row{}
2017-01-02 21:14:35 +01:00
2016-12-30 23:10:49 +01:00
// build layout
ui.Body.AddRows(header())
2017-01-02 17:04:22 +01:00
for _, c := range g.containers {
ui.Body.AddRows(c.widgets.Row())
2016-12-22 17:15:22 +01:00
}
2016-12-30 23:10:49 +01:00
ui.Body.Align()
ui.Render(ui.Body)
2016-12-22 17:15:22 +01:00
}
func header() *ui.Row {
return ui.NewRow(
2016-12-28 04:01:44 +01:00
ui.NewCol(2, 0, headerPar("NAME")),
ui.NewCol(2, 0, headerPar("CID")),
2016-12-27 03:24:02 +01:00
ui.NewCol(2, 0, headerPar("CPU")),
ui.NewCol(2, 0, headerPar("MEM")),
ui.NewCol(2, 0, headerPar("NET RX/TX")),
2016-12-22 17:15:22 +01:00
)
}
2016-12-27 03:24:02 +01:00
func headerPar(s string) *ui.Par {
p := ui.NewPar(fmt.Sprintf(" %s", s))
p.Border = false
p.Height = 2
p.Width = 20
p.TextFgColor = ui.ColorWhite
return p
}
2017-01-03 00:40:55 +01:00
type View func(*Grid)
func ResetView() {
ui.DefaultEvtStream.ResetHandlers()
ui.Clear()
}
2017-01-03 00:40:55 +01:00
func (g *Grid) OpenView(v View) {
ResetView()
defer ResetView()
2017-01-03 00:40:55 +01:00
v(g)
}
func Display(g *Grid) bool {
var newView View
2016-12-22 17:15:22 +01:00
// calculate layout
ui.Body.Align()
2017-01-02 21:14:35 +01:00
g.redrawCursor()
2016-12-22 17:15:22 +01:00
ui.Render(ui.Body)
2016-12-26 19:39:15 +01:00
ui.Handle("/sys/kbd/<up>", func(ui.Event) {
2017-01-02 21:14:35 +01:00
g.cursorUp()
2016-12-26 19:39:15 +01:00
})
ui.Handle("/sys/kbd/<down>", func(ui.Event) {
2017-01-02 21:14:35 +01:00
g.cursorDown()
2016-12-26 19:39:15 +01:00
})
ui.Handle("/sys/kbd/h", func(ui.Event) {
2017-01-03 00:40:55 +01:00
newView = HelpMenu
ui.StopLoop()
})
ui.Handle("/sys/kbd/s", func(ui.Event) {
newView = SortMenu
ui.StopLoop()
})
2016-12-22 17:15:22 +01:00
ui.Handle("/sys/kbd/q", func(ui.Event) {
ui.StopLoop()
})
ui.Handle("/timer/1s", func(e ui.Event) {
2017-01-03 18:37:09 +01:00
g.containers = g.containerMap.All() // refresh containers for current sort order
2017-01-02 21:14:35 +01:00
g.redrawRows()
2016-12-22 17:15:22 +01:00
})
ui.Handle("/sys/wnd/resize", func(e ui.Event) {
ui.Body.Width = ui.TermWidth()
ui.Body.Align()
ui.Clear()
ui.Render(ui.Body)
})
ui.Loop()
if newView != nil {
2017-01-03 00:40:55 +01:00
g.OpenView(newView)
return false
}
return true
2016-12-22 17:15:22 +01:00
}