List Widget
Scrolling list with dynamic items.

Code
require(["v0.4", "@gui"])
let items = [
"First Item",
"Second Item",
"Third Item",
"Fourth Item",
"Fifth Item",
]
let selectedLabel = widget.NewLabel("No selection")
let list = widget.NewList()
// Return number of items
list.Length(() => items.length)
// Create template item
list.CreateItem(() => widget.NewLabel(""))
// Update item with data
list.UpdateItem((id, obj) => {
obj.Text = items[id]
})
// Handle selection
list.OnSelected((id) => {
selectedLabel.Text = sprintf("Selected: %s", items[id])
})
let addButton = widget.NewButton("Add Item", () => {
let newItem = sprintf("Item %d", items.length + 1)
items = items.concat([newItem])
list.Refresh()
})
let content = container.NewBorder(
selectedLabel,
addButton,
nil,
nil,
list
)
window.SetContent(content)Explanation
- List Widget - Efficient scrolling list with
widget.NewList() - Length Callback - Returns total number of items
- CreateItem - Creates template widget (reused for all items)
- UpdateItem - Updates template with actual data for index
- OnSelected - Callback when user selects an item
- Dynamic Updates - Modify array and call
list.Refresh()
Key Concepts
- Virtualization: List reuses widgets for performance
- Template Pattern: CreateItem makes template, UpdateItem fills it
- Selection: Track selected items with OnSelected callback
- Border Layout: Use
container.NewBorder()for complex layouts
Try It
fynerisor list-widget.risor