f7c5cc09ba
A node was a Lua table of ~625 bytes, of which 21 keys pushed it over a
power-of-two hash boundary and eight were style copies inheritance had
splattered down from its parent. A 400 node screen cost ~250 KB and could not
coexist with wifi's buffers.
The tree now lives in src/ui/layout.h as a 16 byte struct in a flat arena, and
splits by lifetime: Node holds what hit testing and repainting need forever,
Spec holds what only measure/place read and is dropped when layout ends. Style
is sparse and resolved by walking parents, so a node naming no colours costs
nothing. Re-layout rebuilds from Lua rather than retaining the inputs.
401 nodes: 8218 B steady, 21050 B peak
Lua: ~250000 B steady
sdcard/lib/ui.lua stays the toolkit and keeps every constructor signature, but
returns integer handles: 627 lines to 374. Composition, the palette and custom
painters are still Lua on the SD card; only primitives now need a reflash.
BREAKING CHANGE: ui constructors return handles, not tables. Use
ui.setText(id, text) and keep per-node app data in a table keyed by id.
26 lines
692 B
Lua
26 lines
692 B
Lua
local ui = require("ui")
|
|
local keyboard = require("keyboard")
|
|
|
|
local screen, valueLabel
|
|
|
|
local function show(prefix, value)
|
|
ui.setText(valueLabel, value == "" and "type something" or prefix .. value)
|
|
end
|
|
|
|
function init()
|
|
valueLabel = ui.text("type something", {w = "fill"})
|
|
screen = ui.screen(ui.box{pad = 8, gap = 5,
|
|
valueLabel,
|
|
keyboard.new{
|
|
max_length = 40,
|
|
on_change = function(value) show("value: ", value) end,
|
|
on_submit = function(value) show("submitted: ", value) end,
|
|
},
|
|
})
|
|
log.info("keyboard test ready")
|
|
end
|
|
|
|
function draw() screen:draw() end
|
|
function on_touch_down(x, y) screen:down(x, y) end
|
|
function on_touch_up(x, y) screen:up(x, y) end
|