|
|
|
@ -676,6 +676,10 @@ func (f *Form) Draw(screen tcell.Screen) {
|
|
|
|
|
positions := make([]struct{ x, y, width, height int }, len(f.items)+len(f.buttons))
|
|
|
|
|
var focusedPosition struct{ x, y, width, height int }
|
|
|
|
|
for index, item := range f.items {
|
|
|
|
|
if !item.GetVisible() {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Calculate the space needed.
|
|
|
|
|
labelWidth := TaggedStringWidth(item.GetLabel())
|
|
|
|
|
var itemWidth int
|
|
|
|
@ -750,6 +754,10 @@ func (f *Form) Draw(screen tcell.Screen) {
|
|
|
|
|
|
|
|
|
|
// Calculate positions of buttons.
|
|
|
|
|
for index, button := range f.buttons {
|
|
|
|
|
if !button.GetVisible() {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
space := rightLimit - x
|
|
|
|
|
buttonWidth := buttonWidths[index]
|
|
|
|
|
if f.horizontal {
|
|
|
|
@ -795,6 +803,10 @@ func (f *Form) Draw(screen tcell.Screen) {
|
|
|
|
|
|
|
|
|
|
// Draw items.
|
|
|
|
|
for index, item := range f.items {
|
|
|
|
|
if !item.GetVisible() {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set position.
|
|
|
|
|
y := positions[index].y - offset
|
|
|
|
|
height := positions[index].height
|
|
|
|
@ -815,6 +827,9 @@ func (f *Form) Draw(screen tcell.Screen) {
|
|
|
|
|
|
|
|
|
|
// Draw buttons.
|
|
|
|
|
for index, button := range f.buttons {
|
|
|
|
|
if !button.GetVisible() {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set position.
|
|
|
|
|
buttonIndex := index + len(f.items)
|
|
|
|
@ -832,6 +847,45 @@ func (f *Form) Draw(screen tcell.Screen) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (f *Form) updateFocusedElement(decreasing bool) {
|
|
|
|
|
li := len(f.items)
|
|
|
|
|
l := len(f.items) + len(f.buttons)
|
|
|
|
|
for i := 0; i < l; i++ {
|
|
|
|
|
if f.focusedElement < 0 {
|
|
|
|
|
if f.wrapAround {
|
|
|
|
|
f.focusedElement = l - 1
|
|
|
|
|
} else {
|
|
|
|
|
f.focusedElement = 0
|
|
|
|
|
}
|
|
|
|
|
} else if f.focusedElement >= l {
|
|
|
|
|
if f.wrapAround {
|
|
|
|
|
f.focusedElement = 0
|
|
|
|
|
} else {
|
|
|
|
|
f.focusedElement = l - 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if f.focusedElement < li {
|
|
|
|
|
item := f.items[f.focusedElement]
|
|
|
|
|
if item.GetVisible() {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
button := f.buttons[f.focusedElement-li]
|
|
|
|
|
if button.GetVisible() {
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if decreasing {
|
|
|
|
|
f.focusedElement--
|
|
|
|
|
} else {
|
|
|
|
|
f.focusedElement++
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (f *Form) formItemInputHandler(delegate func(p Primitive)) func(key tcell.Key) {
|
|
|
|
|
return func(key tcell.Key) {
|
|
|
|
|
f.Lock()
|
|
|
|
@ -839,21 +893,13 @@ func (f *Form) formItemInputHandler(delegate func(p Primitive)) func(key tcell.K
|
|
|
|
|
switch key {
|
|
|
|
|
case tcell.KeyTab, tcell.KeyEnter:
|
|
|
|
|
f.focusedElement++
|
|
|
|
|
if !f.wrapAround && f.focusedElement >= len(f.items)+len(f.buttons) {
|
|
|
|
|
f.focusedElement = (len(f.items) + len(f.buttons)) - 1
|
|
|
|
|
}
|
|
|
|
|
f.updateFocusedElement(false)
|
|
|
|
|
f.Unlock()
|
|
|
|
|
f.Focus(delegate)
|
|
|
|
|
f.Lock()
|
|
|
|
|
case tcell.KeyBacktab:
|
|
|
|
|
f.focusedElement--
|
|
|
|
|
if f.focusedElement < 0 {
|
|
|
|
|
if f.wrapAround {
|
|
|
|
|
f.focusedElement = len(f.items) + len(f.buttons) - 1
|
|
|
|
|
} else {
|
|
|
|
|
f.focusedElement = 0
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
f.updateFocusedElement(true)
|
|
|
|
|
f.Unlock()
|
|
|
|
|
f.Focus(delegate)
|
|
|
|
|
f.Lock()
|
|
|
|
@ -864,6 +910,7 @@ func (f *Form) formItemInputHandler(delegate func(p Primitive)) func(key tcell.K
|
|
|
|
|
f.Lock()
|
|
|
|
|
} else {
|
|
|
|
|
f.focusedElement = 0
|
|
|
|
|
f.updateFocusedElement(true)
|
|
|
|
|
f.Unlock()
|
|
|
|
|
f.Focus(delegate)
|
|
|
|
|
f.Lock()
|
|
|
|
@ -927,12 +974,12 @@ func (f *Form) HasFocus() bool {
|
|
|
|
|
// has focus.
|
|
|
|
|
func (f *Form) focusIndex() int {
|
|
|
|
|
for index, item := range f.items {
|
|
|
|
|
if item.GetFocusable().HasFocus() {
|
|
|
|
|
if item.GetVisible() && item.GetFocusable().HasFocus() {
|
|
|
|
|
return index
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
for index, button := range f.buttons {
|
|
|
|
|
if button.focus.HasFocus() {
|
|
|
|
|
if button.GetVisible() && button.focus.HasFocus() {
|
|
|
|
|
return len(f.items) + index
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|