Menu separator improvements

This commit is contained in:
Luke I. Wilson 2021-03-11 20:10:17 -06:00
parent d7a5309e80
commit f91da3dd7e

View File

@ -2,6 +2,7 @@ package ui
import ( import (
"fmt" "fmt"
"strings"
"github.com/gdamore/tcell/v2" "github.com/gdamore/tcell/v2"
) )
@ -64,7 +65,7 @@ func NewMenuBar(theme *Theme) *MenuBar {
func (b *MenuBar) AddMenu(menu *Menu) { func (b *MenuBar) AddMenu(menu *Menu) {
menu.itemSelectedCallback = func() { menu.itemSelectedCallback = func() {
// TODO: figure out what im doing here
} }
b.Menus = append(b.Menus, menu) b.Menus = append(b.Menus, menu)
} }
@ -203,6 +204,32 @@ func NewMenu(name string, theme *Theme, items []Item) *Menu {
} }
} }
func (m *Menu) CursorUp() {
if m.selected <= 0 {
m.selected = len(m.Items) - 1 // Wrap to end
} else {
m.selected--
}
switch m.Items[m.selected].(type) {
case *ItemSeparator:
m.CursorUp() // Recursion; stack overflow if the only item in a Menu is a separator.
default:
}
}
func (m *Menu) CursorDown() {
if m.selected >= len(m.Items)-1 {
m.selected = 0 // Wrap to beginning
} else {
m.selected++
}
switch m.Items[m.selected].(type) {
case *ItemSeparator:
m.CursorDown() // Recursion; stack overflow if the only item in a Menu is a separator.
default:
}
}
// Draw renders the Menu at its position. // Draw renders the Menu at its position.
func (m *Menu) Draw(s tcell.Screen) { func (m *Menu) Draw(s tcell.Screen) {
defaultStyle := m.Theme.GetOrDefault("Menu") defaultStyle := m.Theme.GetOrDefault("Menu")
@ -213,13 +240,21 @@ func (m *Menu) Draw(s tcell.Screen) {
// Draw items based on whether m.focused and which is selected // Draw items based on whether m.focused and which is selected
for i, item := range m.Items { for i, item := range m.Items {
var sty tcell.Style switch item.(type) {
if m.selected == i { case *ItemSeparator:
sty = m.Theme.GetOrDefault("MenuSelected") str := fmt.Sprintf("%s%s%s", "├", strings.Repeat("─", m.width-2), "┤")
} else { DrawStr(s, m.x, m.y+1+i, str, defaultStyle)
sty = defaultStyle default: // Handle sub-menus and item entries the same
var sty tcell.Style
if m.selected == i {
sty = m.Theme.GetOrDefault("MenuSelected")
} else {
sty = defaultStyle
}
itemName := item.GetName()
str := fmt.Sprintf("%s%s", itemName, strings.Repeat(" ", m.width-2-len(itemName)))
DrawStr(s, m.x+1, m.y+1+i, str, sty)
} }
DrawStr(s, m.x+1, m.y+1+i, item.GetName(), sty)
} }
} }
@ -274,18 +309,10 @@ func (m *Menu) HandleEvent(event tcell.Event) bool {
} }
return true return true
} else if ev.Key() == tcell.KeyUp { } else if ev.Key() == tcell.KeyUp {
if m.selected <= 0 { m.CursorUp()
m.selected = len(m.Items) - 1 // Wrap to end
} else {
m.selected--
}
return true return true
} else if ev.Key() == tcell.KeyDown { } else if ev.Key() == tcell.KeyDown {
if m.selected >= len(m.Items)-1 { m.CursorDown()
m.selected = 0 // Wrap to beginning
} else {
m.selected++
}
return true return true
} }
} }