-module(etui@widgets@spinner). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/etui/widgets/spinner.gleam"). -export([spinner_new/0, with_style/2, with_label/2, with_colors/3, with_render_style/2, render/4]). -export_type([spinner_style/0, spinner/0]). -type spinner_style() :: dots | line | circle | bounce | mini_dot | jump | pulse | points | globe | moon | monkey | meter | hamburger | ellipsis | {custom, list(binary())}. -type spinner() :: {spinner, spinner_style(), binary(), etui@style:color(), etui@style:color()}. -file("src/etui/widgets/spinner.gleam", 35). -spec spinner_new() -> spinner(). spinner_new() -> {spinner, dots, <<""/utf8>>, default, default}. -file("src/etui/widgets/spinner.gleam", 39). -spec with_style(spinner(), spinner_style()) -> spinner(). with_style(S, Spinner_style) -> {spinner, Spinner_style, erlang:element(3, S), erlang:element(4, S), erlang:element(5, S)}. -file("src/etui/widgets/spinner.gleam", 43). -spec with_label(spinner(), binary()) -> spinner(). with_label(S, Label) -> {spinner, erlang:element(2, S), Label, erlang:element(4, S), erlang:element(5, S)}. -file("src/etui/widgets/spinner.gleam", 47). -spec with_colors(spinner(), etui@style:color(), etui@style:color()) -> spinner(). with_colors(S, Fg, Bg) -> {spinner, erlang:element(2, S), erlang:element(3, S), Fg, Bg}. -file("src/etui/widgets/spinner.gleam", 51). -spec with_render_style(spinner(), etui@style:style()) -> spinner(). with_render_style(S, St) -> {spinner, erlang:element(2, S), erlang:element(3, S), erlang:element(2, St), erlang:element(3, St)}. -file("src/etui/widgets/spinner.gleam", 152). -spec do_nth(list(binary()), integer()) -> binary(). do_nth(Items, N) -> case Items of [] -> <<"?"/utf8>>; [H | _] when N =< 0 -> H; [_ | Rest] -> do_nth(Rest, N - 1) end. -file("src/etui/widgets/spinner.gleam", 148). -spec nth_frame(list(binary()), integer()) -> binary(). nth_frame(Frames, Idx) -> do_nth(Frames, Idx). -file("src/etui/widgets/spinner.gleam", 83). -spec spin_char(spinner_style(), integer()) -> binary(). spin_char(Spinner_style, Frame) -> case Spinner_style of dots -> Frames = [<<"⠋"/utf8>>, <<"⠙"/utf8>>, <<"⠹"/utf8>>, <<"⠸"/utf8>>, <<"⠼"/utf8>>, <<"⠴"/utf8>>, <<"⠦"/utf8>>, <<"⠧"/utf8>>, <<"⠇"/utf8>>, <<"⠏"/utf8>>], nth_frame(Frames, etui@anim:cycle(Frame, 10)); line -> Frames@1 = [<<"-"/utf8>>, <<"\\"/utf8>>, <<"|"/utf8>>, <<"/"/utf8>>], nth_frame(Frames@1, etui@anim:cycle(Frame, 4)); circle -> Frames@2 = [<<"◐"/utf8>>, <<"◓"/utf8>>, <<"◑"/utf8>>, <<"◒"/utf8>>], nth_frame(Frames@2, etui@anim:cycle(Frame, 4)); bounce -> Frames@3 = [<<"⠁"/utf8>>, <<"⠂"/utf8>>, <<"⠄"/utf8>>, <<"⠂"/utf8>>], nth_frame(Frames@3, etui@anim:cycle(Frame, 4)); mini_dot -> Frames@4 = [<<"⠂"/utf8>>, <<"⠁"/utf8>>, <<"⠈"/utf8>>, <<"⠐"/utf8>>, <<"⠠"/utf8>>, <<"⢀"/utf8>>, <<"⡀"/utf8>>, <<"⠄"/utf8>>], nth_frame(Frames@4, etui@anim:cycle(Frame, 8)); jump -> Frames@5 = [<<"▀"/utf8>>, <<"▄"/utf8>>], nth_frame(Frames@5, etui@anim:cycle(Frame, 2)); pulse -> Frames@6 = [<<"█"/utf8>>, <<"▓"/utf8>>, <<"▒"/utf8>>, <<"░"/utf8>>, <<"▒"/utf8>>, <<"▓"/utf8>>], nth_frame(Frames@6, etui@anim:cycle(Frame, 6)); points -> Frames@7 = [<<"∙∙∙"/utf8>>, <<"●∙∙"/utf8>>, <<"∙●∙"/utf8>>, <<"∙∙●"/utf8>>], nth_frame(Frames@7, etui@anim:cycle(Frame, 4)); globe -> Frames@8 = [<<"🌍"/utf8>>, <<"🌎"/utf8>>, <<"🌏"/utf8>>], nth_frame(Frames@8, etui@anim:cycle(Frame, 3)); moon -> Frames@9 = [<<"🌑"/utf8>>, <<"🌒"/utf8>>, <<"🌓"/utf8>>, <<"🌔"/utf8>>, <<"🌕"/utf8>>, <<"🌖"/utf8>>, <<"🌗"/utf8>>, <<"🌘"/utf8>>], nth_frame(Frames@9, etui@anim:cycle(Frame, 8)); monkey -> Frames@10 = [<<"🙈"/utf8>>, <<"🙉"/utf8>>, <<"🙊"/utf8>>], nth_frame(Frames@10, etui@anim:cycle(Frame, 3)); meter -> Frames@11 = [<<"▱▱▱"/utf8>>, <<"▰▱▱"/utf8>>, <<"▰▰▱"/utf8>>, <<"▰▰▰"/utf8>>, <<"▰▰▱"/utf8>>, <<"▰▱▱"/utf8>>], nth_frame(Frames@11, etui@anim:cycle(Frame, 6)); hamburger -> Frames@12 = [<<"☱"/utf8>>, <<"☲"/utf8>>, <<"☴"/utf8>>, <<"☲"/utf8>>], nth_frame(Frames@12, etui@anim:cycle(Frame, 4)); ellipsis -> Frames@13 = [<<" "/utf8>>, <<". "/utf8>>, <<".. "/utf8>>, <<"..."/utf8>>], nth_frame(Frames@13, etui@anim:cycle(Frame, 4)); {custom, Frames@14} -> Count = erlang:length(Frames@14), nth_frame(Frames@14, etui@anim:cycle(Frame, Count)) end. -file("src/etui/widgets/spinner.gleam", 61). -spec render(etui@buffer:buffer(), etui@geometry:rect(), spinner(), integer()) -> etui@buffer:buffer(). render(Buf, Area, S, Frame) -> case (erlang:element(2, erlang:element(3, Area)) =< 0) orelse (erlang:element( 3, erlang:element(3, Area) ) =< 0) of true -> Buf; false -> Char = spin_char(erlang:element(2, S), Frame), Line = case erlang:element(3, S) of <<""/utf8>> -> Char; Label -> <<<>/binary, Label/binary>> end, etui@buffer:set_string( Buf, erlang:element(2, Area), Line, erlang:element(4, S), erlang:element(5, S), etui@style:none() ) end.