-module(etui@widgets@dialog). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/etui/widgets/dialog.gleam"). -export([dialog_new/1, state_new/0, with_labels/3, with_size/3, with_colors/3, with_style/2, with_focused_style/2, with_border/2, toggle/1, focus_confirm/1, focus_cancel/1, cancel/1, is_confirmed/1, render/4]). -export_type([dialog/0, dialog_button/0, dialog_state/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 dialog() :: {dialog, binary(), binary(), binary(), integer(), integer(), etui@style:color(), etui@style:color(), etui@style:style(), etui@style:style(), etui@style:style(), etui@widgets@block:border()}. -type dialog_button() :: confirm | cancel. -type dialog_state() :: {dialog_state, dialog_button()}. -file("src/etui/widgets/dialog.gleam", 68). ?DOC(" Dialog with default labels (\"OK\" / \"Cancel\") and a rounded border.\n"). -spec dialog_new(binary()) -> dialog(). dialog_new(Message) -> {dialog, Message, <<" OK "/utf8>>, <<" Cancel "/utf8>>, 0, 0, default, default, {style, default, default, etui@style:none()}, {style, default, default, etui@style:none()}, {style, default, default, etui@style:reverse()}, rounded}. -file("src/etui/widgets/dialog.gleam", 96). -spec state_new() -> dialog_state(). state_new() -> {dialog_state, confirm}. -file("src/etui/widgets/dialog.gleam", 103). -spec with_labels(dialog(), binary(), binary()) -> dialog(). with_labels(D, Confirm, Cancel) -> {dialog, erlang:element(2, D), Confirm, Cancel, erlang:element(5, D), erlang:element(6, D), erlang:element(7, D), erlang:element(8, D), erlang:element(9, D), erlang:element(10, D), erlang:element(11, D), erlang:element(12, D)}. -file("src/etui/widgets/dialog.gleam", 107). -spec with_size(dialog(), integer(), integer()) -> dialog(). with_size(D, Width, Height) -> {dialog, erlang:element(2, D), erlang:element(3, D), erlang:element(4, D), Width, Height, erlang:element(7, D), erlang:element(8, D), erlang:element(9, D), erlang:element(10, D), erlang:element(11, D), erlang:element(12, D)}. -file("src/etui/widgets/dialog.gleam", 111). -spec with_colors(dialog(), etui@style:color(), etui@style:color()) -> dialog(). with_colors(D, Fg, Bg) -> {dialog, erlang:element(2, D), erlang:element(3, D), erlang:element(4, D), erlang:element(5, D), erlang:element(6, D), Fg, Bg, erlang:element(9, D), erlang:element(10, D), erlang:element(11, D), erlang:element(12, D)}. -file("src/etui/widgets/dialog.gleam", 115). -spec with_style(dialog(), etui@style:style()) -> dialog(). with_style(D, S) -> {dialog, erlang:element(2, D), erlang:element(3, D), erlang:element(4, D), erlang:element(5, D), erlang:element(6, D), erlang:element(2, S), erlang:element(3, S), erlang:element(9, D), erlang:element(10, D), erlang:element(11, D), erlang:element(12, D)}. -file("src/etui/widgets/dialog.gleam", 119). -spec with_focused_style(dialog(), etui@style:style()) -> dialog(). with_focused_style(D, S) -> {dialog, erlang:element(2, D), erlang:element(3, D), erlang:element(4, D), erlang:element(5, D), erlang:element(6, D), erlang:element(7, D), erlang:element(8, D), erlang:element(9, D), erlang:element(10, D), S, erlang:element(12, D)}. -file("src/etui/widgets/dialog.gleam", 123). -spec with_border(dialog(), etui@widgets@block:border()) -> dialog(). with_border(D, B) -> {dialog, erlang:element(2, D), erlang:element(3, D), erlang:element(4, D), erlang:element(5, D), erlang:element(6, D), erlang:element(7, D), erlang:element(8, D), erlang:element(9, D), erlang:element(10, D), erlang:element(11, D), B}. -file("src/etui/widgets/dialog.gleam", 131). ?DOC(" Toggle focus between Confirm and Cancel.\n"). -spec toggle(dialog_state()) -> dialog_state(). toggle(State) -> case erlang:element(2, State) of confirm -> {dialog_state, cancel}; cancel -> {dialog_state, confirm} end. -file("src/etui/widgets/dialog.gleam", 139). ?DOC(" Focus the Confirm button.\n"). -spec focus_confirm(dialog_state()) -> dialog_state(). focus_confirm(_) -> {dialog_state, confirm}. -file("src/etui/widgets/dialog.gleam", 144). ?DOC(" Focus the Cancel button.\n"). -spec focus_cancel(dialog_state()) -> dialog_state(). focus_cancel(_) -> {dialog_state, cancel}. -file("src/etui/widgets/dialog.gleam", 149). ?DOC(" Convenience: focus Cancel (same as pressing Escape conceptually).\n"). -spec cancel(dialog_state()) -> dialog_state(). cancel(_) -> {dialog_state, cancel}. -file("src/etui/widgets/dialog.gleam", 154). ?DOC(" `True` if the Confirm button is focused.\n"). -spec is_confirmed(dialog_state()) -> boolean(). is_confirmed(State) -> erlang:element(2, State) =:= confirm. -file("src/etui/widgets/dialog.gleam", 235). -spec render_buttons( etui@buffer:buffer(), etui@geometry:rect(), dialog(), dialog_state(), integer() ) -> etui@buffer:buffer(). render_buttons(Buf, Inner, D, State, Btn_y) -> Conf_w = etui@text:cell_width(erlang:element(3, D)), Canc_w = etui@text:cell_width(erlang:element(4, D)), Total_btn_w = (Conf_w + 1) + Canc_w, Btn_x = erlang:element(2, erlang:element(2, Inner)) + ((erlang:element( 2, erlang:element(3, Inner) ) - Total_btn_w) div 2), {Conf_st, Canc_st} = case erlang:element(2, State) of confirm -> {erlang:element(11, D), erlang:element(10, D)}; cancel -> {erlang:element(9, D), erlang:element(11, D)} end, Buf1 = etui@buffer:set_string( Buf, {position, Btn_x, Btn_y}, erlang:element(3, D), erlang:element(2, Conf_st), erlang:element(3, Conf_st), erlang:element(4, Conf_st) ), Buf2 = etui@buffer:set_string( Buf1, {position, (Btn_x + Conf_w) + 1, Btn_y}, erlang:element(4, D), erlang:element(2, Canc_st), erlang:element(3, Canc_st), erlang:element(4, Canc_st) ), Buf2. -file("src/etui/widgets/dialog.gleam", 162). ?DOC(" Render the dialog centered within `area`.\n"). -spec render( etui@buffer:buffer(), etui@geometry:rect(), dialog(), dialog_state() ) -> etui@buffer:buffer(). render(Buf, Area, D, State) -> Msg_w = etui@text:cell_width(erlang:element(2, D)), Btn_w = (etui@text:cell_width(erlang:element(3, D)) + etui@text:cell_width( erlang:element(4, D) )) + 3, Content_w = case Msg_w > Btn_w of true -> Msg_w; false -> Btn_w end, Box_w = case erlang:element(5, D) > 0 of true -> erlang:element(5, D); false -> Content_w + 4 end, Box_h = case erlang:element(6, D) > 0 of true -> erlang:element(6, D); false -> 6 end, Box_w@1 = case Box_w < 20 of true -> 20; false -> Box_w end, Box_w@2 = case Box_w@1 > erlang:element(2, erlang:element(3, Area)) of true -> erlang:element(2, erlang:element(3, Area)); false -> Box_w@1 end, Box_h@1 = case Box_h > erlang:element(3, erlang:element(3, Area)) of true -> erlang:element(3, erlang:element(3, Area)); false -> Box_h end, X = erlang:element(2, erlang:element(2, Area)) + ((erlang:element( 2, erlang:element(3, Area) ) - Box_w@2) div 2), Y = erlang:element(3, erlang:element(2, Area)) + ((erlang:element( 3, erlang:element(3, Area) ) - Box_h@1) div 2), Box_area = {rect, {position, X, Y}, {size, Box_w@2, Box_h@1}}, Blk = begin _pipe = etui@widgets@block:block_new(), _pipe@1 = etui@widgets@block:with_border(_pipe, erlang:element(12, D)), _pipe@2 = etui@widgets@block:with_style( _pipe@1, erlang:element(7, D), erlang:element(8, D) ), etui@widgets@block:with_bg_fill(_pipe@2) end, Buf1 = etui@widgets@block:render(Buf, Box_area, Blk), Inner = etui@widgets@block:inner(Box_area, Blk), Msg_x = erlang:element(2, erlang:element(2, Inner)) + ((erlang:element( 2, erlang:element(3, Inner) ) - etui@text:cell_width(erlang:element(2, D))) div 2), Msg_y = erlang:element(3, erlang:element(2, Inner)) + ((erlang:element( 3, erlang:element(3, Inner) ) - 3) div 2), Buf2 = case (Msg_y >= erlang:element(3, erlang:element(2, Inner))) andalso (erlang:element( 3, erlang:element(3, Inner) ) > 0) of false -> Buf1; true -> etui@buffer:set_string( Buf1, {position, Msg_x, Msg_y}, etui@text:truncate( erlang:element(2, D), erlang:element(2, erlang:element(3, Inner)), <<"…"/utf8>> ), erlang:element(7, D), erlang:element(8, D), etui@style:none() ) end, Btn_y = (erlang:element(3, erlang:element(2, Inner)) + erlang:element( 3, erlang:element(3, Inner) )) - 1, case (Btn_y >= erlang:element(3, erlang:element(2, Inner))) andalso (erlang:element( 3, erlang:element(3, Inner) ) >= 3) of false -> Buf2; true -> render_buttons(Buf2, Inner, D, State, Btn_y) end.