Current section
Files
Jump to
Current section
Files
lib/component/margin.ex
defmodule ElementTui.Component.Margin do
defstruct element: nil, fill: [], space: [1, 1, 1, 1]
def new(element, [l, t], fill) do
%ElementTui.Component.Margin{element: element, fill: fill, space: [l, t, l, t]}
end
def new(element, space, fill) do
%ElementTui.Component.Margin{element: element, fill: fill, space: space}
end
end
defimpl ElementTui.Component, for: ElementTui.Component.Margin do
alias ElementTui.Component.Margin
def calculate_dim(%Margin{element: el, space: [l, t, r, b]}, width, height) do
{w, h, _kw} = ElementTui.Parser.calculate_dim(el, width - l - r, height - t - b)
{w + l + r, h + t + b, Keyword.new()}
end
def parse(
%Margin{element: bordered_el, fill: [tl, hline, tr, vline, br, bl], space: [l, t, r, b]},
x,
y,
width,
height
) do
alias ElementTui.Element
# Does it fit?
{w, h, _} = ElementTui.Parser.calculate_dim(bordered_el, width - l - r, height - t - b)
# Something goes wrong with String duplicate and border utf8 characters, so ...
border = List.duplicate(hline, w)
top_border =
(List.duplicate(tl, l) ++ border ++ List.duplicate(tr, r))
|> Element.hbox()
|> List.duplicate(t)
|> Element.vbox()
bottom_border =
(List.duplicate(bl, l) ++ border ++ List.duplicate(br, r))
|> Element.hbox()
|> List.duplicate(b)
|> Element.vbox()
el_l = List.duplicate(List.duplicate(vline, l) |> Element.hbox(), h) |> Element.vbox()
el_r = List.duplicate(List.duplicate(vline, r) |> Element.hbox(), h) |> Element.vbox()
el =
[
el_l,
bordered_el |> Element.width(w) |> Element.height(h),
el_r
]
|> Element.hbox()
el =
[
top_border,
el,
bottom_border
]
|> Element.vbox()
ElementTui.Parser.parse(el, x, y, w + l + r, h + t + b)
end
end