ctop/menus.go

195 lines
3.8 KiB
Go
Raw Normal View History

2017-01-05 00:13:17 +01:00
package main
import (
2017-02-07 04:33:09 +01:00
"github.com/bcicen/ctop/config"
"github.com/bcicen/ctop/container"
2017-01-05 00:13:17 +01:00
"github.com/bcicen/ctop/widgets"
2017-02-15 08:40:16 +01:00
"github.com/bcicen/ctop/widgets/menu"
2017-01-05 00:13:17 +01:00
ui "github.com/gizak/termui"
)
2017-02-15 08:40:16 +01:00
var helpDialog = []menu.Item{
menu.Item{"[a] - toggle display of all containers", ""},
menu.Item{"[f] - filter displayed containers", ""},
2017-02-15 08:40:16 +01:00
menu.Item{"[h] - open this help dialog", ""},
2017-03-09 00:40:35 +01:00
menu.Item{"[H] - toggle ctop header", ""},
2017-02-15 08:40:16 +01:00
menu.Item{"[s] - select container sort field", ""},
menu.Item{"[r] - reverse container sort order", ""},
menu.Item{"[q] - exit ctop", ""},
2017-01-05 00:13:17 +01:00
}
2017-01-09 00:07:58 +01:00
func HelpMenu() {
ui.Clear()
2017-02-18 04:37:00 +01:00
ui.DefaultEvtStream.ResetHandlers()
defer ui.DefaultEvtStream.ResetHandlers()
2017-02-15 08:40:16 +01:00
m := menu.NewMenu()
2017-01-05 00:13:17 +01:00
m.BorderLabel = "Help"
2017-02-15 08:40:16 +01:00
m.AddItems(helpDialog...)
2017-01-05 00:13:17 +01:00
ui.Render(m)
ui.Handle("/sys/kbd/", func(ui.Event) {
ui.StopLoop()
})
ui.Loop()
}
2017-01-21 19:15:29 +01:00
func FilterMenu() {
ui.DefaultEvtStream.ResetHandlers()
2017-02-18 04:37:00 +01:00
defer ui.DefaultEvtStream.ResetHandlers()
2017-01-21 19:15:29 +01:00
i := widgets.NewInput()
i.BorderLabel = "Filter"
i.SetY(ui.TermHeight() - i.Height)
i.Data = config.GetVal("filterStr")
2017-01-21 19:15:29 +01:00
ui.Render(i)
// refresh container rows on input
stream := i.Stream()
go func() {
for s := range stream {
config.Update("filterStr", s)
2017-03-08 01:10:38 +01:00
RefreshDisplay()
ui.Render(i)
}
}()
2017-01-21 19:15:29 +01:00
i.InputHandlers()
ui.Handle("/sys/kbd/<escape>", func(ui.Event) {
config.Update("filterStr", "")
ui.StopLoop()
})
2017-01-21 19:15:29 +01:00
ui.Handle("/sys/kbd/<enter>", func(ui.Event) {
2017-02-07 04:33:09 +01:00
config.Update("filterStr", i.Data)
2017-01-21 19:15:29 +01:00
ui.StopLoop()
})
ui.Loop()
}
2017-01-09 00:07:58 +01:00
func SortMenu() {
ui.Clear()
2017-02-18 04:37:00 +01:00
ui.DefaultEvtStream.ResetHandlers()
defer ui.DefaultEvtStream.ResetHandlers()
2017-02-15 08:40:16 +01:00
m := menu.NewMenu()
2017-01-05 00:13:17 +01:00
m.Selectable = true
m.SortItems = true
2017-01-05 00:13:17 +01:00
m.BorderLabel = "Sort Field"
for _, field := range container.SortFields() {
2017-02-15 08:40:16 +01:00
m.AddItems(menu.Item{field, ""})
}
// set cursor position to current sort field
2017-02-19 04:54:24 +01:00
m.SetCursor(config.GetVal("sortField"))
HandleKeys("up", m.Up)
HandleKeys("down", m.Down)
HandleKeys("exit", ui.StopLoop)
2017-01-05 00:13:17 +01:00
ui.Handle("/sys/kbd/<enter>", func(ui.Event) {
2017-02-15 08:40:16 +01:00
config.Update("sortField", m.SelectedItem().Val)
2017-01-05 00:13:17 +01:00
ui.StopLoop()
})
ui.Render(m)
2017-01-05 00:13:17 +01:00
ui.Loop()
}
2017-11-20 12:09:36 +01:00
func ContainerMenu() {
c := cursor.Selected()
if c == nil {
return
}
ui.DefaultEvtStream.ResetHandlers()
defer ui.DefaultEvtStream.ResetHandlers()
m := menu.NewMenu()
m.Selectable = true
m.BorderLabel = "Menu"
var items []menu.Item
if c.Meta["state"] == "running" {
items = append(items, menu.Item{Val: "stop", Label: "stop"})
}
if c.Meta["state"] == "exited" {
items = append(items, menu.Item{Val: "start", Label: "start"})
items = append(items, menu.Item{Val: "remove", Label: "remove"})
}
items = append(items, menu.Item{Val: "cancel", Label: "cancel"})
m.AddItems(items...)
ui.Render(m)
HandleKeys("up", m.Up)
HandleKeys("down", m.Down)
ui.Handle("/sys/kbd/<enter>", func(ui.Event) {
switch m.SelectedItem().Val {
case "start":
c.Start()
ui.StopLoop()
case "stop":
c.Stop()
ui.StopLoop()
case "remove":
c.Remove()
ui.StopLoop()
case "cancel":
ui.StopLoop()
}
})
ui.Handle("/sys/kbd/", func(ui.Event) {
ui.StopLoop()
})
ui.Loop()
}
2017-11-25 19:30:50 +01:00
func LogMenu() {
c := cursor.Selected()
if c == nil {
return
}
ui.DefaultEvtStream.ResetHandlers()
defer ui.DefaultEvtStream.ResetHandlers()
logs, quit := logReader(c)
m := widgets.NewTextView(logs)
m.BorderLabel = "Logs"
ui.Render(m)
2017-11-28 14:55:29 +01:00
ui.Handle("/sys/wnd/resize", func(e ui.Event) {
m.Resize()
ui.Render(m)
})
2017-11-25 19:30:50 +01:00
ui.Handle("/sys/kbd/", func(ui.Event) {
quit <- true
ui.StopLoop()
})
ui.Loop()
}
func logReader(container *container.Container) (logs chan string, quit chan bool) {
logCollector := container.Logs()
stream := logCollector.Stream()
logs = make(chan string)
quit = make(chan bool)
go func() {
for {
select {
2017-11-28 14:40:43 +01:00
case log := <-stream:
2017-11-25 19:30:50 +01:00
logs <- log.Message
2017-11-28 14:40:43 +01:00
case <-quit:
2017-11-25 19:30:50 +01:00
logCollector.Stop()
close(logs)
return
}
}
}()
return
}