implement UIElement.debugDraw

This commit is contained in:
PeaAshMeter 2026-06-05 23:56:11 +03:00
parent cfe8f83087
commit 1febc65922
5 changed files with 45 additions and 17 deletions

View File

@ -1,18 +1,20 @@
local Element = require "lib.simple_ui.core.element"
--- Объект, который отвечает за работу с элементами интерфейса одного экрана --- Объект, который отвечает за работу с элементами интерфейса одного экрана
--- @class UIBuilder --- @class UIBuilder
--- @field builder fun(): UIElement --- @field builder fun(): UIElement
--- @field debugDraw boolean
--- @field private states {string: table} --- @field private states {string: table}
--- @field private elementTree UIElement --- @field private elementTree UIElement
local builder = {} local builder = {}
builder.__index = builder builder.__index = builder
--- @param cfg {debugDraw: boolean?, builder: (fun(): UIElement)}
--- @return UIBuilder --- @return UIBuilder
local function new(from) function builder.new(cfg)
from.states = {} local t = setmetatable(cfg, builder)
setmetatable(from, builder) t.states = {}
return from t.builder = cfg.builder
t.debugDraw = cfg.debugDraw or false
return cfg
end end
--- @param newNode UIElement? --- @param newNode UIElement?
@ -103,6 +105,9 @@ end
function builder:draw() function builder:draw()
self.elementTree:draw() self.elementTree:draw()
if self.debugDraw then
self.elementTree:debugDraw()
end
end end
return new return builder.new

View File

@ -24,6 +24,17 @@ function element:update(dt) end
function element:draw() end function element:draw() end
function element:debugDraw()
love.graphics.setColor(1, 0, 0)
love.graphics.line(0, 0, self._size_.x, 0)
love.graphics.line(0, 0, 0, self._size_.y)
love.graphics.line(self._size_.x, 0, self._size_.x,
self._size_.y)
love.graphics.line(0, self._size_.y, self._size_.x,
self._size_.y)
love.graphics.setColor(1, 1, 1)
end
--- Рекурсивно обходит дерево элементов вверх, начиная с первого родителя. --- Рекурсивно обходит дерево элементов вверх, начиная с первого родителя.
--- ---
--- К каждому посещенному элементу применяет функцию visitor. --- К каждому посещенному элементу применяет функцию visitor.

View File

@ -24,17 +24,18 @@ function element:draw()
for _, child in ipairs(self._children_) do for _, child in ipairs(self._children_) do
child:draw() child:draw()
end end
love.graphics.pop()
end
function element:debugDraw()
love.graphics.push("transform")
love.graphics.translate(self._offset_.x, self._offset_.y)
--- @TODO: сделать дебажный метод для отрисовки границ for _, child in ipairs(self._children_) do
love.graphics.setColor(1, 0, 0) child:debugDraw()
love.graphics.line(0, 0, self._size_.x, 0) end
love.graphics.line(0, 0, 0, self._size_.y)
love.graphics.line(self._size_.x, 0, self._size_.x, Element.debugDraw(self)
self._size_.y)
love.graphics.line(0, self._size_.y, self._size_.x,
self._size_.y)
love.graphics.setColor(1, 1, 1)
love.graphics.pop() love.graphics.pop()
end end

View File

@ -33,6 +33,17 @@ function element:draw()
love.graphics.pop() love.graphics.pop()
end end
function element:debugDraw()
love.graphics.push("transform")
love.graphics.translate(self._offset_.x, self._offset_.y)
if self._child_ then self._child_:debugDraw() end
Element.debugDraw(self)
love.graphics.pop()
end
--- @generic T : SingleChildElement --- @generic T : SingleChildElement
--- @param self T --- @param self T
--- @param values {child: UIElement?, [string]: any} --- @param values {child: UIElement?, [string]: any}

View File

@ -22,7 +22,6 @@ end
function Canary:build() function Canary:build()
self.state.i = self.state.i and self.state.i + 1 or 0 self.state.i = self.state.i and self.state.i + 1 or 0
print(self.state.i)
return Placeholder:new {} return Placeholder:new {}
end end
@ -97,6 +96,7 @@ function MyWidget:build()
end end
return Builder { return Builder {
debugDraw = true,
builder = function() builder = function()
return ScreenArea:new { return ScreenArea:new {
child = MyWidget:new {} child = MyWidget:new {}