Add List.SetSelectedAlwaysCentered

This commit is contained in:
Trevor Slocum 2020-05-20 15:36:19 -07:00
parent d404da13f5
commit 698a0adf93
2 changed files with 36 additions and 5 deletions

View File

@ -1,3 +1,6 @@
v1.4.7 (WIP)
- Add List.SetSelectedAlwaysCentered
v1.4.6 (2020-05-18)
- Add Box.ShowFocus
- Add Keys to allow default keyboard shortcuts to be modified

38
list.go
View File

@ -61,6 +61,9 @@ type List struct {
// If true, the selection must remain visible when scrolling.
selectedAlwaysVisible bool
// If true, the selection must remain centered when scrolling.
selectedAlwaysCentered bool
// If true, the entire row is highlighted when selected.
highlightFullLine bool
@ -302,6 +305,16 @@ func (l *List) SetSelectedAlwaysVisible(alwaysVisible bool) *List {
return l
}
// SetSelectedAlwaysCentered sets a flag which determines whether the currently
// selected list item must remain centered when scrolling.
func (l *List) SetSelectedAlwaysCentered(alwaysCentered bool) *List {
l.Lock()
defer l.Unlock()
l.selectedAlwaysCentered = alwaysCentered
return l
}
// SetHighlightFullLine sets a flag which determines whether the colored
// background of selected items spans the entire width of the view. If set to
// true, the highlight spans the entire view. If set to false, only the text of
@ -651,15 +664,30 @@ func (l *List) transform(tr Transformation) {
func (l *List) updateOffset() {
_, _, _, l.height = l.GetInnerRect()
h := l.height
if l.selectedAlwaysCentered {
h /= 2
}
if l.currentItem < l.offset {
l.offset = l.currentItem
} else if l.showSecondaryText {
if 2*(l.currentItem-l.offset) >= l.height-1 {
l.offset = (2*l.currentItem + 3 - l.height) / 2
if 2*(l.currentItem-l.offset) >= h-1 {
l.offset = (2*l.currentItem + 3 - h) / 2
}
} else {
if l.currentItem-l.offset >= l.height {
l.offset = l.currentItem + 1 - l.height
if l.currentItem-l.offset >= h {
l.offset = l.currentItem + 1 - h
}
}
if l.showSecondaryText {
if l.offset > len(l.items)-(l.height/2) {
l.offset = len(l.items) - l.height/2
}
} else {
if l.offset > len(l.items)-l.height {
l.offset = len(l.items) - l.height
}
}
}
@ -702,7 +730,7 @@ func (l *List) Draw(screen tcell.Screen) {
}
// Adjust offset to keep the current selection in view.
if l.selectedAlwaysVisible {
if l.selectedAlwaysVisible || l.selectedAlwaysCentered {
l.updateOffset()
}