-module(etui@widget).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/widget.gleam").
-export([render_stateful/4, freeze/2, freeze_frame/2, layer/2, at/2, compose/3, stack/1, empty/0]).
-export_type([stateful_widget/1]).
-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 stateful_widget(FER) :: {stateful_widget,
fun((etui@buffer:buffer(), etui@geometry:rect(), FER) -> etui@buffer:buffer())}.
-file("src/etui/widget.gleam", 102).
?DOC(" Render a stateful widget with the given state value.\n").
-spec render_stateful(
etui@buffer:buffer(),
etui@geometry:rect(),
stateful_widget(FES),
FES
) -> etui@buffer:buffer().
render_stateful(Buf, Area, W, State) ->
(erlang:element(2, W))(Buf, Area, State).
-file("src/etui/widget.gleam", 113).
?DOC(
" Bake state into a stateless Widget.\n"
" The resulting Widget ignores any state updates after this call.\n"
).
-spec freeze(stateful_widget(FEU), FEU) -> fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()).
freeze(W, State) ->
fun(Buf, Area) -> (erlang:element(2, W))(Buf, Area, State) end.
-file("src/etui/widget.gleam", 121).
?DOC(" Bind a frame number to an AnimatedWidget, producing a stateless Widget.\n").
-spec freeze_frame(
fun((etui@buffer:buffer(), etui@geometry:rect(), integer()) -> etui@buffer:buffer()),
integer()
) -> fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()).
freeze_frame(W, Frame) ->
fun(Buf, Area) -> W(Buf, Area, Frame) end.
-file("src/etui/widget.gleam", 130).
?DOC(
" Draw two widgets in the same area: `bottom` first, then `top` on top.\n"
" Use for overlaying a popup, cursor, or status indicator over content.\n"
).
-spec layer(
fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()),
fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer())
) -> fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()).
layer(Bottom, Top) ->
fun(Buf, Area) -> _pipe = Buf,
_pipe@1 = Bottom(_pipe, Area),
Top(_pipe@1, Area) end.
-file("src/etui/widget.gleam", 136).
?DOC(
" Pin a widget to a fixed `sub_area`, ignoring the caller-supplied area.\n"
" Use when a widget's position is pre-computed and shouldn't be overridden.\n"
).
-spec at(
fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()),
etui@geometry:rect()
) -> fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()).
at(W, Sub_area) ->
fun(Buf, _) -> W(Buf, Sub_area) end.
-file("src/etui/widget.gleam", 153).
?DOC(
" Render `border_w` over `area`, then `content_w` over `inner_area`.\n"
" Convenience for the common \"block border + child content\" pattern:\n"
"\n"
" ```gleam\n"
" let blk = block.block_new() |> block.with_border(block.Single)\n"
" let inner = block.inner(area, blk)\n"
" let composed = widget.compose(\n"
" fn(buf, a) { block.render(buf, a, blk) },\n"
" inner,\n"
" fn(buf, a) { paragraph.render(buf, a, para) },\n"
" )\n"
" composed(buf, area)\n"
" ```\n"
).
-spec compose(
fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()),
etui@geometry:rect(),
fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer())
) -> fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()).
compose(Border_w, Inner_area, Content_w) ->
fun(Buf, Area) -> _pipe = Buf,
_pipe@1 = Border_w(_pipe, Area),
Content_w(_pipe@1, Inner_area) end.
-file("src/etui/widget.gleam", 166).
-spec fold_widgets(
etui@buffer:buffer(),
etui@geometry:rect(),
list(fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()))
) -> etui@buffer:buffer().
fold_widgets(Buf, Area, Widgets) ->
case Widgets of
[] ->
Buf;
[W | Rest] ->
fold_widgets(W(Buf, Area), Area, Rest)
end.
-file("src/etui/widget.gleam", 162).
?DOC(" Apply a list of widgets to the same area in order (each draws on top of the previous).\n").
-spec stack(
list(fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()))
) -> fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()).
stack(Widgets) ->
fun(Buf, Area) -> fold_widgets(Buf, Area, Widgets) end.
-file("src/etui/widget.gleam", 181).
?DOC(" A widget that renders nothing. Useful as a default or placeholder.\n").
-spec empty() -> fun((etui@buffer:buffer(), etui@geometry:rect()) -> etui@buffer:buffer()).
empty() ->
fun(Buf, _) -> Buf end.