diff --git a/list.go b/list.go index 848f605..14ecf43 100644 --- a/list.go +++ b/list.go @@ -51,6 +51,9 @@ type List struct { // If true, the entire row is highlighted when selected. highlightFullLine bool + // Whether or not navigating the list will wrap around. + wrapAround bool + // The number of list items skipped at the top before the first item is drawn. offset int @@ -71,6 +74,7 @@ func NewList() *List { return &List{ Box: NewBox(), showSecondaryText: true, + wrapAround: true, mainTextColor: Styles.PrimaryTextColor, secondaryTextColor: Styles.TertiaryTextColor, shortcutColor: Styles.SecondaryTextColor, @@ -212,6 +216,16 @@ func (l *List) ShowSecondaryText(show bool) *List { return l } +// SetWrapAround sets the flag that determines whether navigating the list will +// wrap around. That is, navigating downwards on the last item will move the +// selection to the first item (similarly in the other direction). If set to +// false, the selection won't change when navigating downwards on the last item +// or navigating upwards on the first item. +func (l *List) SetWrapAround(wrapAround bool) *List { + l.wrapAround = wrapAround + return l +} + // SetChangedFunc sets the function which is called when the user navigates to // a list item. The function receives the item's index in the list of items // (starting with 0), its main text, secondary text, and its shortcut rune. @@ -516,9 +530,17 @@ func (l *List) InputHandler() func(event *tcell.EventKey, setFocus func(p Primit } if l.currentItem < 0 { - l.currentItem = len(l.items) - 1 + if l.wrapAround { + l.currentItem = len(l.items) - 1 + } else { + l.currentItem = 0 + } } else if l.currentItem >= len(l.items) { - l.currentItem = 0 + if l.wrapAround { + l.currentItem = 0 + } else { + l.currentItem = len(l.items) - 1 + } } if l.currentItem != previousItem && l.currentItem < len(l.items) && l.changed != nil {