From 222a030e0b38a721bf0b01e0ffbdb57236f353c9 Mon Sep 17 00:00:00 2001 From: Bradley Cicenas Date: Wed, 4 Jan 2017 23:13:17 +0000 Subject: [PATCH] move menu widget into subpackage --- menus.go | 38 ++++++++++++ menu.go => widgets/menu.go | 118 ++++++++++++++----------------------- 2 files changed, 83 insertions(+), 73 deletions(-) create mode 100644 menus.go rename menu.go => widgets/menu.go (61%) diff --git a/menus.go b/menus.go new file mode 100644 index 0000000..d2083d8 --- /dev/null +++ b/menus.go @@ -0,0 +1,38 @@ +package main + +import ( + "github.com/bcicen/ctop/widgets" + ui "github.com/gizak/termui" +) + +var helpDialog = []string{ + "[h] - open this help dialog", + "[q] - exit ctop", +} + +func HelpMenu(g *Grid) { + m := widgets.NewMenu(helpDialog) + m.TextFgColor = ui.ColorWhite + m.BorderLabel = "Help" + m.BorderFg = ui.ColorCyan + ui.Render(m) + ui.Handle("/sys/kbd/", func(ui.Event) { + ui.StopLoop() + }) + ui.Loop() +} + +func SortMenu(g *Grid) { + m := widgets.NewMenu(SortFields) + m.Selectable = true + m.TextFgColor = ui.ColorWhite + m.BorderLabel = "Sort Field" + m.BorderFg = ui.ColorCyan + ui.Render(m) + m.NavigationHandlers() + ui.Handle("/sys/kbd/", func(ui.Event) { + g.containerMap.config.sortField = m.Items[m.CursorPos] + ui.StopLoop() + }) + ui.Loop() +} diff --git a/menu.go b/widgets/menu.go similarity index 61% rename from menu.go rename to widgets/menu.go index 25c2ec7..24890ec 100644 --- a/menu.go +++ b/widgets/menu.go @@ -1,4 +1,4 @@ -package main +package widgets import ( ui "github.com/gizak/termui" @@ -15,7 +15,7 @@ type Menu struct { TextFgColor ui.Attribute TextBgColor ui.Attribute Selectable bool - cursorPos int + CursorPos int } func NewMenu(items []string) *Menu { @@ -25,12 +25,54 @@ func NewMenu(items []string) *Menu { TextFgColor: ui.ThemeAttr("par.text.fg"), TextBgColor: ui.ThemeAttr("par.text.bg"), Selectable: false, - cursorPos: 0, + CursorPos: 0, } m.Width, m.Height = calcSize(items) return m } +func (m *Menu) Buffer() ui.Buffer { + var cell ui.Cell + buf := m.Block.Buffer() + + for n, item := range m.Items { + x := padding + for _, ch := range item { + // invert bg/fg colors on currently selected row + if m.Selectable && n == m.CursorPos { + cell = ui.Cell{Ch: ch, Fg: m.TextBgColor, Bg: m.TextFgColor} + } else { + cell = ui.Cell{Ch: ch, Fg: m.TextFgColor, Bg: m.TextBgColor} + } + buf.Set(x, n+padding, cell) + x++ + } + } + + return buf +} + +func (m *Menu) Up(ui.Event) { + if m.CursorPos > 0 { + m.CursorPos-- + ui.Render(m) + } +} + +func (m *Menu) Down(ui.Event) { + if m.CursorPos < (len(m.Items) - 1) { + m.CursorPos++ + ui.Render(m) + } +} + +// Setup some default handlers for menu navigation +func (m *Menu) NavigationHandlers() { + ui.Handle("/sys/kbd/", m.Up) + ui.Handle("/sys/kbd/", m.Down) + ui.Handle("/sys/kbd/q", func(ui.Event) { ui.StopLoop() }) +} + // return width and height based on menu items func calcSize(items []string) (w, h int) { h = len(items) + (padding * 2) @@ -45,73 +87,3 @@ func calcSize(items []string) (w, h int) { return w, h } - -func (m *Menu) Buffer() ui.Buffer { - var cell ui.Cell - - buf := m.Block.Buffer() - - for n, item := range m.Items { - x := padding - for _, ch := range item { - // invert bg/fg colors on currently selected row - if m.Selectable && n == m.cursorPos { - cell = ui.Cell{Ch: ch, Fg: m.TextBgColor, Bg: m.TextFgColor} - } else { - cell = ui.Cell{Ch: ch, Fg: m.TextFgColor, Bg: m.TextBgColor} - } - buf.Set(x, n+padding, cell) - x++ - } - } - - return buf -} - -func (m *Menu) Up(ui.Event) { - if m.cursorPos > 0 { - m.cursorPos-- - ui.Render(m) - } -} - -func (m *Menu) Down(ui.Event) { - if m.cursorPos < (len(m.Items) - 1) { - m.cursorPos++ - ui.Render(m) - } -} - -func HelpMenu(g *Grid) { - m := NewMenu([]string{ - "[h] - open this help dialog", - "[q] - exit ctop", - }) - m.TextFgColor = ui.ColorWhite - m.BorderLabel = "Help" - m.BorderFg = ui.ColorCyan - ui.Render(m) - ui.Handle("/sys/kbd/", func(ui.Event) { - ui.StopLoop() - }) - ui.Loop() -} - -func SortMenu(g *Grid) { - m := NewMenu(SortFields) - m.Selectable = true - m.TextFgColor = ui.ColorWhite - m.BorderLabel = "Sort Field" - m.BorderFg = ui.ColorCyan - ui.Render(m) - ui.Handle("/sys/kbd/", m.Up) - ui.Handle("/sys/kbd/", m.Down) - ui.Handle("/sys/kbd/q", func(ui.Event) { - ui.StopLoop() - }) - ui.Handle("/sys/kbd/", func(ui.Event) { - g.containerMap.config.sortField = m.Items[m.cursorPos] - ui.StopLoop() - }) - ui.Loop() -}