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