diff --git a/backends/x/event.go b/backends/x/event.go index 221e5a3..c6c2db7 100644 --- a/backends/x/event.go +++ b/backends/x/event.go @@ -66,11 +66,34 @@ func (window *Window) handleKeyPress ( NumberPad: numberPad, } - window.child.Handle (tomo.EventKeyDown { + keyDownEvent := tomo.EventKeyDown { Key: key, Modifiers: modifiers, Repeated: false, // FIXME: return correct value here - }) + } + + if keyDownEvent.Key == tomo.KeyTab && keyDownEvent.Modifiers.Alt { + if window.child.Selectable() { + direction := 1 + if keyDownEvent.Modifiers.Shift { + direction = -1 + } + + window.advanceSelectionInChild(direction) + } + } else { + window.child.Handle(event) + } +} + +func (window *Window) advanceSelectionInChild (direction int) { + if window.child.Selected() { + if !window.child.AdvanceSelection(direction) { + window.child.Handle(tomo.EventDeselect { }) + } + } else { + window.child.Handle(tomo.EventSelect { }) + } } func (window *Window) handleKeyRelease ( diff --git a/tomo.go b/tomo.go index e880f17..5a1c0b9 100644 --- a/tomo.go +++ b/tomo.go @@ -92,17 +92,18 @@ type Element interface { // element contains other selectable elements, it must return true. Selectable () (selectable bool) - // Selected returns wehther this element is currently selected. This - // will always return false if it is not selectable. + // Selected returns whether or not this element is currently selected. + // This will always return false if it is not selectable. Selected () (selected bool) // If this element contains other elements, and one is selected, this - // method will advance the selection in the specified direction. If no - // children are selected, or there are no more children to be selected - // in the specified direction, the element will unselect all of its - // children and return false. If the selection could be advanced, it - // will return true. If the element contains no child elements, it will - // always return false. + // method will advance the selection in the specified direction. If + // the element contains selectable elements but none of them are + // selected, it will select the first selectable element. If there are + // no more children to be selected in the specified direction, the + // element will return false. If the selection could be advanced, it + // will return true. If the element contains no selectable child + // elements, it will always return false. AdvanceSelection (direction int) (ok bool) // SetParentHooks gives the element callbacks that let it send