components_Buttons_JFButtons.bs

sub init()

    m.top.focusable = true

    m.menubg = m.top.findNode("menubg")

    m.focusRing = m.top.findNode("focus")
    m.buttonGroup = m.top.findNode("buttonGroup")
    m.focusAnim = m.top.findNode("moveFocusAnimation")
    m.focusAnimTranslation = m.top.findNode("focusLocation")
    m.focusAnimWidth = m.top.findNode("focusWidth")
    m.focusAnimHeight = m.top.findNode("focusHeight")

    ' Set button color to global
    m.focusRing.color = m.global.constants.colors.button

    m.buttonCount = 0
    m.selectedFocusedIndex = 0

    m.textSizeTask = createObject("roSGNode", "TextSizeTask")

    m.top.observeField("focusedChild", "focusChanged")
    m.top.enableRenderTracking = true
    m.top.observeField("renderTracking", "renderChanged")

end sub

'
' When Selected Index set, ensure it is the one Focused
sub selectedIndexChanged()
    m.selectedFocusedIndex = m.top.selectedIndex
end sub

'
' When options are fully displayed, set focus and selected option
sub renderChanged()
    if m.top.renderTracking = "full"
        highlightSelected(m.selectedFocusedIndex, false)
        m.top.setfocus(true)
    end if
end sub


sub updateButtons()
    m.textSizeTask.fontsize = 40
    m.textSizeTask.text = m.top.buttons
    m.textSizeTask.name = m.buttonCount
    m.textSizeTask.observeField("width", "showButtons")
    m.textSizeTask.control = "RUN"
end sub

sub showButtons()

    totalWidth = 110 ' track for menu background width - start with side padding

    for i = 0 to m.top.buttons.count() - 1
        m.buttonCount = m.buttonCount + 1
        l = m.buttonGroup.createChild("Label")
        l.text = m.top.buttons[i]
        l.font.size = 40
        l.translation = [0, 10]
        l.height = m.textSizeTask.height
        l.width = m.textSizeTask.width[i] + 50
        l.horizAlign = "center"
        l.vertAlign = "center"
        totalWidth = totalWidth + l.width + 45
    end for

    m.menubg.width = totalWidth
    m.menubg.height = m.textSizeTask.height + 40

end sub

' Highlight selected menu option
sub highlightSelected(index as integer, animate = true)

    val = m.buttonGroup.getChild(index)
    rect = val.ancestorBoundingRect(m.top)

    if animate = true
        m.focusAnimTranslation.keyValue = [m.focusRing.translation, [rect.x - 25, rect.y - 30]]
        m.focusAnimWidth.keyValue = [m.focusRing.width, val.width + 50]
        m.focusAnimHeight.keyValue = [m.focusRing.height, val.height + 60]
        m.focusAnim.control = "start"
    else
        m.focusRing.translation = [rect.x - 25, rect.y - 30]
        m.focusRing.width = val.width + 50
        m.focusRing.height = val.height + 60
    end if

end sub

' Change opacity of the highlighted menu item based on focus
sub focusChanged()
    if m.top.isInFocusChain()
        m.focusRing.opacity = 1
    else
        m.focusRing.opacity = 0.6
    end if
end sub


function onKeyEvent(key as string, press as boolean) as boolean

    if not press then return false

    if key = "left"
        if m.selectedFocusedIndex > 0 then m.selectedFocusedIndex = m.selectedFocusedIndex - 1
        highlightSelected(m.selectedFocusedIndex)
        m.top.focusedIndex = m.selectedFocusedIndex
        return true
    else if key = "right"
        if m.selectedFocusedIndex < m.buttonCount - 1 then m.selectedFocusedIndex = m.selectedFocusedIndex + 1
        highlightSelected(m.selectedFocusedIndex)
        m.top.focusedIndex = m.selectedFocusedIndex
        return true
    else if key = "OK"
        m.top.selectedIndex = m.selectedFocusedIndex
        return true
    end if
    return false
end function