-module(etui@widgets@tabs).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/widgets/tabs.gleam").
-export([tabs_new/1, with_active/2, with_active_style/2, with_divider/2, with_padding/2, with_colors/3, next_tab/1, prev_tab/1, render/3]).
-export_type([tabs/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 tabs() :: {tabs,
list(binary()),
integer(),
etui@style:color(),
etui@style:color(),
etui@style:style(),
binary(),
integer()}.
-file("src/etui/widgets/tabs.gleam", 31).
-spec tabs_new(list(binary())) -> tabs().
tabs_new(Labels) ->
{tabs,
Labels,
0,
default,
default,
{style,
default,
default,
etui@style:add(etui@style:bold(), etui@style:reverse())},
<<"│"/utf8>>,
1}.
-file("src/etui/widgets/tabs.gleam", 47).
-spec with_active(tabs(), integer()) -> tabs().
with_active(T, Idx) ->
{tabs,
erlang:element(2, T),
gleam@int:max(0, Idx),
erlang:element(4, T),
erlang:element(5, T),
erlang:element(6, T),
erlang:element(7, T),
erlang:element(8, T)}.
-file("src/etui/widgets/tabs.gleam", 51).
-spec with_active_style(tabs(), etui@style:style()) -> tabs().
with_active_style(T, S) ->
{tabs,
erlang:element(2, T),
erlang:element(3, T),
erlang:element(4, T),
erlang:element(5, T),
S,
erlang:element(7, T),
erlang:element(8, T)}.
-file("src/etui/widgets/tabs.gleam", 55).
-spec with_divider(tabs(), binary()) -> tabs().
with_divider(T, Div) ->
{tabs,
erlang:element(2, T),
erlang:element(3, T),
erlang:element(4, T),
erlang:element(5, T),
erlang:element(6, T),
Div,
erlang:element(8, T)}.
-file("src/etui/widgets/tabs.gleam", 59).
-spec with_padding(tabs(), integer()) -> tabs().
with_padding(T, P) ->
{tabs,
erlang:element(2, T),
erlang:element(3, T),
erlang:element(4, T),
erlang:element(5, T),
erlang:element(6, T),
erlang:element(7, T),
gleam@int:max(0, P)}.
-file("src/etui/widgets/tabs.gleam", 63).
-spec with_colors(tabs(), etui@style:color(), etui@style:color()) -> tabs().
with_colors(T, Fg, Bg) ->
{tabs,
erlang:element(2, T),
erlang:element(3, T),
Fg,
Bg,
erlang:element(6, T),
erlang:element(7, T),
erlang:element(8, T)}.
-file("src/etui/widgets/tabs.gleam", 69).
-spec next_tab(tabs()) -> tabs().
next_tab(T) ->
N = erlang:length(erlang:element(2, T)),
{tabs, erlang:element(2, T), case gleam@int:max(1, N) of
0 -> 0;
Gleam@denominator -> (erlang:element(3, T) + 1) rem Gleam@denominator
end, erlang:element(4, T), erlang:element(5, T), erlang:element(6, T), erlang:element(
7,
T
), erlang:element(8, T)}.
-file("src/etui/widgets/tabs.gleam", 74).
-spec prev_tab(tabs()) -> tabs().
prev_tab(T) ->
N = gleam@int:max(1, erlang:length(erlang:element(2, T))),
{tabs, erlang:element(2, T), case N of
0 -> 0;
Gleam@denominator -> ((erlang:element(3, T) - 1) + N) rem Gleam@denominator
end, erlang:element(4, T), erlang:element(5, T), erlang:element(6, T), erlang:element(
7,
T
), erlang:element(8, T)}.
-file("src/etui/widgets/tabs.gleam", 166).
-spec string_length(binary()) -> integer().
string_length(S) ->
etui@text:cell_width(S).
-file("src/etui/widgets/tabs.gleam", 159).
-spec make_spaces(integer()) -> binary().
make_spaces(N) ->
case N =< 0 of
true ->
<<""/utf8>>;
false ->
<<" "/utf8, (make_spaces(N - 1))/binary>>
end.
-file("src/etui/widgets/tabs.gleam", 94).
-spec render_tabs(
etui@buffer:buffer(),
etui@geometry:rect(),
list(binary()),
integer(),
integer(),
tabs()
) -> etui@buffer:buffer().
render_tabs(Buf, Area, Labels, Idx, X, T) ->
case Labels of
[] ->
Buf;
[Label | Rest] ->
Pad = make_spaces(erlang:element(8, T)),
Content = <<<<Pad/binary, Label/binary>>/binary, Pad/binary>>,
Is_active = Idx =:= erlang:element(3, T),
{Fg, Bg, Modifier} = case Is_active of
true ->
{erlang:element(2, erlang:element(6, T)),
erlang:element(3, erlang:element(6, T)),
erlang:element(4, erlang:element(6, T))};
false ->
{erlang:element(4, T),
erlang:element(5, T),
etui@style:none()}
end,
Avail = (erlang:element(2, erlang:element(2, Area)) + erlang:element(
2,
erlang:element(3, Area)
))
- X,
Shown = etui@text:truncate(Content, Avail, <<""/utf8>>),
Buf2 = etui@buffer:set_string(
Buf,
{position, X, erlang:element(3, erlang:element(2, Area))},
Shown,
Fg,
Bg,
Modifier
),
Next_x = X + string_length(Content),
case Rest of
[] ->
Buf2;
_ ->
Div_avail = (erlang:element(2, erlang:element(2, Area)) + erlang:element(
2,
erlang:element(3, Area)
))
- Next_x,
case Div_avail =< 0 of
true ->
Buf2;
false ->
Buf3 = etui@buffer:set_string(
Buf2,
{position,
Next_x,
erlang:element(3, erlang:element(2, Area))},
erlang:element(7, T),
erlang:element(4, T),
erlang:element(5, T),
etui@style:none()
),
render_tabs(
Buf3,
Area,
Rest,
Idx + 1,
Next_x + string_length(erlang:element(7, T)),
T
)
end
end
end.
-file("src/etui/widgets/tabs.gleam", 83).
?DOC(" Render the tab bar into the first row of `area`.\n").
-spec render(etui@buffer:buffer(), etui@geometry:rect(), tabs()) -> etui@buffer:buffer().
render(Buf, Area, T) ->
case (erlang:element(3, erlang:element(3, Area)) =< 0) orelse (erlang:element(
2,
erlang:element(3, Area)
)
=< 0) of
true ->
Buf;
false ->
render_tabs(
Buf,
Area,
erlang:element(2, T),
0,
erlang:element(2, erlang:element(2, Area)),
T
)
end.