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