Fixed Container.HandleSelection
It now handles nested containers properly.
This commit is contained in:
parent
9aea6d8c0f
commit
93019b1b38
@ -271,34 +271,35 @@ func (element *Container) HandleSelection (direction tomo.SelectionDirection) (o
|
||||
|
||||
firstSelected := element.firstSelected()
|
||||
if firstSelected < 0 {
|
||||
found := false
|
||||
// no element is currently selected, so we need to select either
|
||||
// the first or last selectable element depending on the
|
||||
// direction.
|
||||
switch direction {
|
||||
case tomo.SelectionDirectionBackward:
|
||||
element.forSelectableBackward (func (child tomo.Selectable) bool {
|
||||
if child.HandleSelection(direction) {
|
||||
element.selected = true
|
||||
found = true
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})
|
||||
return true
|
||||
|
||||
case tomo.SelectionDirectionNeutral, tomo.SelectionDirectionForward:
|
||||
element.forSelectable (func (child tomo.Selectable) bool {
|
||||
if child.HandleSelection(direction) {
|
||||
element.selected = true
|
||||
found = true
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})
|
||||
// if we recieve a neutral or forward direction, select
|
||||
// the first selectable element.
|
||||
return element.selectFirstSelectableElement(direction)
|
||||
|
||||
case tomo.SelectionDirectionBackward:
|
||||
// if we recieve a backward direction, select the last
|
||||
// selectable element.
|
||||
return element.selectLastSelectableElement(direction)
|
||||
}
|
||||
return found
|
||||
} else {
|
||||
// an element is currently selected, so we need to move the
|
||||
// selection in the specified direction
|
||||
firstSelectedChild :=
|
||||
element.children[firstSelected].Element.(tomo.Selectable)
|
||||
|
||||
|
||||
// before we move the selection, the currently selected child
|
||||
// may also be able to move its selection. if the child is able
|
||||
// to do that, we will let it and not move ours.
|
||||
if firstSelectedChild.HandleSelection(direction) {
|
||||
return true
|
||||
}
|
||||
|
||||
// find the previous/next selectable element relative to the
|
||||
// currently selected element, if it exists.
|
||||
for index := firstSelected + int(direction);
|
||||
index < len(element.children) && index >= 0;
|
||||
index += int(direction) {
|
||||
@ -307,6 +308,8 @@ func (element *Container) HandleSelection (direction tomo.SelectionDirection) (o
|
||||
element.children[index].
|
||||
Element.(tomo.Selectable)
|
||||
if selectable && child.HandleSelection(direction) {
|
||||
// we have found one, so we now actually move
|
||||
// the selection.
|
||||
firstSelectedChild.HandleDeselection()
|
||||
element.selected = true
|
||||
return true
|
||||
@ -317,6 +320,38 @@ func (element *Container) HandleSelection (direction tomo.SelectionDirection) (o
|
||||
return false
|
||||
}
|
||||
|
||||
func (element *Container) selectFirstSelectableElement (
|
||||
direction tomo.SelectionDirection,
|
||||
) (
|
||||
ok bool,
|
||||
) {
|
||||
element.forSelectable (func (child tomo.Selectable) bool {
|
||||
if child.HandleSelection(direction) {
|
||||
element.selected = true
|
||||
ok = true
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (element *Container) selectLastSelectableElement (
|
||||
direction tomo.SelectionDirection,
|
||||
) (
|
||||
ok bool,
|
||||
) {
|
||||
element.forSelectableBackward (func (child tomo.Selectable) bool {
|
||||
if child.HandleSelection(direction) {
|
||||
element.selected = true
|
||||
ok = true
|
||||
return false
|
||||
}
|
||||
return true
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (element *Container) FlexibleHeightFor (width int) (height int) {
|
||||
return element.layout.FlexibleHeightFor(element.children, width)
|
||||
}
|
||||
|
Reference in New Issue
Block a user