From d031433ec488361cb6ee15f1f7a69ff16cb7e550 Mon Sep 17 00:00:00 2001 From: Bradley Cicenas Date: Wed, 15 Feb 2017 04:44:03 +0000 Subject: [PATCH] refactor menu widget, add menuitem struct --- menus.go | 6 ++--- widgets/menu.go | 71 ++++++++++++++++++++++++++++++------------------- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/menus.go b/menus.go index 366a45b..cf631cc 100644 --- a/menus.go +++ b/menus.go @@ -58,8 +58,8 @@ func SortMenu() { // set cursor position to current sort field current := config.Get("sortField") - for n, field := range m.Items { - if field == current { + for n, item := range m.Items { + if item.Val == current { m.CursorPos = n } } @@ -67,7 +67,7 @@ func SortMenu() { ui.Render(m) m.NavigationHandlers() ui.Handle("/sys/kbd/", func(ui.Event) { - config.Update("sortField", m.Items[m.CursorPos]) + config.Update("sortField", m.Items[m.CursorPos].Val) ui.StopLoop() }) ui.Loop() diff --git a/widgets/menu.go b/widgets/menu.go index ac185fe..ce46ccc 100644 --- a/widgets/menu.go +++ b/widgets/menu.go @@ -6,39 +6,55 @@ import ( type Padding [2]int // x,y padding +type MenuItem struct { + Val string + Text string +} + type Menu struct { ui.Block - Items []string - DisplayItems []string - TextFgColor ui.Attribute - TextBgColor ui.Attribute - Selectable bool - CursorPos int - padding Padding + Items []MenuItem + TextFgColor ui.Attribute + TextBgColor ui.Attribute + Selectable bool + CursorPos int + padding Padding } func NewMenu(items []string) *Menu { + var mItems []MenuItem + for _, s := range items { + mItems = append(mItems, MenuItem{Val: s}) + } m := &Menu{ - Block: *ui.NewBlock(), - Items: items, - DisplayItems: []string{}, - TextFgColor: ui.ThemeAttr("par.text.fg"), - TextBgColor: ui.ThemeAttr("par.text.bg"), - Selectable: false, - CursorPos: 0, - padding: Padding{4, 2}, + Block: *ui.NewBlock(), + Items: mItems, + TextFgColor: ui.ThemeAttr("par.text.fg"), + TextBgColor: ui.ThemeAttr("par.text.bg"), + Selectable: false, + CursorPos: 0, + padding: Padding{4, 2}, } m.calcSize() return m } +func (m *Menu) SetItems(items []MenuItem) { + m.Items = items + m.calcSize() +} + +func (m *Menu) SelectedItem() MenuItem { + return m.Items[m.CursorPos] +} + func (m *Menu) Buffer() ui.Buffer { var cell ui.Cell buf := m.Block.Buffer() - for n, item := range m.displayItems() { + for n, item := range m.Items { x := m.padding[0] - for _, ch := range item { + for _, ch := range getDisplayText(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} @@ -74,20 +90,13 @@ func (m *Menu) NavigationHandlers() { ui.Handle("/sys/kbd/q", func(ui.Event) { ui.StopLoop() }) } -// override display of items, if given -func (m *Menu) displayItems() []string { - if len(m.DisplayItems) == len(m.Items) { - return m.DisplayItems - } - return m.Items -} - // Set width and height based on menu items func (m *Menu) calcSize() { m.Width = 8 // minimum width - items := m.displayItems() - for _, s := range items { + items := m.Items + for _, i := range m.Items { + s := getDisplayText(i) if len(s) > m.Width { m.Width = len(s) } @@ -96,3 +105,11 @@ func (m *Menu) calcSize() { m.Width += (m.padding[0] * 2) m.Height = len(items) + (m.padding[1] * 2) } + +// override display text of item, if given +func getDisplayText(m MenuItem) string { + if m.Text != "" { + return m.Text + } + return m.Val +}