46 lines
1.6 KiB
Lua
46 lines
1.6 KiB
Lua
local Constraints = require "lib.simple_ui.core.constraints"
|
||
local Vec3 = require "lib.utils.vec3"
|
||
|
||
--- @class UIElement
|
||
--- @field key? any Must be convertible to string
|
||
--- @field type string
|
||
--- @field _parent_? UIElement
|
||
--- @field _constraints_ Constraints
|
||
--- @field _offset_ Vec3 Положение левого верхнего угла элемента в локальных координатах {x, y}. Устанавливается родительским элементом.
|
||
--- @field _size_ Vec3 Размеры элемента {x, y}
|
||
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
|
||
|
||
--- Рекурсивно обходит дерево элементов вверх, начиная с первого родителя.
|
||
---
|
||
--- К каждому посещенному элементу применяет функцию 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
|
||
|
||
--- @param values {[string]: any}
|
||
--- @return UIElement
|
||
function element:new(values)
|
||
return setmetatable(values, self)
|
||
end
|
||
|
||
return element
|