Refactored cursor movement in MenuBar
This commit is contained in:
77
ui/menu.go
77
ui/menu.go
@@ -81,6 +81,49 @@ func (b *MenuBar) GetMenuXPos(idx int) int {
|
|||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *MenuBar) ActivateMenuUnderCursor() {
|
||||||
|
b.menusVisible = true // Show menus
|
||||||
|
menu := &b.Menus[b.selected]
|
||||||
|
(*menu).SetPos(b.GetMenuXPos(b.selected), b.y+1)
|
||||||
|
(*menu).SetFocused(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *MenuBar) CursorLeft() {
|
||||||
|
if b.menusVisible {
|
||||||
|
b.Menus[b.selected].SetFocused(false) // Unfocus current menu
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.selected <= 0 {
|
||||||
|
b.selected = len(b.Menus) - 1 // Wrap to end
|
||||||
|
} else {
|
||||||
|
b.selected--
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.menusVisible {
|
||||||
|
// Update position of new menu after changing menu selection
|
||||||
|
b.Menus[b.selected].SetPos(b.GetMenuXPos(b.selected), b.y+1)
|
||||||
|
b.Menus[b.selected].SetFocused(true) // Focus new menu
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (b *MenuBar) CursorRight() {
|
||||||
|
if b.menusVisible {
|
||||||
|
b.Menus[b.selected].SetFocused(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.selected >= len(b.Menus)-1 {
|
||||||
|
b.selected = 0 // Wrap to beginning
|
||||||
|
} else {
|
||||||
|
b.selected++
|
||||||
|
}
|
||||||
|
|
||||||
|
if b.menusVisible {
|
||||||
|
// Update position of new menu after changing menu selection
|
||||||
|
b.Menus[b.selected].SetPos(b.GetMenuXPos(b.selected), b.y+1)
|
||||||
|
b.Menus[b.selected].SetFocused(true) // Focus new menu
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Draw renders the MenuBar and its sub-menus.
|
// Draw renders the MenuBar and its sub-menus.
|
||||||
func (b *MenuBar) Draw(s tcell.Screen) {
|
func (b *MenuBar) Draw(s tcell.Screen) {
|
||||||
normalStyle := b.Theme.GetOrDefault("MenuBar")
|
normalStyle := b.Theme.GetOrDefault("MenuBar")
|
||||||
@@ -155,46 +198,22 @@ func (b *MenuBar) HandleEvent(event tcell.Event) bool {
|
|||||||
switch ev.Key() {
|
switch ev.Key() {
|
||||||
case tcell.KeyEnter:
|
case tcell.KeyEnter:
|
||||||
if !b.menusVisible { // If menus are not visible...
|
if !b.menusVisible { // If menus are not visible...
|
||||||
b.menusVisible = true
|
b.ActivateMenuUnderCursor()
|
||||||
|
|
||||||
menu := &b.Menus[b.selected]
|
|
||||||
(*menu).SetPos(b.GetMenuXPos(b.selected), b.y+1)
|
|
||||||
(*menu).SetFocused(true) // Makes .Visible true for the Menu
|
|
||||||
} else { // The selected Menu is visible, send the event to it
|
} else { // The selected Menu is visible, send the event to it
|
||||||
return b.Menus[b.selected].HandleEvent(event)
|
return b.Menus[b.selected].HandleEvent(event)
|
||||||
}
|
}
|
||||||
case tcell.KeyLeft:
|
case tcell.KeyLeft:
|
||||||
b.Menus[b.selected].SetFocused(false) // Unfocus current menu
|
b.CursorLeft()
|
||||||
if b.selected <= 0 {
|
|
||||||
b.selected = len(b.Menus) - 1 // Wrap to end
|
|
||||||
} else {
|
|
||||||
b.selected--
|
|
||||||
}
|
|
||||||
// Update position of new menu after changing menu selection
|
|
||||||
b.Menus[b.selected].SetPos(b.GetMenuXPos(b.selected), b.y+1)
|
|
||||||
b.Menus[b.selected].SetFocused(true) // Focus new menu
|
|
||||||
case tcell.KeyRight:
|
case tcell.KeyRight:
|
||||||
b.Menus[b.selected].SetFocused(false)
|
b.CursorRight()
|
||||||
if b.selected >= len(b.Menus)-1 {
|
|
||||||
b.selected = 0 // Wrap to beginning
|
|
||||||
} else {
|
|
||||||
b.selected++
|
|
||||||
}
|
|
||||||
// Update position of new menu after changing menu selection
|
|
||||||
b.Menus[b.selected].SetPos(b.GetMenuXPos(b.selected), b.y+1)
|
|
||||||
b.Menus[b.selected].SetFocused(true) // Focus new menu
|
|
||||||
|
|
||||||
case tcell.KeyRune: // Search for the matching quick char in menu names
|
case tcell.KeyRune: // Search for the matching quick char in menu names
|
||||||
if !b.menusVisible { // If the selected Menu is not open/visible
|
if !b.menusVisible { // If the selected Menu is not open/visible
|
||||||
for i, m := range b.Menus {
|
for i, m := range b.Menus {
|
||||||
found, r := QuickCharInString(m.Name)
|
found, r := QuickCharInString(m.Name)
|
||||||
if found && r == ev.Rune() {
|
if found && r == ev.Rune() {
|
||||||
b.menusVisible = true
|
b.selected = i // Select menu at i
|
||||||
|
b.ActivateMenuUnderCursor() // Show menu
|
||||||
b.selected = i
|
|
||||||
menu := &b.Menus[b.selected]
|
|
||||||
(*menu).SetPos(b.GetMenuXPos(b.selected), b.y+1)
|
|
||||||
(*menu).SetFocused(true)
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user