components_settings_LanguagePicker.bs
import "pkg:/source/translationKeys.bs"
import "pkg:/source/utils/translate.bs"
sub init()
m.top.layoutDirection = "horiz"
m.top.itemSpacings = [40]
m.keyboard = m.top.findNode("keyboard")
m.keyboard.keyGrid.keyDefinitionUri = "pkg:/components/data/CustomAddressKDF.json"
m.keyboard.textEditBox.hintText = translate(translationKeys.LabelSearchLanguages)
m.keyboard.observeField("text", "onFilterChanged")
m.resultsList = m.top.findNode("resultsList")
m.resultsList.observeField("checkedItem", "onLanguageSelected")
m.allLanguages = []
m.suppressSelection = false
end sub
' Re-filter when selectedCode changes externally (e.g. settings.bs sets it on focus)
sub onSelectedCodeChanged()
if m.allLanguages.count() > 0
filterLanguages()
end if
end sub
' Called when the languages array is set from settings.bs
sub onLanguagesChanged()
m.allLanguages = m.top.languages
filterLanguages()
end sub
' Rebuild the filtered list when search text changes
sub onFilterChanged()
filterLanguages()
end sub
' Filter the language list based on keyboard text
sub filterLanguages()
filterText = LCase(m.keyboard.text)
content = CreateObject("roSGNode", "ContentNode")
m.filteredLanguages = []
checkedIndex = -1
' Always show "Automatic" at the top — it's the reset-to-default option
automaticLang = invalid
for each lang in m.allLanguages
if lang.code = ""
automaticLang = lang
exit for
end if
end for
if automaticLang <> invalid
item = content.CreateChild("ContentNode")
item.title = formatLanguageTitle(automaticLang)
m.filteredLanguages.push(automaticLang)
if m.top.selectedCode = ""
checkedIndex = 0
end if
end if
' Add filtered results below (skip Automatic since it's already pinned)
for each lang in m.allLanguages
if lang.code = "" then continue for
if filterText = "" or matchesFilter(lang, filterText)
item = content.CreateChild("ContentNode")
item.title = formatLanguageTitle(lang)
m.filteredLanguages.push(lang)
if lang.code = m.top.selectedCode
checkedIndex = m.filteredLanguages.count() - 1
end if
end if
end for
' Suppress before setting content — RadioButtonList resets checkedItem on content change
m.suppressSelection = true
m.resultsList.content = content
if checkedIndex >= 0
m.resultsList.jumpToItem = checkedIndex
m.resultsList.checkedItem = checkedIndex
else
' Selected language not in filtered results — clear any stale checkmark
m.resultsList.checkedItem = -1
end if
m.suppressSelection = false
end sub
' Format a language entry for display
function formatLanguageTitle(lang as object) as string
if lang.code = ""
return translate(translationKeys.LabelAutomatic)
else if lang.nativeName = lang.name
return lang.nativeName
end if
return lang.nativeName + " (" + lang.name + ")"
end function
' Check if a language matches the filter text (searches both names and code)
function matchesFilter(lang as object, filterText as string) as boolean
if LCase(lang.name).inStr(filterText) >= 0 then return true
if LCase(lang.nativeName).inStr(filterText) >= 0 then return true
if LCase(lang.code).inStr(filterText) >= 0 then return true
return false
end function
' User selected a language from the filtered list
sub onLanguageSelected()
if m.suppressSelection then return
selectedIndex = m.resultsList.checkedItem
if selectedIndex < 0 or selectedIndex >= m.filteredLanguages.count() then return
selectedLang = m.filteredLanguages[selectedIndex]
m.top.selectedCode = selectedLang.code
end sub
function onKeyEvent(key as string, press as boolean) as boolean
if not press then return false
' Right from keyboard -> focus the results list
if key = "right" and m.keyboard.isInFocusChain()
m.resultsList.setFocus(true)
return true
end if
' Left from results list -> focus the keyboard
if key = "left" and m.resultsList.isInFocusChain()
m.keyboard.setFocus(true)
return true
end if
return false
end function