-module(etui@widgets@gradient_bar).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/widgets/gradient_bar.gleam").
-export([gradient_bar_new/1, animated_gradient_bar_new/1, rainbow_bar/0, animated_rainbow_bar/0, pulse_bar/1, gradient_progress_new/2, with_percent/2, with_chars/3, with_period/2, with_modifier/2, with_bg/2, render/4]).
-export_type([gradient_fill/0, gradient_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 gradient_fill() :: {linear_gradient, list(etui@style:color())} |
{animated_linear, list(etui@style:color())} |
rainbow |
animated_rainbow |
{pulse, etui@style:color()}.
-type gradient_bar() :: {gradient_bar,
gradient_fill(),
binary(),
binary(),
integer(),
etui@style:modifier(),
etui@style:color(),
integer()}.
-file("src/etui/widgets/gradient_bar.gleam", 41).
?DOC(" Static linear gradient bar (full width).\n").
-spec gradient_bar_new(list(etui@style:color())) -> gradient_bar().
gradient_bar_new(Stops) ->
{gradient_bar,
{linear_gradient, Stops},
<<"█"/utf8>>,
<<"░"/utf8>>,
100,
etui@style:none(),
default,
60}.
-file("src/etui/widgets/gradient_bar.gleam", 54).
?DOC(" Animated (scrolling) gradient bar (full width).\n").
-spec animated_gradient_bar_new(list(etui@style:color())) -> gradient_bar().
animated_gradient_bar_new(Stops) ->
{gradient_bar,
{animated_linear, Stops},
<<"█"/utf8>>,
<<"░"/utf8>>,
100,
etui@style:none(),
default,
60}.
-file("src/etui/widgets/gradient_bar.gleam", 67).
?DOC(" Static rainbow bar (full width).\n").
-spec rainbow_bar() -> gradient_bar().
rainbow_bar() ->
{gradient_bar,
rainbow,
<<"█"/utf8>>,
<<" "/utf8>>,
100,
etui@style:none(),
default,
60}.
-file("src/etui/widgets/gradient_bar.gleam", 80).
?DOC(" Animated (rotating) rainbow bar (full width).\n").
-spec animated_rainbow_bar() -> gradient_bar().
animated_rainbow_bar() ->
{gradient_bar,
animated_rainbow,
<<"█"/utf8>>,
<<" "/utf8>>,
100,
etui@style:none(),
default,
60}.
-file("src/etui/widgets/gradient_bar.gleam", 93).
?DOC(" Pulsing single-color bar (full width).\n").
-spec pulse_bar(etui@style:color()) -> gradient_bar().
pulse_bar(Base) ->
{gradient_bar,
{pulse, Base},
<<"█"/utf8>>,
<<" "/utf8>>,
100,
etui@style:none(),
default,
30}.
-file("src/etui/widgets/gradient_bar.gleam", 106).
?DOC(" Gradient progress bar: partial fill, static gradient.\n").
-spec gradient_progress_new(list(etui@style:color()), integer()) -> gradient_bar().
gradient_progress_new(Stops, Percent) ->
{gradient_bar,
{linear_gradient, Stops},
<<"█"/utf8>>,
<<"░"/utf8>>,
gleam@int:clamp(Percent, 0, 100),
etui@style:none(),
default,
60}.
-file("src/etui/widgets/gradient_bar.gleam", 124).
-spec with_percent(gradient_bar(), integer()) -> gradient_bar().
with_percent(G, Pct) ->
{gradient_bar,
erlang:element(2, G),
erlang:element(3, G),
erlang:element(4, G),
gleam@int:clamp(Pct, 0, 100),
erlang:element(6, G),
erlang:element(7, G),
erlang:element(8, G)}.
-file("src/etui/widgets/gradient_bar.gleam", 128).
-spec with_chars(gradient_bar(), binary(), binary()) -> gradient_bar().
with_chars(G, Filled, Empty) ->
{gradient_bar,
erlang:element(2, G),
Filled,
Empty,
erlang:element(5, G),
erlang:element(6, G),
erlang:element(7, G),
erlang:element(8, G)}.
-file("src/etui/widgets/gradient_bar.gleam", 136).
-spec with_period(gradient_bar(), integer()) -> gradient_bar().
with_period(G, Period) ->
{gradient_bar,
erlang:element(2, G),
erlang:element(3, G),
erlang:element(4, G),
erlang:element(5, G),
erlang:element(6, G),
erlang:element(7, G),
gleam@int:max(1, Period)}.
-file("src/etui/widgets/gradient_bar.gleam", 140).
-spec with_modifier(gradient_bar(), etui@style:modifier()) -> gradient_bar().
with_modifier(G, M) ->
{gradient_bar,
erlang:element(2, G),
erlang:element(3, G),
erlang:element(4, G),
erlang:element(5, G),
M,
erlang:element(7, G),
erlang:element(8, G)}.
-file("src/etui/widgets/gradient_bar.gleam", 144).
-spec with_bg(gradient_bar(), etui@style:color()) -> gradient_bar().
with_bg(G, Bg) ->
{gradient_bar,
erlang:element(2, G),
erlang:element(3, G),
erlang:element(4, G),
erlang:element(5, G),
erlang:element(6, G),
Bg,
erlang:element(8, G)}.
-file("src/etui/widgets/gradient_bar.gleam", 217).
-spec cell_color(gradient_fill(), integer(), integer(), integer(), integer()) -> etui@style:color().
cell_color(Fill, X, Width, Frame, Period) ->
P = gleam@int:max(1, Period),
W = gleam@int:max(1, Width),
case Fill of
{linear_gradient, Stops} ->
etui@color:gradient(Stops, X, W - 1);
{animated_linear, Stops@1} ->
Offset = case P of
0 -> 0;
Gleam@denominator -> Frame * W div Gleam@denominator
end,
etui@color:gradient(Stops@1, case W of
0 -> 0;
Gleam@denominator@1 -> (X + Offset) rem Gleam@denominator@1
end, W - 1);
rainbow ->
etui@color:hue_to_rgb(case W of
0 -> 0;
Gleam@denominator@2 -> X * 360 div Gleam@denominator@2
end);
animated_rainbow ->
etui@color:hue_to_rgb(((case W of
0 -> 0;
Gleam@denominator@3 -> X * 360 div Gleam@denominator@3
end) + (case P of
0 -> 0;
Gleam@denominator@4 -> Frame * 360 div Gleam@denominator@4
end)) rem 360);
{pulse, Base} ->
etui@color:pulse(Base, Frame + (case W of
0 -> 0;
Gleam@denominator@5 -> X * P div Gleam@denominator@5
end), P)
end.
-file("src/etui/widgets/gradient_bar.gleam", 186).
-spec render_row_cells(
etui@buffer:buffer(),
etui@geometry:rect(),
gradient_bar(),
integer(),
integer(),
integer(),
integer(),
integer()
) -> etui@buffer:buffer().
render_row_cells(Buf, Area, G, Frame, Width, Fill_width, X, Y) ->
case X >= Width of
true ->
Buf;
false ->
Pos = {position,
erlang:element(2, erlang:element(2, Area)) + X,
erlang:element(3, erlang:element(2, Area)) + Y},
{Sym, Fg} = case X < Fill_width of
true ->
C = cell_color(
erlang:element(2, G),
X,
Fill_width,
Frame,
erlang:element(8, G)
),
{erlang:element(3, G), C};
false ->
{erlang:element(4, G), default}
end,
Buf2 = etui@buffer:set_string(
Buf,
Pos,
Sym,
Fg,
erlang:element(7, G),
erlang:element(6, G)
),
render_row_cells(Buf2, Area, G, Frame, Width, Fill_width, X + 1, Y)
end.
-file("src/etui/widgets/gradient_bar.gleam", 168).
-spec render_rows(
etui@buffer:buffer(),
etui@geometry:rect(),
gradient_bar(),
integer(),
integer(),
integer(),
integer()
) -> etui@buffer:buffer().
render_rows(Buf, Area, G, Frame, Width, Fill_width, Y) ->
case Y >= erlang:element(3, erlang:element(3, Area)) of
true ->
Buf;
false ->
Buf2 = render_row_cells(
Buf,
Area,
G,
Frame,
Width,
Fill_width,
0,
Y
),
render_rows(Buf2, Area, G, Frame, Width, Fill_width, Y + 1)
end.
-file("src/etui/widgets/gradient_bar.gleam", 152).
?DOC(" Render the gradient bar into `buf` at `area`. `frame` drives animation.\n").
-spec render(
etui@buffer:buffer(),
etui@geometry:rect(),
gradient_bar(),
integer()
) -> etui@buffer:buffer().
render(Buf, Area, G, Frame) ->
case (erlang:element(2, erlang:element(3, Area)) =< 0) orelse (erlang:element(
3,
erlang:element(3, Area)
)
=< 0) of
true ->
Buf;
false ->
Width = erlang:element(2, erlang:element(3, Area)),
Fill_width = (Width * gleam@int:clamp(erlang:element(5, G), 0, 100))
div 100,
render_rows(Buf, Area, G, Frame, Width, Fill_width, 0)
end.