components_keyboards_HexKeyboard.bs

sub init()
  m.top.keyGrid.keyDefinitionUri = "pkg:/components/keyboards/HexKeyboardKDF.json"
  m.top.keyGrid.mode = "alphanumeric"

  m.resetButton = m.top.findNode("resetButton")
  globalConstants = m.global.constants
  m.resetButton.border = globalConstants.colorBackgroundPrimary
  m.resetButton.background = globalConstants.colorBackgroundPrimary
  m.resetButton.focusBackground = globalConstants.colorBackgroundPrimary

  m.top.keyGrid.enableRenderTracking = true
  m.top.keyGrid.observeField("renderTracking", "onKeyGridRendered")
end sub

' Position reset button below the keyboard grid, aligned to right edge
sub onKeyGridRendered()
  if m.top.keyGrid.renderTracking <> "full" then return

  keyGridRect = m.top.keyGrid.localBoundingRect()
  keyGridY = m.top.keyGrid.translation[1]
  buttonY = keyGridY + keyGridRect.height + 15

  if m.resetButton.ready
    positionResetButton(keyGridRect.width, buttonY)
  else
    m.pendingButtonY = buttonY
    m.pendingKeyGridWidth = keyGridRect.width
    m.resetButton.observeField("ready", "onResetButtonReady")
  end if
end sub

sub onResetButtonReady()
  m.resetButton.unobserveField("ready")
  positionResetButton(m.pendingKeyGridWidth, m.pendingButtonY)
end sub

sub positionResetButton(keyGridWidth as float, buttonY as float)
  buttonRect = m.resetButton.localBoundingRect()
  buttonX = keyGridWidth - buttonRect.width
  m.resetButton.translation = [buttonX, buttonY]
end sub

function onKeyEvent(key as string, press as boolean) as boolean
  if key = "back"
    m.top.escape = key
    return true
  end if

  if not press then return false

  ' Handle reset button focus
  if m.resetButton.hasFocus()
    if key = "up"
      ' Return focus to keyGrid (will focus last used key)
      m.top.keyGrid.setFocus(true)
      return true
    else if key = "left"
      m.top.escape = key
      return true
    else if key = "OK"
      m.top.reset = true
      return true
    end if
    return false
  end if

  ' Handle edge navigation for 6x3 grid layout:
  ' Row 1: 0  1  2  3  4  5
  ' Row 2: 6  7  8  9  A  B
  ' Row 3: C  D  E  F  [backspace] [submit]

  if key = "left"
    ' Left edge: column 0 (keys: 0, 6, C) and textEditBox
    if m.top.textEditBox.hasFocus()
      m.top.escape = key
      return true
    else if m.top.focusedChild.keyFocused = "0"
      m.top.escape = key
      return true
    else if m.top.focusedChild.keyFocused = "6"
      m.top.escape = key
      return true
    else if m.top.focusedChild.keyFocused = "C"
      m.top.escape = key
      return true
    end if
  end if

  if key = "right"
    ' Right edge: column 5 (keys: 5, B, submit) and textEditBox
    if m.top.textEditBox.hasFocus()
      m.top.escape = key
      return true
    else if m.top.focusedChild.keyFocused = "5"
      m.top.escape = key
      return true
    else if m.top.focusedChild.keyFocused = "B"
      m.top.escape = key
      return true
    else if m.top.focusedChild.keyFocused = "submit"
      m.top.escape = key
      return true
    end if
  end if

  if key = "up"
    ' Top edge: textEditBox
    if m.top.textEditBox.hasFocus()
      m.top.escape = key
      return true
    end if
  end if

  if key = "down"
    ' Bottom edge: row 3 (keys: C, D, E, F, backspace, submit) -> focus reset button
    if m.top.focusedChild.keyFocused = "C"
      m.resetButton.setFocus(true)
      return true
    else if m.top.focusedChild.keyFocused = "D"
      m.resetButton.setFocus(true)
      return true
    else if m.top.focusedChild.keyFocused = "E"
      m.resetButton.setFocus(true)
      return true
    else if m.top.focusedChild.keyFocused = "F"
      m.resetButton.setFocus(true)
      return true
    else if m.top.focusedChild.keyFocused = "backspace"
      m.resetButton.setFocus(true)
      return true
    else if m.top.focusedChild.keyFocused = "submit"
      m.resetButton.setFocus(true)
      return true
    end if
  end if

  return false
end function

function keySelected(key as string) as boolean
  if key = "submit"
    m.top.submit = true
    return true
  end if

  return false
end function