From 22a560701276281d2ba7f5446af68b0756fc1650 Mon Sep 17 00:00:00 2001 From: Bradley Cicenas Date: Thu, 2 Jan 2020 23:02:53 +0000 Subject: [PATCH] init column config menu --- config/columns.go | 7 ++++ config/switch.go | 5 ++- container/main.go | 6 ++++ cwidgets/compact/grid.go | 21 +++++++----- cwidgets/compact/header.go | 5 ++- cwidgets/main.go | 8 +++++ grid.go | 4 +++ menus.go | 67 ++++++++++++++++++++++++++++++++++++-- widgets/menu/main.go | 9 +++++ 9 files changed, 117 insertions(+), 15 deletions(-) diff --git a/config/columns.go b/config/columns.go index 90d7b38..b59a50e 100644 --- a/config/columns.go +++ b/config/columns.go @@ -69,6 +69,13 @@ func EnabledColumns() (a []string) { return a } +// ColumnToggle toggles the enabled status of a given column name +func ColumnToggle(name string) { + col := GlobalColumns[colIndex(name)] + col.Enabled = !col.Enabled + log.Noticef("config change [column-%s]: %t -> %t", col.Name, !col.Enabled, col.Enabled) +} + // ColumnLeft moves the column with given name up one position, if possible func ColumnLeft(name string) { idx := colIndex(name) diff --git a/config/switch.go b/config/switch.go index b5c3673..dca9bc4 100644 --- a/config/switch.go +++ b/config/switch.go @@ -72,8 +72,7 @@ func Toggle(k string) { lock.Lock() defer lock.Unlock() - newVal := !sw.Val - log.Noticef("config change [%s]: %t -> %t", k, sw.Val, newVal) - sw.Val = newVal + sw.Val = !sw.Val + log.Noticef("config change [%s]: %t -> %t", k, !sw.Val, sw.Val) //log.Errorf("ignoring toggle for non-existant switch: %s", k) } diff --git a/container/main.go b/container/main.go index 88b3619..e0b0c3f 100644 --- a/container/main.go +++ b/container/main.go @@ -42,6 +42,12 @@ func New(id string, collector collector.Collector, manager manager.Manager) *Con } } +func (c *Container) RecreateWidgets() { + c.SetUpdater(cwidgets.NullWidgetUpdater{}) + c.Widgets = compact.NewCompactRow() + c.SetUpdater(c.Widgets) +} + func (c *Container) SetUpdater(u cwidgets.WidgetUpdater) { c.updater = u c.updater.SetMeta(c.Meta) diff --git a/cwidgets/compact/grid.go b/cwidgets/compact/grid.go index 3e95ec7..5a3f99f 100644 --- a/cwidgets/compact/grid.go +++ b/cwidgets/compact/grid.go @@ -17,7 +17,7 @@ type CompactGrid struct { func NewCompactGrid() *CompactGrid { cg := &CompactGrid{header: NewCompactHeader()} - cg.RebuildHeader() + cg.rebuildHeader() return cg } @@ -30,6 +30,7 @@ func (cg *CompactGrid) Align() { // update row ypos, width recursively colWidths := cg.calcWidths() + cg.header.SetWidths(cg.Width, colWidths) for _, r := range cg.pageRows() { r.SetY(y) y += r.GetHeight() @@ -37,15 +38,11 @@ func (cg *CompactGrid) Align() { } } -func (cg *CompactGrid) RebuildHeader() { - cg.cols = newRowWidgets() - cg.header.clearFieldPars() - for _, col := range cg.cols { - cg.header.addFieldPar(col.Header()) - } +func (cg *CompactGrid) Clear() { + cg.Rows = []RowBufferer{} + cg.rebuildHeader() } -func (cg *CompactGrid) Clear() { cg.Rows = []RowBufferer{} } func (cg *CompactGrid) GetHeight() int { return len(cg.Rows) + cg.header.Height } func (cg *CompactGrid) SetX(x int) { cg.X = x } func (cg *CompactGrid) SetY(y int) { cg.Y = y } @@ -93,3 +90,11 @@ func (cg *CompactGrid) Buffer() ui.Buffer { func (cg *CompactGrid) AddRows(rows ...RowBufferer) { cg.Rows = append(cg.Rows, rows...) } + +func (cg *CompactGrid) rebuildHeader() { + cg.cols = newRowWidgets() + cg.header.clearFieldPars() + for _, col := range cg.cols { + cg.header.addFieldPar(col.Header()) + } +} diff --git a/cwidgets/compact/header.go b/cwidgets/compact/header.go index bec7533..44fe5af 100644 --- a/cwidgets/compact/header.go +++ b/cwidgets/compact/header.go @@ -14,7 +14,10 @@ type CompactHeader struct { } func NewCompactHeader() *CompactHeader { - return &CompactHeader{Height: 2} + return &CompactHeader{ + X: rowPadding, + Height: 2, + } } func (row *CompactHeader) GetHeight() int { diff --git a/cwidgets/main.go b/cwidgets/main.go index fd2f68b..2bb8e89 100644 --- a/cwidgets/main.go +++ b/cwidgets/main.go @@ -11,3 +11,11 @@ type WidgetUpdater interface { SetMeta(models.Meta) SetMetrics(models.Metrics) } + +type NullWidgetUpdater struct{} + +// NullWidgetUpdater implements WidgetUpdater +func (wu NullWidgetUpdater) SetMeta(models.Meta) {} + +// NullWidgetUpdater implements WidgetUpdater +func (wu NullWidgetUpdater) SetMetrics(models.Metrics) {} diff --git a/grid.go b/grid.go index 655e000..9efced3 100644 --- a/grid.go +++ b/grid.go @@ -191,6 +191,10 @@ func Display() bool { menu = SortMenu ui.StopLoop() }) + 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 { diff --git a/menus.go b/menus.go index 16c18b7..55aa88b 100644 --- a/menus.go +++ b/menus.go @@ -104,7 +104,68 @@ func SortMenu() MenuFn { HandleKeys("exit", ui.StopLoop) ui.Handle("/sys/kbd/", func(ui.Event) { - config.Update("sortField", m.SelectedItem().Val) + config.Update("sortField", m.SelectedValue()) + ui.StopLoop() + }) + + ui.Render(m) + ui.Loop() + return nil +} + +func ColumnsMenu() MenuFn { + ui.Clear() + ui.DefaultEvtStream.ResetHandlers() + defer ui.DefaultEvtStream.ResetHandlers() + + m := menu.NewMenu() + m.Selectable = true + m.SortItems = false + m.BorderLabel = "Columns" + + rebuild := func() { + m.ClearItems() + for _, col := range config.GlobalColumns { + txt := fmt.Sprintf("%s [%t]", col.Label, col.Enabled) + m.AddItems(menu.Item{col.Name, txt}) + } + } + + upFn := func() { + config.ColumnLeft(m.SelectedValue()) + m.Up() + rebuild() + } + + downFn := func() { + config.ColumnRight(m.SelectedValue()) + m.Down() + rebuild() + } + + toggleFn := func() { + config.ColumnToggle(m.SelectedValue()) + rebuild() + } + + rebuild() + + HandleKeys("up", m.Up) + HandleKeys("down", m.Down) + HandleKeys("enter", toggleFn) + HandleKeys("pgup", upFn) + HandleKeys("pgdown", downFn) + + ui.Handle("/sys/kbd/x", func(ui.Event) { toggleFn() }) + ui.Handle("/sys/kbd/", func(ui.Event) { toggleFn() }) + + HandleKeys("exit", func() { + cSource, err := cursor.cSuper.Get() + if err == nil { + for _, c := range cSource.All() { + c.RecreateWidgets() + } + } ui.StopLoop() }) @@ -202,7 +263,7 @@ func ContainerMenu() MenuFn { }) ui.Handle("/sys/kbd/", func(ui.Event) { - selected = m.SelectedItem().Val + selected = m.SelectedValue() ui.StopLoop() }) ui.Handle("/sys/kbd/", func(ui.Event) { @@ -321,7 +382,7 @@ func Confirm(txt string, fn func()) MenuFn { ui.Handle("/sys/kbd/y", func(ui.Event) { yes() }) ui.Handle("/sys/kbd/", func(ui.Event) { - switch m.SelectedItem().Val { + switch m.SelectedValue() { case "cancel": no() case "yes": diff --git a/widgets/menu/main.go b/widgets/menu/main.go index 4e4e83b..e6f2df1 100644 --- a/widgets/menu/main.go +++ b/widgets/menu/main.go @@ -55,6 +55,11 @@ func (m *Menu) DelItem(s string) (success bool) { return success } +// ClearItems removes all current menu items +func (m *Menu) ClearItems() { + m.items = m.items[:0] +} + // Move cursor to an position by Item value or label func (m *Menu) SetCursor(s string) (success bool) { for n, i := range m.items { @@ -79,6 +84,10 @@ func (m *Menu) SelectedItem() Item { return m.items[m.cursorPos] } +func (m *Menu) SelectedValue() string { + return m.items[m.cursorPos].Val +} + func (m *Menu) Buffer() ui.Buffer { var cell ui.Cell buf := m.Block.Buffer()