Skip to main content

src/etui@widgets@statusbar.erl

-module(etui@widgets@statusbar).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/widgets/statusbar.gleam").
-export([statusbar_new/0, with_left/2, with_center/2, with_right/2, with_style/3, with_colors/3, render/3]).
-export_type([status_bar/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 status_bar() :: {status_bar,
        list(etui@span:line()),
        list(etui@span:line()),
        list(etui@span:line()),
        etui@style:color(),
        etui@style:color()}.

-file("src/etui/widgets/statusbar.gleam", 38).
?DOC(" New status bar with empty sections and default colors.\n").
-spec statusbar_new() -> status_bar().
statusbar_new() ->
    {status_bar, [], [], [], default, default}.

-file("src/etui/widgets/statusbar.gleam", 49).
?DOC(" Set left section spans.\n").
-spec with_left(status_bar(), list(etui@span:line())) -> status_bar().
with_left(Sb, Lines) ->
    {status_bar,
        Lines,
        erlang:element(3, Sb),
        erlang:element(4, Sb),
        erlang:element(5, Sb),
        erlang:element(6, Sb)}.

-file("src/etui/widgets/statusbar.gleam", 54).
?DOC(" Set center section spans.\n").
-spec with_center(status_bar(), list(etui@span:line())) -> status_bar().
with_center(Sb, Lines) ->
    {status_bar,
        erlang:element(2, Sb),
        Lines,
        erlang:element(4, Sb),
        erlang:element(5, Sb),
        erlang:element(6, Sb)}.

-file("src/etui/widgets/statusbar.gleam", 59).
?DOC(" Set right section spans.\n").
-spec with_right(status_bar(), list(etui@span:line())) -> status_bar().
with_right(Sb, Lines) ->
    {status_bar,
        erlang:element(2, Sb),
        erlang:element(3, Sb),
        Lines,
        erlang:element(5, Sb),
        erlang:element(6, Sb)}.

-file("src/etui/widgets/statusbar.gleam", 64).
?DOC(" Set foreground and background colors for the bar background.\n").
-spec with_style(status_bar(), etui@style:color(), etui@style:color()) -> status_bar().
with_style(Sb, Fg, Bg) ->
    {status_bar,
        erlang:element(2, Sb),
        erlang:element(3, Sb),
        erlang:element(4, Sb),
        Fg,
        Bg}.

-file("src/etui/widgets/statusbar.gleam", 72).
-spec with_colors(status_bar(), etui@style:color(), etui@style:color()) -> status_bar().
with_colors(Sb, Fg, Bg) ->
    {status_bar,
        erlang:element(2, Sb),
        erlang:element(3, Sb),
        erlang:element(4, Sb),
        Fg,
        Bg}.

-file("src/etui/widgets/statusbar.gleam", 157).
-spec inherit_bar_style(etui@span:line(), status_bar()) -> etui@span:line().
inherit_bar_style(Line, Sb) ->
    etui@span:line_aligned(
        gleam@list:map(
            erlang:element(2, Line),
            fun(Sp) ->
                Fg = case erlang:element(3, Sp) of
                    default ->
                        erlang:element(5, Sb);

                    _ ->
                        erlang:element(3, Sp)
                end,
                Bg = case erlang:element(4, Sp) of
                    default ->
                        erlang:element(6, Sb);

                    _ ->
                        erlang:element(4, Sp)
                end,
                {span,
                    erlang:element(2, Sp),
                    Fg,
                    Bg,
                    erlang:element(5, Sp),
                    erlang:element(6, Sp)}
            end
        ),
        erlang:element(3, Line)
    ).

-file("src/etui/widgets/statusbar.gleam", 130).
-spec render_section(
    etui@buffer:buffer(),
    list(etui@span:line()),
    integer(),
    integer(),
    integer(),
    status_bar()
) -> etui@buffer:buffer().
render_section(Buf, Lines, X, Y, Max_w, Sb) ->
    case Lines of
        [] ->
            Buf;

        [Line | _] ->
            etui@span:render_line(
                Buf,
                {position, X, Y},
                inherit_bar_style(Line, Sb),
                Max_w
            )
    end.

-file("src/etui/widgets/statusbar.gleam", 150).
-spec section_width(list(etui@span:line())) -> integer().
section_width(Lines) ->
    case Lines of
        [] ->
            0;

        [Line | _] ->
            etui@span:line_width(Line)
    end.

-file("src/etui/widgets/statusbar.gleam", 85).
?DOC(
    " Render status bar into the first row of `area`.\n"
    " Only one row is used; remaining rows in `area` are untouched.\n"
).
-spec render(etui@buffer:buffer(), etui@geometry:rect(), status_bar()) -> etui@buffer:buffer().
render(Buf, Area, Sb) ->
    case (erlang:element(2, erlang:element(3, Area)) =< 0) orelse (erlang:element(
        3,
        erlang:element(3, Area)
    )
    =< 0) of
        true ->
            Buf;

        false ->
            Y = erlang:element(3, erlang:element(2, Area)),
            W = erlang:element(2, erlang:element(3, Area)),
            Bg_row = etui@text:pad_right(<<""/utf8>>, W),
            Buf1 = etui@buffer:set_string(
                Buf,
                {position, erlang:element(2, erlang:element(2, Area)), Y},
                Bg_row,
                erlang:element(5, Sb),
                erlang:element(6, Sb),
                etui@style:none()
            ),
            Buf2 = render_section(
                Buf1,
                erlang:element(2, Sb),
                erlang:element(2, erlang:element(2, Area)),
                Y,
                W,
                Sb
            ),
            Right_width = section_width(erlang:element(4, Sb)),
            Right_x = (erlang:element(2, erlang:element(2, Area)) + W) - Right_width,
            Buf3 = case Right_x >= erlang:element(2, erlang:element(2, Area)) of
                true ->
                    render_section(
                        Buf2,
                        erlang:element(4, Sb),
                        Right_x,
                        Y,
                        Right_width,
                        Sb
                    );

                false ->
                    Buf2
            end,
            Center_width = section_width(erlang:element(3, Sb)),
            Center_x = erlang:element(2, erlang:element(2, Area)) + ((W - Center_width)
            div 2),
            render_section(
                Buf3,
                erlang:element(3, Sb),
                Center_x,
                Y,
                Center_width,
                Sb
            )
    end.