47 lines
1.7 KiB
Lua
47 lines
1.7 KiB
Lua
local Constraints = require "lib.simple_ui.core.constraints"
|
||
local Vec3 = require "lib.utils.vec3"
|
||
|
||
--- @class UIElement
|
||
--- @field type string
|
||
--- @field key? any Must be convertible to string
|
||
--- @field parent? UIElement
|
||
--- @field constraints Constraints
|
||
--- @field offset Vec3 Положение левого верхнего угла элемента в экранных координатах {x, y}. Устанавливается родительским элементом.
|
||
--- @field size Vec3 Размеры элемента в экранных координатах {x, y}
|
||
--- @field build? fun(self): UIElement?
|
||
local element = {}
|
||
element.__index = element
|
||
element.type = "Element"
|
||
element.constraints = Constraints {}
|
||
element.offset = Vec3 {}
|
||
element.size = Vec3 {}
|
||
|
||
--- "Constraints go down. Sizes go up. Parent sets position."
|
||
---
|
||
--- Karl Marx, probably.
|
||
function element:layout() end
|
||
|
||
function element:update(dt) end
|
||
|
||
function element:draw() end
|
||
|
||
--- @param values {[string]: any}
|
||
--- @return UIElement
|
||
function element:new(values)
|
||
return setmetatable(values, self)
|
||
end
|
||
|
||
--- Рекурсивно обходит дерево элементов вверх, начиная с первого родителя.
|
||
---
|
||
--- К каждому посещенному элементу применяет функцию visitor.
|
||
---
|
||
--- Обход заканчивается, если visitor возвращает false, или если родители кончились.
|
||
--- @param visitor fun(element: UIElement): boolean
|
||
function element:traverseUp(visitor)
|
||
if not self.parent then return end
|
||
if not visitor(self.parent) then return end
|
||
return self.parent:traverseUp(visitor)
|
||
end
|
||
|
||
return element
|