From bebdfd844ff65e982941642dbe4538ce0c4ef54f Mon Sep 17 00:00:00 2001 From: Bradley Cicenas Date: Fri, 6 Jan 2017 13:49:22 +0000 Subject: [PATCH] add ctop header, disabled by default --- config.go | 6 ++++-- containermap.go | 8 ++------ grid.go | 11 +++++++++-- widgets/header.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 widgets/header.go diff --git a/config.go b/config.go index 5b8e893..7282221 100644 --- a/config.go +++ b/config.go @@ -4,6 +4,7 @@ import ( "os" ) +var GlobalConfig = NewDefaultConfig() var configChan = make(chan ConfigMsg) type Config map[string]string @@ -23,8 +24,9 @@ func NewDefaultConfig() Config { docker = "unix:///var/run/docker.sock" } config := Config{ - "dockerHost": docker, - "sortField": "id", + "dockerHost": docker, + "sortField": "id", + "enableHeader": "0", } go func() { for m := range configChan { diff --git a/containermap.go b/containermap.go index 7704af3..89bf63d 100644 --- a/containermap.go +++ b/containermap.go @@ -9,16 +9,13 @@ var filters = map[string][]string{ } func NewContainerMap() *ContainerMap { - config := NewDefaultConfig() - // init docker client - client, err := docker.NewClient(config["dockerHost"]) + client, err := docker.NewClient(GlobalConfig["dockerHost"]) if err != nil { panic(err) } cm := &ContainerMap{ - config: config, client: client, containers: make(map[string]*Container), } @@ -27,7 +24,6 @@ func NewContainerMap() *ContainerMap { } type ContainerMap struct { - config Config client *docker.Client containers map[string]*Container } @@ -66,6 +62,6 @@ func (cm *ContainerMap) All() []*Container { for _, c := range cm.containers { containers = append(containers, c) } - SortContainers(cm.config["sortField"], containers) + SortContainers(GlobalConfig["sortField"], containers) return containers } diff --git a/grid.go b/grid.go index 6e21d51..cba83ee 100644 --- a/grid.go +++ b/grid.go @@ -3,6 +3,7 @@ package main import ( "fmt" + "github.com/bcicen/ctop/widgets" ui "github.com/gizak/termui" ) @@ -10,6 +11,7 @@ type Grid struct { cursorID string // id of currently selected container containers []*Container containerMap *ContainerMap + header *widgets.CTopHeader } func NewGrid() *Grid { @@ -19,6 +21,7 @@ func NewGrid() *Grid { cursorID: containers[0].id, containers: containers, containerMap: containerMap, + header: widgets.NewCTopHeader(), } } @@ -67,7 +70,11 @@ func (g *Grid) redrawRows() { ui.Body.Rows = []*ui.Row{} // build layout - ui.Body.AddRows(header()) + if GlobalConfig["enableHeader"] == "1" { + g.header.SetCount(len(g.containers)) + ui.Body.AddRows(g.header.Row()) + } + ui.Body.AddRows(fieldHeader()) for _, c := range g.containers { ui.Body.AddRows(c.widgets.Row()) } @@ -76,7 +83,7 @@ func (g *Grid) redrawRows() { ui.Render(ui.Body) } -func header() *ui.Row { +func fieldHeader() *ui.Row { return ui.NewRow( ui.NewCol(2, 0, headerPar("NAME")), ui.NewCol(2, 0, headerPar("CID")), diff --git a/widgets/header.go b/widgets/header.go new file mode 100644 index 0000000..8049388 --- /dev/null +++ b/widgets/header.go @@ -0,0 +1,47 @@ +package widgets + +import ( + "fmt" + "time" + + ui "github.com/gizak/termui" +) + +type CTopHeader struct { + Time *ui.Par + Count *ui.Par +} + +func NewCTopHeader() *CTopHeader { + return &CTopHeader{ + Time: headerPar(timeStr()), + Count: headerPar("-"), + } +} + +func (c *CTopHeader) Row() *ui.Row { + c.Time.Text = timeStr() + return ui.NewRow( + ui.NewCol(2, 0, c.Time), + ui.NewCol(2, 0, c.Count), + ) +} + +func (c *CTopHeader) SetCount(val int) { + c.Count.Text = fmt.Sprintf("%d containers", val) +} + +func timeStr() string { + return time.Now().Local().Format("15:04:05 MST") +} + +func headerPar(s string) *ui.Par { + p := ui.NewPar(fmt.Sprintf(" %s", s)) + p.Border = false + p.Height = 1 + p.Width = 20 + p.TextFgColor = ui.ColorDefault + p.TextBgColor = ui.ColorWhite + p.Bg = ui.ColorWhite + return p +}