ctop/grid.go

256 lines
4.6 KiB
Go
Raw Permalink Normal View History

2016-12-22 17:15:22 +01:00
package main
import (
2017-02-07 04:33:09 +01:00
"github.com/bcicen/ctop/config"
2017-08-05 13:28:20 +02:00
"github.com/bcicen/ctop/cwidgets/single"
2016-12-22 17:15:22 +01:00
ui "github.com/gizak/termui"
)
func ShowConnError(err error) (exit bool) {
ui.Clear()
ui.DefaultEvtStream.ResetHandlers()
defer ui.DefaultEvtStream.ResetHandlers()
setErr := func(err error) {
errView.Append(err.Error())
errView.Append("attempting to reconnect...")
ui.Render(errView)
}
HandleKeys("exit", func() {
exit = true
ui.StopLoop()
})
2019-05-22 19:39:37 +02:00
ui.Handle("/timer/1s", func(ui.Event) {
_, err := cursor.RefreshContainers()
if err == nil {
ui.StopLoop()
return
}
setErr(err)
})
ui.Handle("/sys/wnd/resize", func(e ui.Event) {
errView.Resize()
ui.Clear()
ui.Render(errView)
log.Infof("RESIZE")
})
errView.Resize()
setErr(err)
ui.Loop()
return exit
}
2017-03-08 01:10:38 +01:00
func RedrawRows(clr bool) {
2016-12-30 23:10:49 +01:00
// reinit body rows
cGrid.Clear()
2017-01-02 21:14:35 +01:00
2016-12-30 23:10:49 +01:00
// build layout
y := 1
if config.GetSwitchVal("enableHeader") {
header.SetCount(cursor.Len())
2017-03-06 03:00:30 +01:00
header.SetFilter(config.GetVal("filterStr"))
y += header.Height()
2017-01-06 14:49:22 +01:00
}
cGrid.SetY(y)
2017-02-24 10:10:14 +01:00
for _, c := range cursor.filtered {
2017-03-03 08:57:26 +01:00
cGrid.AddRows(c.Widgets)
2017-02-24 10:10:14 +01:00
}
2017-03-08 01:10:38 +01:00
if clr {
ui.Clear()
log.Debugf("screen cleared")
}
if config.GetSwitchVal("enableHeader") {
ui.Render(header)
}
cGrid.Align()
ui.Render(cGrid)
2016-12-22 17:15:22 +01:00
}
func SingleView() MenuFn {
c := cursor.Selected()
if c == nil {
return nil
}
2017-03-06 09:51:50 +01:00
ui.Clear()
ui.DefaultEvtStream.ResetHandlers()
defer ui.DefaultEvtStream.ResetHandlers()
ex := single.NewSingle()
c.SetUpdater(ex)
2017-03-06 09:51:50 +01:00
ex.Align()
ui.Render(ex)
HandleKeys("up", ex.Up)
HandleKeys("down", ex.Down)
ui.Handle("/sys/kbd/", func(ui.Event) { ui.StopLoop() })
ui.Handle("/timer/1s", func(ui.Event) { ui.Render(ex) })
ui.Handle("/sys/wnd/resize", func(e ui.Event) {
ex.SetWidth(ui.TermWidth())
ex.Align()
2017-03-08 01:52:31 +01:00
log.Infof("resize: width=%v max-rows=%v", ex.Width, cGrid.MaxRows())
2017-03-06 09:51:50 +01:00
})
ui.Loop()
2017-03-06 09:51:50 +01:00
c.SetUpdater(c.Widgets)
return nil
2017-03-06 09:51:50 +01:00
}
2017-01-06 20:46:30 +01:00
func RefreshDisplay() error {
// skip display refresh during scroll
if !cursor.isScrolling {
needsClear, err := cursor.RefreshContainers()
if err != nil {
return err
}
RedrawRows(needsClear)
}
return nil
2017-03-08 01:10:38 +01:00
}
func Display() bool {
var menu MenuFn
var connErr error
cGrid.SetWidth(ui.TermWidth())
2017-02-05 01:56:45 +01:00
ui.DefaultEvtStream.Hook(logEvent)
// initial draw
2017-03-06 03:00:30 +01:00
header.Align()
status.Align()
cursor.RefreshContainers()
2017-03-08 01:10:38 +01:00
RedrawRows(true)
2016-12-22 17:15:22 +01:00
HandleKeys("up", cursor.Up)
HandleKeys("down", cursor.Down)
2017-03-24 03:31:08 +01:00
HandleKeys("pgup", cursor.PgUp)
HandleKeys("pgdown", cursor.PgDown)
HandleKeys("exit", ui.StopLoop)
HandleKeys("help", func() {
menu = HelpMenu
ui.StopLoop()
})
ui.Handle("/sys/kbd/<enter>", func(ui.Event) {
2017-11-20 12:09:36 +01:00
menu = ContainerMenu
ui.StopLoop()
})
ui.Handle("/sys/kbd/<left>", func(ui.Event) {
menu = LogMenu
ui.StopLoop()
})
ui.Handle("/sys/kbd/<right>", func(ui.Event) {
menu = SingleView
ui.StopLoop()
})
2017-11-25 19:30:50 +01:00
ui.Handle("/sys/kbd/l", func(ui.Event) {
menu = LogMenu
ui.StopLoop()
})
ui.Handle("/sys/kbd/e", func(ui.Event) {
2018-10-25 20:52:59 +02:00
menu = ExecShell
ui.StopLoop()
})
ui.Handle("/sys/kbd/w", func(ui.Event) {
menu = OpenInBrowser()
})
ui.Handle("/sys/kbd/o", func(ui.Event) {
menu = SingleView
2017-03-06 09:51:50 +01:00
ui.StopLoop()
2017-01-06 20:46:30 +01:00
})
ui.Handle("/sys/kbd/a", func(ui.Event) {
config.Toggle("allContainers")
connErr = RefreshDisplay()
if connErr != nil {
ui.StopLoop()
}
})
ui.Handle("/sys/kbd/D", func(ui.Event) {
dumpContainer(cursor.Selected())
})
2017-01-21 19:15:29 +01:00
ui.Handle("/sys/kbd/f", func(ui.Event) {
menu = FilterMenu
ui.StopLoop()
})
2017-02-13 04:37:17 +01:00
ui.Handle("/sys/kbd/H", func(ui.Event) {
config.Toggle("enableHeader")
2017-03-08 01:10:38 +01:00
RedrawRows(true)
2017-02-13 04:37:17 +01:00
})
2017-01-21 19:15:29 +01:00
ui.Handle("/sys/kbd/r", func(e ui.Event) {
2017-02-07 04:33:09 +01:00
config.Toggle("sortReversed")
2017-01-12 20:48:29 +01:00
})
ui.Handle("/sys/kbd/s", func(ui.Event) {
menu = SortMenu
2016-12-22 17:15:22 +01:00
ui.StopLoop()
})
2020-01-03 00:02:53 +01:00
ui.Handle("/sys/kbd/c", func(ui.Event) {
menu = ColumnsMenu
ui.StopLoop()
})
ui.Handle("/sys/kbd/S", func(ui.Event) {
path, err := config.Write()
if err == nil {
log.Statusf("wrote config to %s", path)
} else {
log.StatusErr(err)
}
ui.StopLoop()
})
2017-02-23 23:00:05 +01:00
2016-12-22 17:15:22 +01:00
ui.Handle("/timer/1s", func(e ui.Event) {
if log.StatusQueued() {
ui.StopLoop()
}
connErr = RefreshDisplay()
if connErr != nil {
ui.StopLoop()
}
2016-12-22 17:15:22 +01:00
})
ui.Handle("/sys/wnd/resize", func(e ui.Event) {
2017-03-06 03:00:30 +01:00
header.Align()
status.Align()
cursor.ScrollPage()
cGrid.SetWidth(ui.TermWidth())
2017-03-08 01:52:31 +01:00
log.Infof("resize: width=%v max-rows=%v", cGrid.Width, cGrid.MaxRows())
2017-03-08 01:10:38 +01:00
RedrawRows(true)
2016-12-22 17:15:22 +01:00
})
ui.Loop()
if connErr != nil {
return ShowConnError(connErr)
}
if log.StatusQueued() {
for sm := range log.FlushStatus() {
if sm.IsError {
status.ShowErr(sm.Text)
} else {
status.Show(sm.Text)
}
}
return false
}
2017-01-09 00:07:58 +01:00
if menu != nil {
for menu != nil {
menu = menu()
}
2017-03-06 09:51:50 +01:00
return false
}
return true
2016-12-22 17:15:22 +01:00
}