-module(etui@widgets@help).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/widgets/help.gleam").
-export([binding/2, help_new/1, with_mode/2, toggle_mode/1, with_separator/2, with_key_color/2, with_description_color/2, with_bg/2, render/3]).
-export_type([binding/0, help_mode/0, help/0]).
-type binding() :: {binding, list(binary()), binary()}.
-type help_mode() :: short | full.
-type help() :: {help,
list(binding()),
help_mode(),
binary(),
etui@style:color(),
etui@style:color(),
etui@style:color()}.
-file("src/etui/widgets/help.gleam", 40).
-spec binding(list(binary()), binary()) -> binding().
binding(Keys, Description) ->
{binding, Keys, Description}.
-file("src/etui/widgets/help.gleam", 44).
-spec help_new(list(binding())) -> help().
help_new(Bindings) ->
{help, Bindings, short, <<" • "/utf8>>, default, {indexed, 8}, default}.
-file("src/etui/widgets/help.gleam", 55).
-spec with_mode(help(), help_mode()) -> help().
with_mode(H, Mode) ->
{help,
erlang:element(2, H),
Mode,
erlang:element(4, H),
erlang:element(5, H),
erlang:element(6, H),
erlang:element(7, H)}.
-file("src/etui/widgets/help.gleam", 59).
-spec toggle_mode(help()) -> help().
toggle_mode(H) ->
case erlang:element(3, H) of
short ->
{help,
erlang:element(2, H),
full,
erlang:element(4, H),
erlang:element(5, H),
erlang:element(6, H),
erlang:element(7, H)};
full ->
{help,
erlang:element(2, H),
short,
erlang:element(4, H),
erlang:element(5, H),
erlang:element(6, H),
erlang:element(7, H)}
end.
-file("src/etui/widgets/help.gleam", 66).
-spec with_separator(help(), binary()) -> help().
with_separator(H, Sep) ->
{help,
erlang:element(2, H),
erlang:element(3, H),
Sep,
erlang:element(5, H),
erlang:element(6, H),
erlang:element(7, H)}.
-file("src/etui/widgets/help.gleam", 70).
-spec with_key_color(help(), etui@style:color()) -> help().
with_key_color(H, Fg) ->
{help,
erlang:element(2, H),
erlang:element(3, H),
erlang:element(4, H),
Fg,
erlang:element(6, H),
erlang:element(7, H)}.
-file("src/etui/widgets/help.gleam", 74).
-spec with_description_color(help(), etui@style:color()) -> help().
with_description_color(H, Fg) ->
{help,
erlang:element(2, H),
erlang:element(3, H),
erlang:element(4, H),
erlang:element(5, H),
Fg,
erlang:element(7, H)}.
-file("src/etui/widgets/help.gleam", 78).
-spec with_bg(help(), etui@style:color()) -> help().
with_bg(H, Bg) ->
{help,
erlang:element(2, H),
erlang:element(3, H),
erlang:element(4, H),
erlang:element(5, H),
erlang:element(6, H),
Bg}.
-file("src/etui/widgets/help.gleam", 135).
-spec render_full_rows(
etui@buffer:buffer(),
etui@geometry:rect(),
help(),
list(binding()),
integer(),
integer(),
integer()
) -> etui@buffer:buffer().
render_full_rows(Buf, Area, H, Bindings, Row, Key_col, Desc_col) ->
case Row >= erlang:element(3, erlang:element(3, Area)) of
true ->
Buf;
false ->
case Bindings of
[] ->
Buf;
[B | Rest] ->
Y = erlang:element(3, erlang:element(2, Area)) + Row,
Key_text = etui@text:truncate(
gleam@string:join(erlang:element(2, B), <<"/"/utf8>>),
Key_col,
<<""/utf8>>
),
Key_padded = etui@text:pad_right(Key_text, Key_col),
Buf2 = etui@buffer:set_string(
Buf,
{position,
erlang:element(2, erlang:element(2, Area)),
Y},
Key_padded,
erlang:element(5, H),
erlang:element(7, H),
etui@style:bold()
),
Desc_text = etui@text:truncate(
erlang:element(3, B),
Desc_col,
<<""/utf8>>
),
Desc_padded = etui@text:pad_right(Desc_text, Desc_col),
Buf3 = etui@buffer:set_string(
Buf2,
{position,
(erlang:element(2, erlang:element(2, Area)) + Key_col)
+ 1,
Y},
Desc_padded,
erlang:element(6, H),
erlang:element(7, H),
etui@style:none()
),
render_full_rows(
Buf3,
Area,
H,
Rest,
Row + 1,
Key_col,
Desc_col
)
end
end.
-file("src/etui/widgets/help.gleam", 121).
-spec render_full(etui@buffer:buffer(), etui@geometry:rect(), help()) -> etui@buffer:buffer().
render_full(Buf, Area, H) ->
Max_key_w = gleam@list:fold(
erlang:element(2, H),
0,
fun(Acc, B) ->
gleam@int:max(
Acc,
etui@text:cell_width(
gleam@string:join(erlang:element(2, B), <<"/"/utf8>>)
)
)
end
),
Key_col = gleam@int:min(
Max_key_w,
gleam@int:max(0, erlang:element(2, erlang:element(3, Area)) div 3)
),
Desc_col = gleam@int:max(
0,
(erlang:element(2, erlang:element(3, Area)) - Key_col) - 1
),
render_full_rows(Buf, Area, H, erlang:element(2, H), 0, Key_col, Desc_col).
-file("src/etui/widgets/help.gleam", 100).
-spec render_short(etui@buffer:buffer(), etui@geometry:rect(), help()) -> etui@buffer:buffer().
render_short(Buf, Area, H) ->
Txt = begin
_pipe = erlang:element(2, H),
_pipe@1 = gleam@list:map(
_pipe,
fun(B) ->
<<<<(gleam@string:join(erlang:element(2, B), <<"/"/utf8>>))/binary,
" "/utf8>>/binary,
(erlang:element(3, B))/binary>>
end
),
gleam@string:join(_pipe@1, erlang:element(4, H))
end,
Line = etui@text:truncate(
Txt,
erlang:element(2, erlang:element(3, Area)),
<<""/utf8>>
),
Padded = etui@text:pad_right(
Line,
erlang:element(2, erlang:element(3, Area))
),
etui@buffer:set_string(
Buf,
erlang:element(2, Area),
Padded,
erlang:element(6, H),
erlang:element(7, H),
etui@style:none()
).
-file("src/etui/widgets/help.gleam", 85).
-spec render(etui@buffer:buffer(), etui@geometry:rect(), help()) -> etui@buffer:buffer().
render(Buf, Area, H) ->
case (erlang:element(2, erlang:element(3, Area)) =< 0) orelse (erlang:element(
3,
erlang:element(3, Area)
)
=< 0) of
true ->
Buf;
false ->
case erlang:element(3, H) of
short ->
render_short(Buf, Area, H);
full ->
render_full(Buf, Area, H)
end
end.