Skip to main content

src/etui@widgets@hbar.erl

-module(etui@widgets@hbar).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/widgets/hbar.gleam").
-export([hbar_new/1, item/2, with_fill/2, with_max/2, with_label_width/2, with_show_value/2, with_chars/3, with_period/2, with_bg/2, with_style/2, render/4]).
-export_type([h_bar_fill/0, h_bar_item/0, h_bar/0]).

-type h_bar_fill() :: {h_bar_solid, list(etui@style:color())} |
    {h_bar_gradient, list(etui@style:color())} |
    h_bar_rainbow |
    h_bar_animated_rainbow.

-type h_bar_item() :: {h_bar_item, binary(), integer()}.

-type h_bar() :: {h_bar,
        list(h_bar_item()),
        integer(),
        h_bar_fill(),
        integer(),
        boolean(),
        binary(),
        binary(),
        etui@style:color(),
        integer()}.

-file("src/etui/widgets/hbar.gleam", 50).
-spec hbar_new(list(h_bar_item())) -> h_bar().
hbar_new(Items) ->
    {h_bar,
        Items,
        0,
        h_bar_rainbow,
        0,
        true,
        <<"â–ˆ"/utf8>>,
        <<"â–‘"/utf8>>,
        default,
        60}.

-file("src/etui/widgets/hbar.gleam", 64).
-spec item(binary(), integer()) -> h_bar_item().
item(Label, Value) ->
    {h_bar_item, Label, Value}.

-file("src/etui/widgets/hbar.gleam", 68).
-spec with_fill(h_bar(), h_bar_fill()) -> h_bar().
with_fill(H, Fill) ->
    {h_bar,
        erlang:element(2, H),
        erlang:element(3, H),
        Fill,
        erlang:element(5, H),
        erlang:element(6, H),
        erlang:element(7, H),
        erlang:element(8, H),
        erlang:element(9, H),
        erlang:element(10, H)}.

-file("src/etui/widgets/hbar.gleam", 72).
-spec with_max(h_bar(), integer()) -> h_bar().
with_max(H, Max) ->
    {h_bar,
        erlang:element(2, H),
        gleam@int:max(1, Max),
        erlang:element(4, H),
        erlang:element(5, H),
        erlang:element(6, H),
        erlang:element(7, H),
        erlang:element(8, H),
        erlang:element(9, H),
        erlang:element(10, H)}.

-file("src/etui/widgets/hbar.gleam", 76).
-spec with_label_width(h_bar(), integer()) -> h_bar().
with_label_width(H, W) ->
    {h_bar,
        erlang:element(2, H),
        erlang:element(3, H),
        erlang:element(4, H),
        gleam@int:max(0, W),
        erlang:element(6, H),
        erlang:element(7, H),
        erlang:element(8, H),
        erlang:element(9, H),
        erlang:element(10, H)}.

-file("src/etui/widgets/hbar.gleam", 80).
-spec with_show_value(h_bar(), boolean()) -> h_bar().
with_show_value(H, Show) ->
    {h_bar,
        erlang:element(2, H),
        erlang:element(3, H),
        erlang:element(4, H),
        erlang:element(5, H),
        Show,
        erlang:element(7, H),
        erlang:element(8, H),
        erlang:element(9, H),
        erlang:element(10, H)}.

-file("src/etui/widgets/hbar.gleam", 84).
-spec with_chars(h_bar(), binary(), binary()) -> h_bar().
with_chars(H, Bar, Empty) ->
    {h_bar,
        erlang:element(2, H),
        erlang:element(3, H),
        erlang:element(4, H),
        erlang:element(5, H),
        erlang:element(6, H),
        Bar,
        Empty,
        erlang:element(9, H),
        erlang:element(10, H)}.

-file("src/etui/widgets/hbar.gleam", 88).
-spec with_period(h_bar(), integer()) -> h_bar().
with_period(H, Period) ->
    {h_bar,
        erlang:element(2, H),
        erlang:element(3, H),
        erlang:element(4, H),
        erlang:element(5, H),
        erlang:element(6, H),
        erlang:element(7, H),
        erlang:element(8, H),
        erlang:element(9, H),
        gleam@int:max(1, Period)}.

-file("src/etui/widgets/hbar.gleam", 92).
-spec with_bg(h_bar(), etui@style:color()) -> h_bar().
with_bg(H, Bg) ->
    {h_bar,
        erlang:element(2, H),
        erlang:element(3, H),
        erlang:element(4, H),
        erlang:element(5, H),
        erlang:element(6, H),
        erlang:element(7, H),
        erlang:element(8, H),
        Bg,
        erlang:element(10, H)}.

-file("src/etui/widgets/hbar.gleam", 96).
-spec with_style(h_bar(), etui@style:style()) -> h_bar().
with_style(H, S) ->
    {h_bar,
        erlang:element(2, H),
        erlang:element(3, H),
        erlang:element(4, H),
        erlang:element(5, H),
        erlang:element(6, H),
        erlang:element(7, H),
        erlang:element(8, H),
        erlang:element(3, S),
        erlang:element(10, H)}.

-file("src/etui/widgets/hbar.gleam", 274).
-spec render_empty_loop(
    etui@buffer:buffer(),
    h_bar(),
    integer(),
    integer(),
    integer(),
    integer()
) -> etui@buffer:buffer().
render_empty_loop(Buf, H, Base_x, Y, Count, I) ->
    case I >= Count of
        true ->
            Buf;

        false ->
            Buf2 = etui@buffer:set_string(
                Buf,
                {position, Base_x + I, Y},
                erlang:element(8, H),
                default,
                erlang:element(9, H),
                etui@style:none()
            ),
            render_empty_loop(Buf2, H, Base_x, Y, Count, I + 1)
    end.

-file("src/etui/widgets/hbar.gleam", 264).
-spec render_empty(
    etui@buffer:buffer(),
    h_bar(),
    integer(),
    integer(),
    integer()
) -> etui@buffer:buffer().
render_empty(Buf, H, Base_x, Y, Count) ->
    render_empty_loop(Buf, H, Base_x, Y, Count, 0).

-file("src/etui/widgets/hbar.gleam", 331).
-spec color_at(list(etui@style:color()), integer()) -> etui@style:color().
color_at(Colors, N) ->
    case {Colors, N} of
        {[], _} ->
            default;

        {[C | _], 0} ->
            C;

        {[_ | Rest], _} ->
            color_at(Rest, N - 1)
    end.

-file("src/etui/widgets/hbar.gleam", 323).
-spec nth_color(list(etui@style:color()), integer()) -> etui@style:color().
nth_color(Colors, N) ->
    Len = erlang:length(Colors),
    case Len of
        0 ->
            default;

        _ ->
            color_at(Colors, case Len of
                    0 -> 0;
                    Gleam@denominator -> N rem Gleam@denominator
                end)
    end.

-file("src/etui/widgets/hbar.gleam", 302).
-spec cell_color(
    h_bar_fill(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer()
) -> etui@style:color().
cell_color(Fill, Bar_idx, N, X, Bar_w, Frame, Period) ->
    P = gleam@int:max(1, Period),
    Nb = gleam@int:max(1, N),
    W = gleam@int:max(1, Bar_w),
    case Fill of
        {h_bar_solid, Colors} ->
            nth_color(Colors, Bar_idx);

        {h_bar_gradient, Stops} ->
            etui@color:gradient(Stops, X, W - 1);

        h_bar_rainbow ->
            etui@color:hue_to_rgb(case Nb of
                    0 -> 0;
                    Gleam@denominator -> Bar_idx * 360 div Gleam@denominator
                end);

        h_bar_animated_rainbow ->
            etui@color:hue_to_rgb(((case Nb of
                    0 -> 0;
                    Gleam@denominator@1 -> Bar_idx * 360 div Gleam@denominator@1
                end) + (case P of
                    0 -> 0;
                    Gleam@denominator@2 -> Frame * 360 div Gleam@denominator@2
                end)) rem 360)
    end.

-file("src/etui/widgets/hbar.gleam", 223).
-spec render_filled_loop(
    etui@buffer:buffer(),
    h_bar(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer()
) -> etui@buffer:buffer().
render_filled_loop(Buf, H, Bar_idx, N, Base_x, Y, Count, Bar_w, Frame, I) ->
    case I >= Count of
        true ->
            Buf;

        false ->
            Fg = cell_color(
                erlang:element(4, H),
                Bar_idx,
                N,
                I,
                Bar_w,
                Frame,
                erlang:element(10, H)
            ),
            Buf2 = etui@buffer:set_string(
                Buf,
                {position, Base_x + I, Y},
                erlang:element(7, H),
                Fg,
                erlang:element(9, H),
                etui@style:none()
            ),
            render_filled_loop(
                Buf2,
                H,
                Bar_idx,
                N,
                Base_x,
                Y,
                Count,
                Bar_w,
                Frame,
                I + 1
            )
    end.

-file("src/etui/widgets/hbar.gleam", 209).
-spec render_filled(
    etui@buffer:buffer(),
    h_bar(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer()
) -> etui@buffer:buffer().
render_filled(Buf, H, Bar_idx, N, Base_x, Y, Count, Bar_w, Frame) ->
    render_filled_loop(Buf, H, Bar_idx, N, Base_x, Y, Count, Bar_w, Frame, 0).

-file("src/etui/widgets/hbar.gleam", 161).
-spec render_row(
    etui@buffer:buffer(),
    etui@geometry:rect(),
    h_bar(),
    h_bar_item(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer()
) -> etui@buffer:buffer().
render_row(Buf, Area, H, It, Idx, N, Max, Lw, Val_w, Y, Frame) ->
    Label = etui@text:pad_right(
        etui@text:truncate(erlang:element(2, It), Lw, <<""/utf8>>),
        Lw
    ),
    Buf@1 = etui@buffer:set_string(
        Buf,
        {position, erlang:element(2, erlang:element(2, Area)), Y},
        Label,
        default,
        default,
        etui@style:none()
    ),
    Bar_x = (erlang:element(2, erlang:element(2, Area)) + Lw) + 1,
    Bar_w = gleam@int:max(
        0,
        ((erlang:element(2, erlang:element(3, Area)) - Lw) - 1) - Val_w
    ),
    Filled = gleam@int:clamp(case gleam@int:max(1, Max) of
            0 -> 0;
            Gleam@denominator -> erlang:element(3, It) * Bar_w div Gleam@denominator
        end, 0, Bar_w),
    Empty = Bar_w - Filled,
    Buf@2 = render_filled(Buf@1, H, Idx, N, Bar_x, Y, Filled, Bar_w, Frame),
    Buf@3 = render_empty(Buf@2, H, Bar_x + Filled, Y, Empty),
    case erlang:element(6, H) andalso (Val_w > 0) of
        false ->
            Buf@3;

        true ->
            etui@buffer:set_string(
                Buf@3,
                {position, (Bar_x + Bar_w) + 1, Y},
                erlang:integer_to_binary(erlang:element(3, It)),
                default,
                default,
                etui@style:none()
            )
    end.

-file("src/etui/widgets/hbar.gleam", 133).
-spec render_rows(
    etui@buffer:buffer(),
    etui@geometry:rect(),
    h_bar(),
    list(h_bar_item()),
    integer(),
    integer(),
    integer(),
    integer(),
    integer(),
    integer()
) -> etui@buffer:buffer().
render_rows(Buf, Area, H, Items, Idx, N, Max, Lw, Val_w, Frame) ->
    case Items of
        [] ->
            Buf;

        [It | Rest] ->
            case Idx >= erlang:element(3, erlang:element(3, Area)) of
                true ->
                    Buf;

                false ->
                    Y = erlang:element(3, erlang:element(2, Area)) + Idx,
                    Buf2 = render_row(
                        Buf,
                        Area,
                        H,
                        It,
                        Idx,
                        N,
                        Max,
                        Lw,
                        Val_w,
                        Y,
                        Frame
                    ),
                    render_rows(
                        Buf2,
                        Area,
                        H,
                        Rest,
                        Idx + 1,
                        N,
                        Max,
                        Lw,
                        Val_w,
                        Frame
                    )
            end
    end.

-file("src/etui/widgets/hbar.gleam", 339).
-spec num_digits(integer()) -> integer().
num_digits(N) ->
    case N < 10 of
        true ->
            1;

        false ->
            1 + num_digits(N div 10)
    end.

-file("src/etui/widgets/hbar.gleam", 103).
-spec render(etui@buffer:buffer(), etui@geometry:rect(), h_bar(), integer()) -> etui@buffer:buffer().
render(Buf, Area, H, Frame) ->
    case (erlang:element(2, erlang:element(3, Area)) =< 0) orelse (erlang:element(
        3,
        erlang:element(3, Area)
    )
    =< 0) of
        true ->
            Buf;

        false ->
            Max = case erlang:element(3, H) of
                0 ->
                    gleam@list:fold(
                        erlang:element(2, H),
                        1,
                        fun(Acc, It) ->
                            gleam@int:max(Acc, erlang:element(3, It))
                        end
                    );

                M ->
                    M
            end,
            Lw = case erlang:element(5, H) of
                0 ->
                    gleam@list:fold(
                        erlang:element(2, H),
                        0,
                        fun(Acc@1, It@1) ->
                            gleam@int:max(
                                Acc@1,
                                etui@text:cell_width(erlang:element(2, It@1))
                            )
                        end
                    );

                W ->
                    W
            end,
            Val_w = case erlang:element(6, H) of
                false ->
                    0;

                true ->
                    num_digits(Max) + 2
            end,
            N = erlang:length(erlang:element(2, H)),
            render_rows(
                Buf,
                Area,
                H,
                erlang:element(2, H),
                0,
                N,
                Max,
                Lw,
                Val_w,
                Frame
            )
    end.