Skip to main content

src/etui@widgets@line.erl

-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.