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