Keynav moment
This commit is contained in:
@@ -78,7 +78,7 @@ func (element *Button) Handle (event tomo.Event) {
|
||||
|
||||
case tomo.EventKeyUp:
|
||||
keyDownEvent := event.(tomo.EventKeyUp)
|
||||
if keyDownEvent.Key == tomo.KeyEnter {
|
||||
if keyDownEvent.Key == tomo.KeyEnter && element.pressed {
|
||||
element.pressed = false
|
||||
if element.core.HasImage() {
|
||||
element.draw()
|
||||
@@ -91,9 +91,17 @@ func (element *Button) Handle (event tomo.Event) {
|
||||
|
||||
case tomo.EventSelect:
|
||||
element.core.SetSelected(true)
|
||||
if element.core.HasImage() {
|
||||
element.draw()
|
||||
element.core.PushAll()
|
||||
}
|
||||
|
||||
case tomo.EventDeselect:
|
||||
element.core.SetSelected(false)
|
||||
if element.core.HasImage() {
|
||||
element.draw()
|
||||
element.core.PushAll()
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
@@ -12,8 +12,6 @@ type Container struct {
|
||||
|
||||
layout tomo.Layout
|
||||
children []tomo.LayoutEntry
|
||||
selectable bool
|
||||
selected bool
|
||||
|
||||
drags [10]tomo.Element
|
||||
}
|
||||
@@ -42,6 +40,16 @@ func (element *Container) Adopt (child tomo.Element, expand bool) {
|
||||
SelectabilityChange: func (bool) {
|
||||
element.updateSelectable()
|
||||
},
|
||||
SelectionRequest: func () (granted bool) {
|
||||
if !child.Selectable() { return }
|
||||
if element.core.Select() {
|
||||
element.propogateToSelected(tomo.EventDeselect { })
|
||||
child.Handle(tomo.EventSelect { })
|
||||
return true
|
||||
}
|
||||
|
||||
return
|
||||
},
|
||||
Draw: func (region tomo.Image) {
|
||||
element.drawChildRegion(child, region)
|
||||
},
|
||||
@@ -188,28 +196,84 @@ func (element *Container) Handle (event tomo.Event) {
|
||||
case tomo.EventSelect:
|
||||
if !element.Selectable() { break }
|
||||
element.core.SetSelected(true)
|
||||
|
||||
// select the first selectable element
|
||||
for _, entry := range element.children {
|
||||
if entry.Selectable() {
|
||||
entry.Handle(event)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
case tomo.EventDeselect:
|
||||
element.core.SetSelected(false)
|
||||
// TODO: propogate deselect event to all children who report
|
||||
// themselves as selected.
|
||||
|
||||
element.propogateToSelected(event)
|
||||
|
||||
default:
|
||||
// other events are just directly sent to the selected child.
|
||||
element.propogateToSelected(event)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (element *Container) propogateToSelected (event tomo.Event) {
|
||||
for _, entry := range element.children {
|
||||
if entry.Selected() {
|
||||
entry.Handle(event)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (element *Container) AdvanceSelection (direction int) (ok bool) {
|
||||
// TODO:
|
||||
if !element.Selectable() { return }
|
||||
|
||||
firstSelected := element.firstSelected()
|
||||
if firstSelected < 0 {
|
||||
for _, entry := range element.children {
|
||||
if entry.Selectable() {
|
||||
entry.Handle(tomo.EventSelect { })
|
||||
return true
|
||||
}
|
||||
}
|
||||
} else {
|
||||
nextSelectable := -1
|
||||
step := 1
|
||||
if direction < 0 { step = - 1 }
|
||||
for index := firstSelected + step;
|
||||
index < len(element.children) && index > 0;
|
||||
index += step {
|
||||
|
||||
if element.children[index].Selectable() {
|
||||
nextSelectable = index
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if nextSelectable > 0 {
|
||||
element.children[firstSelected ].Handle(tomo.EventDeselect { })
|
||||
element.children[nextSelectable].Handle(tomo.EventSelect { })
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func (element *Container) firstSelected () (index int) {
|
||||
for currentIndex, entry := range element.children {
|
||||
if entry.Selected() {
|
||||
return currentIndex
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func (element *Container) updateSelectable () {
|
||||
selectable := false
|
||||
for _, entry := range element.children {
|
||||
if entry.Selectable() { selectable = true }
|
||||
}
|
||||
element.core.SetSelectable(selectable)
|
||||
if !selectable { element.selected = false }
|
||||
}
|
||||
|
||||
func (element *Container) updateMinimumSize () {
|
||||
|
||||
Reference in New Issue
Block a user