compute_layout = function(node, x,y, nodes_to_render) -- append to nodes_to_render flattened instructions to render a hierarchy of nodes -- return x,y rendered until (surface coordinates) if node.type == 'text' then -- leaf node containing raw text node.x = x node.y = y if node.width then node.w = node.width else local scaled_fontsize = scale(node.fontsize or 20) node.w = 0 for _,s in ipairs(node.data) do local text = love.graphics.newText(font(node, scaled_fontsize), node.data) local width = text:getWidth() if node.w < width then node.w = width end end end initialize_editor(node) node.h = box_height(node) table.insert(nodes_to_render, node) elseif node.type == 'rows' then node.x = x node.y = y -- lay out children top to bottom local node_to_render if node.bg then node_to_render = {type='rectangle', r=node.bg.r, g=node.bg.g, b=node.bg.b, x=node.x, y=node.y} table.insert(nodes_to_render, node_to_render) end local subx,suby = x,y local w,h = 0,0 local subnodes for _,child in ipairs(node.data) do if child.margin then suby = suby+child.margin h = h+child.margin end subx,suby = compute_layout(child, x,suby, nodes_to_render) if w < child.w then w = child.w end h = h+child.h end node.w = w node.h = h if node_to_render then node_to_render.w = w node_to_render.h = h end elseif node.type == 'cols' then node.x = x node.y = y -- lay out children left to right local subx,suby = x,y local w,h = 0,0 for _,child in ipairs(node.data) do if child.margin then subx = subx+child.margin w = w+child.margin end subx,suby = compute_layout(child, subx,y, nodes_to_render) w = w + child.w if h < child.h then h = child.h end end node.w = w node.h = h if node.bg then table.insert(nodes_to_render, {type='rectangle', r=node.bg.r, g=node.bg.g, b=node.bg.b, x=node.x, y=node.y, w=node.w, h=node.h}) end end return x+node.w,y+node.h end