-module(etui@widgets@popup).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/etui/widgets/popup.gleam").
-export([popup_new/2, with_title/2, with_border/2, with_style/3, with_colors/3, popup_rect/2, popup_area/2, render/3]).
-export_type([popup/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 popup() :: {popup,
integer(),
integer(),
binary(),
etui@widgets@block:border(),
etui@style:color(),
etui@style:color()}.
-file("src/etui/widgets/popup.gleam", 37).
?DOC(" New popup with given cell dimensions. Default: Rounded border, default colors.\n").
-spec popup_new(integer(), integer()) -> popup().
popup_new(Width, Height) ->
{popup, Width, Height, <<""/utf8>>, rounded, default, default}.
-file("src/etui/widgets/popup.gleam", 49).
?DOC(" Set the popup title (shown on top border).\n").
-spec with_title(popup(), binary()) -> popup().
with_title(P, Title) ->
{popup,
erlang:element(2, P),
erlang:element(3, P),
Title,
erlang:element(5, P),
erlang:element(6, P),
erlang:element(7, P)}.
-file("src/etui/widgets/popup.gleam", 54).
?DOC(" Set the border style.\n").
-spec with_border(popup(), etui@widgets@block:border()) -> popup().
with_border(P, Border) ->
{popup,
erlang:element(2, P),
erlang:element(3, P),
erlang:element(4, P),
Border,
erlang:element(6, P),
erlang:element(7, P)}.
-file("src/etui/widgets/popup.gleam", 59).
?DOC(" Set foreground and background colors.\n").
-spec with_style(popup(), etui@style:color(), etui@style:color()) -> popup().
with_style(P, Fg, Bg) ->
{popup,
erlang:element(2, P),
erlang:element(3, P),
erlang:element(4, P),
erlang:element(5, P),
Fg,
Bg}.
-file("src/etui/widgets/popup.gleam", 63).
-spec with_colors(popup(), etui@style:color(), etui@style:color()) -> popup().
with_colors(P, Fg, Bg) ->
{popup,
erlang:element(2, P),
erlang:element(3, P),
erlang:element(4, P),
erlang:element(5, P),
Fg,
Bg}.
-file("src/etui/widgets/popup.gleam", 114).
-spec int_clamp(integer(), integer(), integer()) -> integer().
int_clamp(V, Lo, Hi) ->
case V < Lo of
true ->
Lo;
false ->
case V > Hi of
true ->
Hi;
false ->
V
end
end.
-file("src/etui/widgets/popup.gleam", 71).
?DOC(" Centered rect for this popup within `screen`.\n").
-spec popup_rect(etui@geometry:rect(), popup()) -> etui@geometry:rect().
popup_rect(Screen, P) ->
W = int_clamp(
erlang:element(2, P),
0,
erlang:element(2, erlang:element(3, Screen))
),
H = int_clamp(
erlang:element(3, P),
0,
erlang:element(3, erlang:element(3, Screen))
),
X = erlang:element(2, erlang:element(2, Screen)) + ((erlang:element(
2,
erlang:element(3, Screen)
)
- W)
div 2),
Y = erlang:element(3, erlang:element(2, Screen)) + ((erlang:element(
3,
erlang:element(3, Screen)
)
- H)
div 2),
{rect, {position, X, Y}, {size, W, H}}.
-file("src/etui/widgets/popup.gleam", 106).
-spec to_block(popup()) -> etui@widgets@block:block().
to_block(P) ->
_pipe = etui@widgets@block:block_new(),
_pipe@1 = etui@widgets@block:with_border(_pipe, erlang:element(5, P)),
_pipe@2 = etui@widgets@block:with_title(_pipe@1, erlang:element(4, P), top),
_pipe@3 = etui@widgets@block:with_style(
_pipe@2,
erlang:element(6, P),
erlang:element(7, P)
),
etui@widgets@block:with_bg_fill(_pipe@3).
-file("src/etui/widgets/popup.gleam", 83).
?DOC(" Inner content area (inside border and padding) for child widgets.\n").
-spec popup_area(etui@geometry:rect(), popup()) -> etui@geometry:rect().
popup_area(Screen, P) ->
Outer = popup_rect(Screen, P),
Blk = to_block(P),
etui@widgets@block:inner(Outer, Blk).
-file("src/etui/widgets/popup.gleam", 93).
?DOC(" Render popup overlay. Draw child widgets into `popup_area` after this.\n").
-spec render(etui@buffer:buffer(), etui@geometry:rect(), popup()) -> etui@buffer:buffer().
render(Buf, Screen, P) ->
Outer = popup_rect(Screen, P),
Blk = to_block(P),
etui@widgets@block:render(Buf, Outer, Blk).