-module(etui@widgets@line).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/widgets/line.gleam").
-export([line_new/0, with_color/2, render_horizontal/3, render_vertical/3]).
-export_type([line_style/0, line/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type line_style() :: solid.
-type line() :: {line, line_style(), etui@style:color()}.
-file("src/etui/widgets/line.gleam", 23).
?DOC(" New solid line with default terminal color.\n").
-spec line_new() -> line().
line_new() ->
{line, solid, default}.
-file("src/etui/widgets/line.gleam", 28).
?DOC(" Set the line color.\n").
-spec with_color(line(), etui@style:color()) -> line().
with_color(L, Color) ->
{line, erlang:element(2, L), Color}.
-file("src/etui/widgets/line.gleam", 47).
-spec render_horizontal_line(
etui@buffer:buffer(),
etui@geometry:rect(),
line(),
integer(),
binary()
) -> etui@buffer:buffer().
render_horizontal_line(Buf, Area, L, X, Char) ->
case X >= erlang:element(2, erlang:element(3, Area)) of
true ->
Buf;
false ->
Pos = {position,
erlang:element(2, erlang:element(2, Area)) + X,
erlang:element(3, erlang:element(2, Area))},
Buf_new = etui@buffer:set_string(
Buf,
Pos,
Char,
erlang:element(3, L),
default,
etui@style:none()
),
render_horizontal_line(Buf_new, Area, L, X + 1, Char)
end.
-file("src/etui/widgets/line.gleam", 36).
?DOC(" Render horizontal line.\n").
-spec render_horizontal(etui@buffer:buffer(), etui@geometry:rect(), line()) -> etui@buffer:buffer().
render_horizontal(Buf, Area, L) ->
case erlang:element(2, erlang:element(3, Area)) =< 0 of
true ->
Buf;
false ->
render_horizontal_line(Buf, Area, L, 0, <<"─"/utf8>>)
end.
-file("src/etui/widgets/line.gleam", 80).
-spec render_vertical_line(
etui@buffer:buffer(),
etui@geometry:rect(),
line(),
integer(),
binary()
) -> etui@buffer:buffer().
render_vertical_line(Buf, Area, L, Y, Char) ->
case Y >= erlang:element(3, erlang:element(3, Area)) of
true ->
Buf;
false ->
Pos = {position,
erlang:element(2, erlang:element(2, Area)),
erlang:element(3, erlang:element(2, Area)) + Y},
Buf_new = etui@buffer:set_string(
Buf,
Pos,
Char,
erlang:element(3, L),
default,
etui@style:none()
),
render_vertical_line(Buf_new, Area, L, Y + 1, Char)
end.
-file("src/etui/widgets/line.gleam", 66).
?DOC(" Render vertical line.\n").
-spec render_vertical(etui@buffer:buffer(), etui@geometry:rect(), line()) -> etui@buffer:buffer().
render_vertical(Buf, Area, L) ->
case erlang:element(3, erlang:element(3, Area)) =< 0 of
true ->
Buf;
false ->
Char = <<"│"/utf8>>,
render_vertical_line(Buf, Area, L, 0, Char)
end.