diff --git a/src/gd_v_devman.erl b/src/gd_v_devman.erl index 731a7a2..310458f 100644 --- a/src/gd_v_devman.erl +++ b/src/gd_v_devman.erl @@ -332,32 +332,32 @@ clicked3(State = #s{frame = Frame, j = J}, Contract, Name = {FunName, FunType}, FunSpec = maps:get(FunName, FunSpecs), tell("FunName: ~tp", [FunName]), tell("FunSpec: ~tp", [FunSpec]), - tell("Contract: ~tp", [Contract]), - Label = + CallType = case FunType of call -> J("Contract Call"); dryr -> J("Dry Run") end, + Label = [CallType, ": ", ConName, ".", FunName, "/", integer_to_list(length(element(1, FunSpec)))], Dialog = wxDialog:new(Frame, ?wxID_ANY, Label), Sizer = wxBoxSizer:new(?wxVERTICAL), KeySz = wxStaticBoxSizer:new(?wxVERTICAL, Dialog, [{label, J("Signature Key")}]), KeyPicker = wxChoice:new(Dialog, ?wxID_ANY, [{choices, Keys}]), _ = wxStaticBoxSizer:add(KeySz, KeyPicker, zxw:flags(wide)), 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), ButtSz = wxBoxSizer:new(?wxHORIZONTAL), Affirm = wxButton:new(Dialog, ?wxID_OK), Cancel = wxButton:new(Dialog, ?wxID_CANCEL), - _ = wxBoxSizer:add(ButtSz, Affirm, zxw:flags(wide)), - _ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags(wide)), - _ = wxSizer:add(Sizer, KeySz, zxw:flags(wide)), - _ = wxSizer:add(Sizer, ArgSz, zxw:flags(wide)), - _ = wxSizer:add(Sizer, ParamSz, zxw:flags(wide)), - _ = wxSizer:add(Sizer, ButtSz, zxw:flags(wide)), + _ = wxBoxSizer:add(ButtSz, Affirm, zxw:flags({wide, 5})), + _ = wxBoxSizer:add(ButtSz, Cancel, zxw:flags({wide, 5})), + _ = wxSizer:add(Sizer, KeySz, zxw:flags({base, 5})), + _ = wxSizer:add(Sizer, ArgSz, zxw:flags({wide, 5})), + _ = wxSizer:add(Sizer, ParamSz, zxw:flags({base, 5})), + _ = wxSizer:add(Sizer, ButtSz, zxw:flags({base, 5})), ok = wxDialog:setSizer(Dialog, Sizer), ok = wxBoxSizer:layout(Sizer), - ok = wxDialog:setSize(Dialog, {500, 300}), + ok = wxDialog:setSize(Dialog, Dimensions), ok = wxDialog:center(Dialog), Outcome = 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)), PK = unicode:characters_to_binary(ID), Controls = - [{"TTL", TTL_Tx}, - {"Gas Price", GasP_Tx}, - {"Gas", Gas_Tx}, - {"Amount", Amount_Tx}], + [{{"TTL", integer}, TTL_Tx}, + {{"Gas Price", integer}, GasP_Tx}, + {{"Gas", integer}, Gas_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 {ok, [TTL, GasP, Gas, Amount]} -> {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 end; @@ -386,7 +391,59 @@ clicked3(State = #s{frame = Frame, j = J}, Contract, Name = {FunName, FunType}, Error -> handle_troubling(State, Error) 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) -> {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_Tx = wxTextCtrl:new(Dialog, ?wxID_ANY), ok = wxTextCtrl:setValue(Amount_Tx, integer_to_list(DefAmount)), - _ = wxFlexGridSizer:add(GridSz, TTL_L, zxw:flags(base)), - _ = wxFlexGridSizer:add(GridSz, TTL_Tx, zxw:flags(wide)), - _ = wxFlexGridSizer:add(GridSz, GasP_L, zxw:flags(base)), - _ = wxFlexGridSizer:add(GridSz, GasP_Tx, zxw:flags(wide)), - _ = wxFlexGridSizer:add(GridSz, Gas_L, zxw:flags(base)), - _ = wxFlexGridSizer:add(GridSz, Gas_Tx, zxw:flags(wide)), - _ = wxFlexGridSizer:add(GridSz, Amount_L, zxw:flags(base)), - _ = wxFlexGridSizer:add(GridSz, Amount_Tx, zxw:flags(wide)), + _ = wxFlexGridSizer:add(GridSz, TTL_L, zxw:flags({base, 5})), + _ = wxFlexGridSizer:add(GridSz, TTL_Tx, zxw:flags({wide, 5})), + _ = wxFlexGridSizer:add(GridSz, GasP_L, zxw:flags({base, 5})), + _ = wxFlexGridSizer:add(GridSz, GasP_Tx, zxw:flags({wide, 5})), + _ = wxFlexGridSizer:add(GridSz, Gas_L, zxw:flags({base, 5})), + _ = wxFlexGridSizer:add(GridSz, Gas_Tx, zxw:flags({wide, 5})), + _ = wxFlexGridSizer:add(GridSz, Amount_L, zxw:flags({base, 5})), + _ = wxFlexGridSizer:add(GridSz, Amount_Tx, zxw:flags({wide, 5})), _ = wxSizer:add(ParamSz, GridSz, zxw:flags(wide)), {ParamSz, TTL_Tx, GasP_Tx, Gas_Tx, Amount_Tx}.