This commit is contained in:
Craig Everett 2026-01-06 19:49:10 +09:00
parent 66f5795c49
commit f9cb72598f

View File

@ -332,32 +332,32 @@ clicked3(State = #s{frame = Frame, j = J}, Contract, Name = {FunName, FunType},
FunSpec = maps:get(FunName, FunSpecs), FunSpec = maps:get(FunName, FunSpecs),
tell("FunName: ~tp", [FunName]), tell("FunName: ~tp", [FunName]),
tell("FunSpec: ~tp", [FunSpec]), tell("FunSpec: ~tp", [FunSpec]),
tell("Contract: ~tp", [Contract]), CallType =
Label =
case FunType of case FunType of
call -> J("Contract Call"); call -> J("Contract Call");
dryr -> J("Dry Run") dryr -> J("Dry Run")
end, end,
Label = [CallType, ": ", ConName, ".", FunName, "/", integer_to_list(length(element(1, FunSpec)))],
Dialog = wxDialog:new(Frame, ?wxID_ANY, Label), Dialog = wxDialog:new(Frame, ?wxID_ANY, Label),
Sizer = wxBoxSizer:new(?wxVERTICAL), Sizer = wxBoxSizer:new(?wxVERTICAL),
KeySz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Signature Key")}]), KeySz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Signature Key")}]),
KeyPicker = wxChoice:new(Dialog, ?wxID_ANY, [{choices, Keys}]), KeyPicker = wxChoice:new(Dialog, ?wxID_ANY, [{choices, Keys}]),
_ = wxStaticBoxSizer:add(KeySz, KeyPicker, zxw:flags(wide)), _ = wxStaticBoxSizer:add(KeySz, KeyPicker, zxw:flags(wide)),
ok = wxChoice:setSelection(KeyPicker, Selected - 1), ok = wxChoice:setSelection(KeyPicker, Selected - 1),
ArgSz = call_arg_sizer(Dialog, J, FunSpec), {ArgSz, ArgControls, Dimensions} = call_arg_sizer(Dialog, J, FunSpec),
{ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx} = call_param_sizer(Dialog, J), {ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx} = call_param_sizer(Dialog, J),
ButtSz = wxBoxSizer:new(?wxHORIZONTAL), ButtSz = wxBoxSizer:new(?wxHORIZONTAL),
Affirm = wxButton:new(Dialog, ?wxID_OK), Affirm = wxButton:new(Dialog, ?wxID_OK),
Cancel = wxButton:new(Dialog, ?wxID_CANCEL), Cancel = wxButton:new(Dialog, ?wxID_CANCEL),
_ = wxBoxSizer:add(ButtSz, Affirm, zxw:flags(wide)), _ = wxBoxSizer:add(ButtSz, Affirm, zxw:flags({wide, 5})),
_ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags(wide)), _ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags({wide, 5})),
_ = wxSizer:add(Sizer, KeySz, zxw:flags(wide)), _ = wxSizer:add(Sizer, KeySz, zxw:flags({base, 5})),
_ = wxSizer:add(Sizer, ArgSz, zxw:flags(wide)), _ = wxSizer:add(Sizer, ArgSz, zxw:flags({wide, 5})),
_ = wxSizer:add(Sizer, ParamSz, zxw:flags(wide)), _ = wxSizer:add(Sizer, ParamSz, zxw:flags({base, 5})),
_ = wxSizer:add(Sizer, ButtSz, zxw:flags(wide)), _ = wxSizer:add(Sizer, ButtSz, zxw:flags({base, 5})),
ok = wxDialog:setSizer(Dialog, Sizer), ok = wxDialog:setSizer(Dialog, Sizer),
ok = wxBoxSizer:layout(Sizer), ok = wxBoxSizer:layout(Sizer),
ok = wxDialog:setSize(Dialog, {500, 300}), ok = wxDialog:setSize(Dialog, Dimensions),
ok = wxDialog:center(Dialog), ok = wxDialog:center(Dialog),
Outcome = Outcome =
case wxDialog:showModal(Dialog) of case wxDialog:showModal(Dialog) of
@ -365,14 +365,19 @@ clicked3(State = #s{frame = Frame, j = J}, Contract, Name = {FunName, FunType},
ID = wxChoice:getString(KeyPicker, wxChoice:getSelection(KeyPicker)), ID = wxChoice:getString(KeyPicker, wxChoice:getSelection(KeyPicker)),
PK = unicode:characters_to_binary(ID), PK = unicode:characters_to_binary(ID),
Controls = Controls =
[{"TTL", TTL_Tx}, [{{"TTL", integer}, TTL_Tx},
{"Gas Price", GasP_Tx}, {{"Gas Price", integer}, GasP_Tx},
{"Gas", Gas_Tx}, {{"Gas", integer}, Gas_Tx},
{"Amount", Amount_Tx}], {{"Amount", integer}, Amount_Tx}],
% TODO: Unify args from the call params and fun args
% Try to give type feedback, probably based on whether Sophia or Erlang terms are chosen
case call_params(Controls) of case call_params(Controls) of
{ok, [TTL, GasP, Gas, Amount]} -> {ok, [TTL, GasP, Gas, Amount]} ->
{ok, Nonce} = hz:next_nonce(PK), {ok, Nonce} = hz:next_nonce(PK),
{ok, {PK, Nonce, TTL, GasP, Gas, Amount}}; case extract_args(ArgControls) of
{ok, Args} -> {ok, {PK, Nonce, TTL, GasP, Gas, Amount}, Args};
E -> E
end;
E -> E ->
E E
end; end;
@ -386,7 +391,59 @@ clicked3(State = #s{frame = Frame, j = J}, Contract, Name = {FunName, FunType},
Error -> handle_troubling(State, Error) Error -> handle_troubling(State, Error)
end. end.
call_arg_sizer(Dialog, J, FunSpec) -> extract_args({Name, Control}, {OK, Errors}) ->
extract_args(Controls) ->
extract_args(Controls, []).
extract_args([H | T], A) ->
case wxTextCtrl:getValue(H) of
"" -> {
call_arg_sizer(Dialog, J, {CallArgs, ReturnType}) ->
SpecSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Function Spec")}]),
{CallSz, CallControls, Dimensions} = call_sizer(Dialog, J, CallArgs),
ReturnSz = return_sizer(Dialog, J, ReturnType),
_ = wxStaticBoxSizer:add(SpecSz, CallSz, zxw:flags({wide, 5})),
_ = wxStaticBoxSizer:add(SpecSz, ReturnSz, zxw:flags({base, 5})),
{SpecSz, CallControls, Dimensions}.
call_sizer(Dialog, J, []) ->
CallSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Call Args")}]),
Args = wxStaticText:new(Dialog, ?wxID_ANY, ["[", J("No Args"), "]"]),
_ = wxStaticBoxSizer:add(CallSz, Args, zxw:flags({wide, 5})),
{CallSz, [], {500, 500}};
call_sizer(Dialog, J, CallArgs) ->
CallSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Call Args")}]),
GridSz = wxFlexGridSizer:new(2, [{gap, {4, 4}}]),
ok = wxFlexGridSizer:setFlexibleDirection(GridSz, ?wxHORIZONTAL),
ok = wxFlexGridSizer:addGrowableCol(GridSz, 1),
AddArg =
fun(Arg = {Name, Type}) ->
L = wxStaticText:new(Dialog, ?wxID_ANY, [Name, " : ", textify(Type)]),
C = wxTextCtrl:new(Dialog, ?wxID_ANY),
_ = wxFlexGridSizer:add(GridSz, L, zxw:flags({base, 5})),
_ = wxFlexGridSizer:add(GridSz, C, zxw:flags({wide, 5})),
{Arg, C}
end,
_ = wxStaticBoxSizer:add(CallSz, GridSz, zxw:flags(wide)),
Controls = lists:map(AddArg, CallArgs),
{CallSz, Controls, {600, 700}}.
return_sizer(Dialog, J, ReturnType) ->
ReturnSz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Return Type")}]),
Return = wxStaticText:new(Dialog, ?wxID_ANY, textify(ReturnType)),
_ = wxStaticBoxSizer:add(ReturnSz, Return, zxw:flags({wide, 5})),
ReturnSz.
textify({integer, _, _}) -> "int";
textify({boolean, _, _}) -> "bool";
textify({{bytes, [I]}, _, _}) -> io_lib:format("bytes(~w)", [I]);
textify({{bytes, any}, _, _}) -> "bytes()";
textify({T, _, _}) when is_atom(T) -> atom_to_list(T);
textify({T, _, _}) when is_list(T) -> T;
textify({T, _, _}) -> io_lib:format("~tp", [T]).
call_param_sizer(Dialog, J) -> call_param_sizer(Dialog, J) ->
{ok, Height} = hz:top_height(), {ok, Height} = hz:top_height(),
@ -410,14 +467,14 @@ call_param_sizer(Dialog, J) ->
Amount_L = wxStaticText:new(Dialog, ?wxID_ANY, J("TX Amount")), Amount_L = wxStaticText:new(Dialog, ?wxID_ANY, J("TX Amount")),
Amount_Tx = wxTextCtrl:new(Dialog, ?wxID_ANY), Amount_Tx = wxTextCtrl:new(Dialog, ?wxID_ANY),
ok = wxTextCtrl:setValue(Amount_Tx, integer_to_list(DefAmount)), ok = wxTextCtrl:setValue(Amount_Tx, integer_to_list(DefAmount)),
_ = wxFlexGridSizer:add(GridSz, TTL_L, zxw:flags(base)), _ = wxFlexGridSizer:add(GridSz, TTL_L, zxw:flags({base, 5})),
_ = wxFlexGridSizer:add(GridSz, TTL_Tx, zxw:flags(wide)), _ = wxFlexGridSizer:add(GridSz, TTL_Tx, zxw:flags({wide, 5})),
_ = wxFlexGridSizer:add(GridSz, GasP_L, zxw:flags(base)), _ = wxFlexGridSizer:add(GridSz, GasP_L, zxw:flags({base, 5})),
_ = wxFlexGridSizer:add(GridSz, GasP_Tx, zxw:flags(wide)), _ = wxFlexGridSizer:add(GridSz, GasP_Tx, zxw:flags({wide, 5})),
_ = wxFlexGridSizer:add(GridSz, Gas_L, zxw:flags(base)), _ = wxFlexGridSizer:add(GridSz, Gas_L, zxw:flags({base, 5})),
_ = wxFlexGridSizer:add(GridSz, Gas_Tx, zxw:flags(wide)), _ = wxFlexGridSizer:add(GridSz, Gas_Tx, zxw:flags({wide, 5})),
_ = wxFlexGridSizer:add(GridSz, Amount_L, zxw:flags(base)), _ = wxFlexGridSizer:add(GridSz, Amount_L, zxw:flags({base, 5})),
_ = wxFlexGridSizer:add(GridSz, Amount_Tx, zxw:flags(wide)), _ = wxFlexGridSizer:add(GridSz, Amount_Tx, zxw:flags({wide, 5})),
_ = wxSizer:add(ParamSz, GridSz, zxw:flags(wide)), _ = wxSizer:add(ParamSz, GridSz, zxw:flags(wide)),
{ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx}. {ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx}.