args (#10)
More complete types. Reviewed-on: #10 Co-authored-by: Craig Everett <zxq9@zxq9.com> Co-committed-by: Craig Everett <zxq9@zxq9.com>
This commit is contained in:
parent
2bef1fd323
commit
cbc823aba1
@ -486,11 +486,15 @@ code_change(_, State, _) ->
|
|||||||
{ok, State}.
|
{ok, State}.
|
||||||
|
|
||||||
|
|
||||||
terminate(normal, _) ->
|
terminate(Reason, _) ->
|
||||||
zx:stop();
|
ok = log(info, "Reason: ~p,", [Reason]),
|
||||||
terminate(Reason, State) ->
|
case whereis(gmc_con) of
|
||||||
ok = log(info, "Reason: ~tp, State: ~tp", [Reason, State]),
|
undefined ->
|
||||||
zx:stop().
|
zx:stop();
|
||||||
|
PID ->
|
||||||
|
ok = log(info, "gd_con found at: ~p", [PID]),
|
||||||
|
application:stop(gajumine)
|
||||||
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -882,7 +886,7 @@ do_recover_key(Mnemonic, State) ->
|
|||||||
|
|
||||||
do_recover_key2(Seed, State = #s{wallet = Current, wallets = Wallets, pass = Pass}) ->
|
do_recover_key2(Seed, State = #s{wallet = Current, wallets = Wallets, pass = Pass}) ->
|
||||||
#wallet{name = WalletName, keys = Keys, poas = POAs} = Current,
|
#wallet{name = WalletName, keys = Keys, poas = POAs} = Current,
|
||||||
Recovered = #key{id = ID, name = AccName} = hz_key_master:make_key("", Seed),
|
Recovered = #key{id = ID, name = AccName} = hz_key_master:make_key(Seed),
|
||||||
case lists:keymember(ID, #key.id, Keys) of
|
case lists:keymember(ID, #key.id, Keys) of
|
||||||
false ->
|
false ->
|
||||||
NewKeys = [Recovered | Keys],
|
NewKeys = [Recovered | Keys],
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
{wx = none :: none | wx:wx_object(),
|
{wx = none :: none | wx:wx_object(),
|
||||||
frame = none :: none | wx:wx_object(),
|
frame = none :: none | wx:wx_object(),
|
||||||
sizer = none :: none | wx:wx_object(),
|
sizer = none :: none | wx:wx_object(),
|
||||||
lang = en :: en | jp,
|
lang = en_US :: en_US | ja_JP,
|
||||||
j = none :: none | fun(),
|
j = none :: none | fun(),
|
||||||
prefs = #{} :: #{atom() := term()},
|
prefs = #{} :: #{atom() := term()},
|
||||||
accounts = [] :: [gajudesk:poa()],
|
accounts = [] :: [gajudesk:poa()],
|
||||||
@ -84,7 +84,7 @@ start_link(Accounts) ->
|
|||||||
|
|
||||||
init(Prefs) ->
|
init(Prefs) ->
|
||||||
ok = log(info, "GUI starting..."),
|
ok = log(info, "GUI starting..."),
|
||||||
Lang = maps:get(lang, Prefs, en_us),
|
Lang = maps:get(lang, Prefs, en_US),
|
||||||
Trans = gd_jt:read_translations(?MODULE),
|
Trans = gd_jt:read_translations(?MODULE),
|
||||||
J = gd_jt:j(Lang, Trans),
|
J = gd_jt:j(Lang, Trans),
|
||||||
|
|
||||||
|
@ -429,12 +429,11 @@ call_params([{L, C} | T], A) ->
|
|||||||
clicked4(State,
|
clicked4(State,
|
||||||
#c{id = ConID, build = #{aci := ACI}, funs = {_, Funs}},
|
#c{id = ConID, build = #{aci := ACI}, funs = {_, Funs}},
|
||||||
{Name, Type},
|
{Name, Type},
|
||||||
{PK, Nonce, TTL, GasP, Gas, Amount}) ->
|
{PK, Nonce, TTL, GasP, Gas, Amt}) ->
|
||||||
AACI = hz:prepare_aaci(ACI),
|
AACI = hz:prepare_aaci(ACI),
|
||||||
#f{args = ArgFields} = lists:keyfind(Name, #f.name, Funs),
|
#f{args = ArgFields} = maps:get(Name, Funs),
|
||||||
Args = lists:map(fun get_arg/1, ArgFields),
|
Args = lists:map(fun get_arg/1, ArgFields),
|
||||||
FunName = binary_to_list(Name),
|
case hz:contract_call(PK, Nonce, Gas, GasP, Amt, TTL, AACI, ConID, Name, Args) of
|
||||||
case hz:contract_call(PK, Nonce, Gas, GasP, Amount, TTL, AACI, ConID, FunName, Args) of
|
|
||||||
{ok, UnsignedTX} ->
|
{ok, UnsignedTX} ->
|
||||||
case Type of
|
case Type of
|
||||||
call -> do_call(State, ConID, PK, UnsignedTX);
|
call -> do_call(State, ConID, PK, UnsignedTX);
|
||||||
@ -599,33 +598,39 @@ deploy2(State, Source) ->
|
|||||||
case compile(Source) of
|
case compile(Source) of
|
||||||
% Options = sophia_options(),
|
% Options = sophia_options(),
|
||||||
% case so_compiler:from_string(Source, Options) of
|
% case so_compiler:from_string(Source, Options) of
|
||||||
|
% TODO: Make hz accept either the aaci or the aci, preferring the aaci if present
|
||||||
{ok, Build} ->
|
{ok, Build} ->
|
||||||
deploy3(State, Build);
|
ACI = maps:get(aci, Build),
|
||||||
|
RawAACI = {aaci, ContractName, Funs, NS} = hz:prepare_aaci(ACI),
|
||||||
|
{InitSpec, Callable} = maps:take("init", Funs),
|
||||||
|
AACI = setelement(3, RawAACI, Callable),
|
||||||
|
Complete = maps:put(aaci, AACI, Build),
|
||||||
|
ok = tell(info, "Deploying Contract: ~p", [ContractName]),
|
||||||
|
deploy3(State, InitSpec, Complete, NS);
|
||||||
Other ->
|
Other ->
|
||||||
ok = tell(info, "Compilation Failed!~n~tp", [Other]),
|
ok = tell(info, "Compilation Failed!~n~tp", [Other]),
|
||||||
State
|
State
|
||||||
end.
|
end.
|
||||||
|
|
||||||
deploy3(State, Build) ->
|
deploy3(State, InitSpec, Build, NS) ->
|
||||||
case gd_con:list_keys() of
|
case gd_con:list_keys() of
|
||||||
{ok, 0, []} ->
|
{ok, 0, []} ->
|
||||||
handle_troubling(State, "No keys exist in the current wallet.");
|
handle_troubling(State, "No keys exist in the current wallet.");
|
||||||
{ok, Selected, Keys} ->
|
{ok, Selected, Keys} ->
|
||||||
deploy4(State, Build, Selected, Keys);
|
deploy4(State, InitSpec, Build, NS, Selected, Keys);
|
||||||
error ->
|
error ->
|
||||||
handle_troubling(State, "No wallet is selected!")
|
handle_troubling(State, "No wallet is selected!")
|
||||||
end.
|
end.
|
||||||
|
|
||||||
deploy4(State = #s{frame = Frame, j = J}, Build = #{aci := ACI}, Selected, Keys) ->
|
deploy4(State = #s{frame = Frame, j = J}, InitSpec, Build, NS, Selected, Keys) ->
|
||||||
{#{functions := Funs}, _} = find_main(ACI),
|
InitArgs = element(1, InitSpec),
|
||||||
#{arguments := As} = lom:find(name, <<"init">>, Funs),
|
|
||||||
Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Deploy Contract")),
|
Dialog = wxDialog:new(Frame, ?wxID_ANY, J("Deploy Contract")),
|
||||||
Sizer = wxBoxSizer:new(?wxVERTICAL),
|
Sizer = wxBoxSizer:new(?wxVERTICAL),
|
||||||
ScrollWin = wxScrolledWindow:new(Dialog),
|
ScrollWin = wxScrolledWindow:new(Dialog),
|
||||||
ScrollSz = wxBoxSizer:new(?wxVERTICAL),
|
ScrollSz = wxBoxSizer:new(?wxVERTICAL),
|
||||||
ok = wxScrolledWindow:setSizerAndFit(ScrollWin, ScrollSz),
|
ok = wxScrolledWindow:setSizerAndFit(ScrollWin, ScrollSz),
|
||||||
ok = wxScrolledWindow:setScrollRate(ScrollWin, 5, 5),
|
ok = wxScrolledWindow:setScrollRate(ScrollWin, 5, 5),
|
||||||
FunName = unicode:characters_to_list(["init/", integer_to_list(length(As))]),
|
FunName = unicode:characters_to_list(["init/", integer_to_list(length(InitArgs))]),
|
||||||
FunSz = wxStaticBoxSizer:new(?wxVERTICAL, ScrollWin, [{label, FunName}]),
|
FunSz = wxStaticBoxSizer:new(?wxVERTICAL, ScrollWin, [{label, FunName}]),
|
||||||
KeySz = wxStaticBoxSizer:new(?wxVERTICAL, ScrollWin, [{label, J("Signature Key")}]),
|
KeySz = wxStaticBoxSizer:new(?wxVERTICAL, ScrollWin, [{label, J("Signature Key")}]),
|
||||||
KeyPicker = wxChoice:new(ScrollWin, ?wxID_ANY, [{choices, Keys}]),
|
KeyPicker = wxChoice:new(ScrollWin, ?wxID_ANY, [{choices, Keys}]),
|
||||||
@ -640,24 +645,7 @@ deploy4(State = #s{frame = Frame, j = J}, Build = #{aci := ACI}, Selected, Keys)
|
|||||||
GridSz = wxFlexGridSizer:new(2, 4, 4),
|
GridSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
ok = wxFlexGridSizer:setFlexibleDirection(GridSz, ?wxHORIZONTAL),
|
ok = wxFlexGridSizer:setFlexibleDirection(GridSz, ?wxHORIZONTAL),
|
||||||
ok = wxFlexGridSizer:addGrowableCol(GridSz, 1),
|
ok = wxFlexGridSizer:addGrowableCol(GridSz, 1),
|
||||||
MakeArgField =
|
ArgFields = make_arg_fields(ScrollWin, GridSz, InitArgs, NS, J),
|
||||||
fun(#{name := AN, type := T}) ->
|
|
||||||
Type =
|
|
||||||
case T of
|
|
||||||
<<"address">> -> address;
|
|
||||||
<<"int">> -> integer;
|
|
||||||
<<"bool">> -> boolean;
|
|
||||||
L when is_list(L) -> list; % FIXME
|
|
||||||
% I when is_binary(I) -> iface % FIXME
|
|
||||||
I when is_binary(I) -> address % FIXME
|
|
||||||
end,
|
|
||||||
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
|
||||||
TCT = wxTextCtrl:new(ScrollWin, ?wxID_ANY),
|
|
||||||
_ = wxFlexGridSizer:add(GridSz, ANT, zxw:flags(base)),
|
|
||||||
_ = wxFlexGridSizer:add(GridSz, TCT, zxw:flags(wide)),
|
|
||||||
{ANT, TCT, Type}
|
|
||||||
end,
|
|
||||||
ArgFields = lists:map(MakeArgField, As),
|
|
||||||
_ = wxStaticBoxSizer:add(FunSz, GridSz, zxw:flags(wide)),
|
_ = wxStaticBoxSizer:add(FunSz, GridSz, zxw:flags(wide)),
|
||||||
_ = wxStaticBoxSizer:add(ScrollSz, FunSz, [{proportion, 1}, {flag, ?wxEXPAND}]),
|
_ = wxStaticBoxSizer:add(ScrollSz, FunSz, [{proportion, 1}, {flag, ?wxEXPAND}]),
|
||||||
_ = wxStaticBoxSizer:add(ScrollSz, KeySz, [{proportion, 0}, {flag, ?wxEXPAND}]),
|
_ = wxStaticBoxSizer:add(ScrollSz, KeySz, [{proportion, 0}, {flag, ?wxEXPAND}]),
|
||||||
@ -673,7 +661,7 @@ deploy4(State = #s{frame = Frame, j = J}, Build = #{aci := ACI}, Selected, Keys)
|
|||||||
?wxID_OK ->
|
?wxID_OK ->
|
||||||
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),
|
||||||
InitArgs = lists:map(fun get_arg/1, ArgFields),
|
IArgs = lists:map(fun get_arg/1, ArgFields),
|
||||||
Controls =
|
Controls =
|
||||||
[{"TTL", TTL_Tx},
|
[{"TTL", TTL_Tx},
|
||||||
{"Gas Price", GasP_Tx},
|
{"Gas Price", GasP_Tx},
|
||||||
@ -683,7 +671,7 @@ deploy4(State = #s{frame = Frame, j = J}, Build = #{aci := ACI}, Selected, Keys)
|
|||||||
{ok, [TTL, GasP, Gas, Amount]} ->
|
{ok, [TTL, GasP, Gas, Amount]} ->
|
||||||
{ok, Nonce} = hz:next_nonce(PK),
|
{ok, Nonce} = hz:next_nonce(PK),
|
||||||
DeployParams = {PK, Nonce, TTL, GasP, Gas, Amount},
|
DeployParams = {PK, Nonce, TTL, GasP, Gas, Amount},
|
||||||
{ok, DeployParams, InitArgs};
|
{ok, DeployParams, IArgs};
|
||||||
E ->
|
E ->
|
||||||
E
|
E
|
||||||
end;
|
end;
|
||||||
@ -849,9 +837,9 @@ open_hash3(State, Address, Source) ->
|
|||||||
% TODO: Compile on load and verify the deployed hash for validity.
|
% TODO: Compile on load and verify the deployed hash for validity.
|
||||||
Options = sophia_options(),
|
Options = sophia_options(),
|
||||||
case so_compiler:from_string(Source, Options) of
|
case so_compiler:from_string(Source, Options) of
|
||||||
{ok, Build = #{aci := ACI}} ->
|
{ok, Build = #{aaci := AACI}} ->
|
||||||
{Defs = #{functions := Funs}, ConIfaces} = find_main(ACI),
|
{Defs = #{functions := Funs}, ConIfaces} = find_main(AACI),
|
||||||
Callable = lom:delete(name, <<"init">>, Funs),
|
Callable = maps:remove("init", Funs),
|
||||||
FunDefs = {maps:put(functions, Callable, Defs), ConIfaces},
|
FunDefs = {maps:put(functions, Callable, Defs), ConIfaces},
|
||||||
ok = tell(info, "Compilation Succeeded!~n~tp~n~n~tp", [Build, FunDefs]),
|
ok = tell(info, "Compilation Succeeded!~n~tp~n~n~tp", [Build, FunDefs]),
|
||||||
add_code_page(State, {hash, Address}, Source);
|
add_code_page(State, {hash, Address}, Source);
|
||||||
@ -1118,12 +1106,16 @@ load3(State = #s{tabs = TopBook, cons = {Consbook, Pages}, buttons = Buttons, j
|
|||||||
_ = wxSizer:add(PageSz, ConsSz, [{proportion, 1}, {flag, ?wxEXPAND}]),
|
_ = wxSizer:add(PageSz, ConsSz, [{proportion, 1}, {flag, ?wxEXPAND}]),
|
||||||
{Out, IFaces, Build, NewButtons} =
|
{Out, IFaces, Build, NewButtons} =
|
||||||
case compile(Source) of
|
case compile(Source) of
|
||||||
{ok, B = #{aci := ACI}} ->
|
{ok, Output} ->
|
||||||
{#{functions := Fs}, _} = find_main(ACI),
|
ACI = maps:get(aci, Output),
|
||||||
Callable = lom:delete(name, <<"init">>, Fs),
|
AACI = {aaci, ContractName, Funs, NS} = hz:prepare_aaci(ACI),
|
||||||
{NB, IFs} = fun_interfaces(ScrollWin, FunSz, Buttons, Callable, J),
|
Complete = maps:put(aaci, AACI, Output),
|
||||||
O = io_lib:format("Compilation Succeeded!~n~tp~n~nDone!~n", [B]),
|
ok = tell(info, "Loading Contract: ~p", [ContractName]),
|
||||||
{O, IFs, B, NB};
|
Callable = maps:remove("init", Funs),
|
||||||
|
tell(info, "Callable: ~p", [Callable]),
|
||||||
|
{NB, IFs} = fun_interfaces(ScrollWin, FunSz, Buttons, Callable, NS, J),
|
||||||
|
O = io_lib:format("Compilation Succeeded!~n~tp~n~nDone!~n", [Complete]),
|
||||||
|
{O, IFs, Complete, NB};
|
||||||
Other ->
|
Other ->
|
||||||
O = io_lib:format("Compilation Failed!~n~tp~n", [Other]),
|
O = io_lib:format("Compilation Failed!~n~tp~n", [Other]),
|
||||||
{O, [], none, Buttons}
|
{O, [], none, Buttons}
|
||||||
@ -1141,9 +1133,18 @@ load3(State = #s{tabs = TopBook, cons = {Consbook, Pages}, buttons = Buttons, j
|
|||||||
State#s{cons = {Consbook, NewPages}, buttons = NewButtons}.
|
State#s{cons = {Consbook, NewPages}, buttons = NewButtons}.
|
||||||
|
|
||||||
|
|
||||||
get_arg({_, TextCtrl, _}) ->
|
get_arg({list, AFs, _}) ->
|
||||||
|
lists:map(fun get_arg/1, AFs);
|
||||||
|
get_arg({record, AFs}) ->
|
||||||
|
get_record(AFs);
|
||||||
|
get_arg({tuple, AFs}) ->
|
||||||
|
list_to_tuple(lists:map(fun get_arg/1, AFs));
|
||||||
|
get_arg({_, TextCtrl}) ->
|
||||||
wxTextCtrl:getValue(TextCtrl).
|
wxTextCtrl:getValue(TextCtrl).
|
||||||
|
|
||||||
|
get_record([{L, A} | T]) ->
|
||||||
|
[{L, get_arg(A)} | get_record(T)].
|
||||||
|
|
||||||
find_main(ACI) ->
|
find_main(ACI) ->
|
||||||
find_main(ACI, none, []).
|
find_main(ACI, none, []).
|
||||||
|
|
||||||
@ -1159,60 +1160,166 @@ find_main([C | T], M, Is) ->
|
|||||||
find_main([], M, Is) ->
|
find_main([], M, Is) ->
|
||||||
{M, Is}.
|
{M, Is}.
|
||||||
|
|
||||||
fun_interfaces(ScrollWin, FunSz, Buttons, Funs, J) ->
|
fun_interfaces(ScrollWin, FunSz, Buttons, Funs, NS, J) ->
|
||||||
MakeIface =
|
MakeIface =
|
||||||
fun(#{name := N, arguments := As}) ->
|
fun(Name, {Args, _}) ->
|
||||||
FunName = unicode:characters_to_list([N, "/", integer_to_list(length(As))]),
|
tell(info, "Fun: ~p, Args: ~p", [Name, Args]),
|
||||||
|
FunName = unicode:characters_to_list([Name, "/", integer_to_list(length(Args))]),
|
||||||
FN = wxStaticBoxSizer:new(?wxVERTICAL, ScrollWin, [{label, FunName}]),
|
FN = wxStaticBoxSizer:new(?wxVERTICAL, ScrollWin, [{label, FunName}]),
|
||||||
GridSz = wxFlexGridSizer:new(2, 4, 4),
|
GridSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
ok = wxFlexGridSizer:setFlexibleDirection(GridSz, ?wxHORIZONTAL),
|
ok = wxFlexGridSizer:setFlexibleDirection(GridSz, ?wxHORIZONTAL),
|
||||||
ok = wxFlexGridSizer:addGrowableCol(GridSz, 1),
|
ok = wxFlexGridSizer:addGrowableCol(GridSz, 1),
|
||||||
MakeArgField =
|
ArgFields = make_arg_fields(ScrollWin, GridSz, Args, NS, J),
|
||||||
fun(#{name := AN, type := T}) ->
|
|
||||||
Type =
|
|
||||||
case T of
|
|
||||||
<<"address">> -> address;
|
|
||||||
<<"int">> -> integer;
|
|
||||||
<<"bool">> -> boolean;
|
|
||||||
L when is_list(L) -> list; % FIXME
|
|
||||||
% I when is_binary(I) -> iface % FIXME
|
|
||||||
I when is_binary(I) -> address % FIXME
|
|
||||||
end,
|
|
||||||
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
|
||||||
TCT = wxTextCtrl:new(ScrollWin, ?wxID_ANY),
|
|
||||||
_ = wxFlexGridSizer:add(GridSz, ANT, zxw:flags(base)),
|
|
||||||
_ = wxFlexGridSizer:add(GridSz, TCT, zxw:flags(wide)),
|
|
||||||
{ANT, TCT, Type}
|
|
||||||
end,
|
|
||||||
ArgFields = lists:map(MakeArgField, As),
|
|
||||||
ButtSz = wxBoxSizer:new(?wxHORIZONTAL),
|
ButtSz = wxBoxSizer:new(?wxHORIZONTAL),
|
||||||
{CallButton, DryRunButton} =
|
CallBn = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Call")}]),
|
||||||
case N =:= <<"init">> of
|
DryRBn = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Dry Run")}]),
|
||||||
false ->
|
_ = wxBoxSizer:add(ButtSz, CallBn, zxw:flags(wide)),
|
||||||
CallBn = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Call")}]),
|
_ = wxBoxSizer:add(ButtSz, DryRBn, zxw:flags(wide)),
|
||||||
DryRBn = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Dry Run")}]),
|
CallButton = #w{name = {Name, call}, id = wxButton:getId(CallBn), wx = CallBn},
|
||||||
_ = wxBoxSizer:add(ButtSz, CallBn, zxw:flags(wide)),
|
DryRButton = #w{name = {Name, dryr}, id = wxButton:getId(DryRBn), wx = DryRBn},
|
||||||
_ = wxBoxSizer:add(ButtSz, DryRBn, zxw:flags(wide)),
|
|
||||||
{#w{name = {N, call}, id = wxButton:getId(CallBn), wx = CallBn},
|
|
||||||
#w{name = {N, dryr}, id = wxButton:getId(DryRBn), wx = DryRBn}};
|
|
||||||
true ->
|
|
||||||
Deploy = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Deploy")}]),
|
|
||||||
_ = wxBoxSizer:add(ButtSz, Deploy, zxw:flags(wide)),
|
|
||||||
{#w{name = {N, call}, id = wxButton:getId(Deploy), wx = Deploy},
|
|
||||||
none}
|
|
||||||
end,
|
|
||||||
_ = wxStaticBoxSizer:add(FN, GridSz, zxw:flags(wide)),
|
_ = wxStaticBoxSizer:add(FN, GridSz, zxw:flags(wide)),
|
||||||
_ = wxStaticBoxSizer:add(FN, ButtSz, zxw:flags(base)),
|
_ = wxStaticBoxSizer:add(FN, ButtSz, zxw:flags(base)),
|
||||||
_ = wxSizer:add(FunSz, FN, zxw:flags(base)),
|
_ = wxSizer:add(FunSz, FN, zxw:flags(base)),
|
||||||
#f{name = N, call = CallButton, dryrun = DryRunButton, args = ArgFields}
|
#f{name = Name, call = CallButton, dryrun = DryRButton, args = ArgFields}
|
||||||
end,
|
end,
|
||||||
IFaces = lists:map(MakeIface, Funs),
|
IFaces = maps:map(MakeIface, Funs),
|
||||||
NewButtons = lists:foldl(fun map_iface_buttons/2, Buttons, IFaces),
|
tell(info, "IFaces: ~p", [IFaces]),
|
||||||
|
NewButtons = maps:fold(fun map_iface_buttons/3, Buttons, IFaces),
|
||||||
{NewButtons, IFaces}.
|
{NewButtons, IFaces}.
|
||||||
|
|
||||||
map_iface_buttons(#f{call = C = #w{id = CID}, dryrun = D = #w{id = DID}}, A) ->
|
% FIXME: This can be simplified and needs to provide better widgets for types.
|
||||||
maps:put(DID, D, maps:put(CID, C, A));
|
% "variant" types should be wxChoice
|
||||||
map_iface_buttons(#f{call = C = #w{id = CID}, dryrun = none}, A) ->
|
% Booleans should either be wxChoice or check boxes
|
||||||
|
% The sizer expansion direction for vertical elements is stupid
|
||||||
|
make_arg_fields(ScrollWin, GridSz, Args, NS, J) ->
|
||||||
|
MakeArgField =
|
||||||
|
fun
|
||||||
|
({AN, {T, already_normalized, T}}) ->
|
||||||
|
% tell(info, "~p Arg: ~p, Type: ~p", [?LINE, AN, T]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
||||||
|
TCT = wxTextCtrl:new(ScrollWin, ?wxID_ANY),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, TCT, fill()),
|
||||||
|
{T, TCT};
|
||||||
|
({T, already_normalized, T}) ->
|
||||||
|
% tell(info, "~p Type: ~p", [?LINE, T]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, atom_to_list(T)),
|
||||||
|
TCT = wxTextCtrl:new(ScrollWin, ?wxID_ANY),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, TCT, fill()),
|
||||||
|
{T, TCT};
|
||||||
|
({AN, {_TypeName, T, T}}) ->
|
||||||
|
% tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, T]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
||||||
|
TCT = wxTextCtrl:new(ScrollWin, ?wxID_ANY),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, TCT, fill()),
|
||||||
|
{T, TCT};
|
||||||
|
({AN, {_TypeName, already_normalized, {record, InnerArgs}}}) ->
|
||||||
|
% tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, InnerArgs]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
||||||
|
InnerSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
|
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
|
||||||
|
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
|
||||||
|
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, InnerSz, fill()),
|
||||||
|
{record, AFs};
|
||||||
|
({AN, {_TypeName, already_normalized, {tuple, InnerArgs}}}) ->
|
||||||
|
% tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, InnerArgs]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
||||||
|
InnerSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
|
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
|
||||||
|
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
|
||||||
|
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, InnerSz, fill()),
|
||||||
|
{tuple, AFs};
|
||||||
|
({AN, {_TypeName, already_normalized, {list, InnerArgs}}}) ->
|
||||||
|
% tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, InnerArgs]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
||||||
|
ArgSz = wxBoxSizer:new(?wxVERTICAL),
|
||||||
|
InnerSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
|
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
|
||||||
|
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
|
||||||
|
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J),
|
||||||
|
B = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Add")}]),
|
||||||
|
AB = #w{name = {AN, add}, id = wxButton:getId(B), wx = B},
|
||||||
|
_ = wxBoxSizer:add(ArgSz, InnerSz, fill()),
|
||||||
|
_ = wxBoxSizer:add(ArgSz, B, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ArgSz, fill()),
|
||||||
|
{list, AFs, AB};
|
||||||
|
({AN, {_TypeName, already_normalized, T}}) ->
|
||||||
|
% tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, T]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
||||||
|
InnerSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
|
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
|
||||||
|
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
|
||||||
|
AFs = make_arg_fields(ScrollWin, InnerSz, T, NS, J),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, InnerSz, fill()),
|
||||||
|
{tuple, AFs};
|
||||||
|
({AN, {{tuple, _}, already_normalized, {tuple, InnerArgs}}}) ->
|
||||||
|
% tell(info, "~p Arg: ~p, Tuple: ~p", [?LINE, AN, InnerArgs]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
||||||
|
InnerSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
|
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
|
||||||
|
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
|
||||||
|
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, InnerSz, fill()),
|
||||||
|
{tuple, AFs};
|
||||||
|
({AN, {{list, _}, already_normalized, {list, InnerArgs}}}) ->
|
||||||
|
% tell(info, "~p Arg: ~p, List: ~p", [?LINE, AN, InnerArgs]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
|
||||||
|
ArgSz = wxBoxSizer:new(?wxHORIZONTAL),
|
||||||
|
InnerSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
|
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
|
||||||
|
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
|
||||||
|
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J),
|
||||||
|
B = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Add")}]),
|
||||||
|
AB = #w{name = {AN, add}, id = wxButton:getId(B), wx = B},
|
||||||
|
_ = wxBoxSizer:add(ArgSz, InnerSz, fill()),
|
||||||
|
_ = wxBoxSizer:add(ArgSz, B, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ArgSz, fill()),
|
||||||
|
{list, AFs, AB};
|
||||||
|
({{tuple, _}, already_normalized, {tuple, InnerArgs}}) ->
|
||||||
|
% tell(info, "~p Tuple: ~p", [?LINE, InnerArgs]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, "tuple"),
|
||||||
|
InnerSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
|
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
|
||||||
|
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
|
||||||
|
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, InnerSz, fill()),
|
||||||
|
{tuple, AFs};
|
||||||
|
({{list, _}, already_normalized, {list, InnerArgs}}) ->
|
||||||
|
% tell(info, "~p List: ~p", [?LINE, InnerArgs]),
|
||||||
|
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, "list"),
|
||||||
|
ArgSz = wxBoxSizer:new(?wxHORIZONTAL),
|
||||||
|
InnerSz = wxFlexGridSizer:new(2, 4, 4),
|
||||||
|
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
|
||||||
|
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
|
||||||
|
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J),
|
||||||
|
B = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Add")}]),
|
||||||
|
AB = #w{name = {list, add}, id = wxButton:getId(B), wx = B},
|
||||||
|
_ = wxBoxSizer:add(ArgSz, InnerSz, [{proportion, 1}, {flag, ?wxEXPAND}]),
|
||||||
|
_ = wxBoxSizer:add(ArgSz, B, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ANT, fill()),
|
||||||
|
_ = wxFlexGridSizer:add(GridSz, ArgSz, fill()),
|
||||||
|
{list, AFs, AB}
|
||||||
|
end,
|
||||||
|
lists:map(MakeArgField, Args).
|
||||||
|
|
||||||
|
fill() ->
|
||||||
|
[{proportion, 0}, {flag, ?wxEXPAND}].
|
||||||
|
|
||||||
|
|
||||||
|
map_iface_buttons(_, #f{call = C = #w{id = CID}, dryrun = D = #w{id = DID}}, A) ->
|
||||||
|
maps:merge(#{CID => C, DID => D}, A);
|
||||||
|
map_iface_buttons(_, #f{call = C = #w{id = CID}, dryrun = none}, A) ->
|
||||||
maps:put(CID, C, A).
|
maps:put(CID, C, A).
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,16 +2,16 @@
|
|||||||
{type,gui}.
|
{type,gui}.
|
||||||
{modules,[]}.
|
{modules,[]}.
|
||||||
{prefix,"gd"}.
|
{prefix,"gd"}.
|
||||||
{author,"Craig Everett"}.
|
|
||||||
{desc,"A desktop client for the Gajumaru network of blockchain networks"}.
|
{desc,"A desktop client for the Gajumaru network of blockchain networks"}.
|
||||||
|
{author,"Craig Everett"}.
|
||||||
{package_id,{"otpr","gajudesk",{0,5,4}}}.
|
{package_id,{"otpr","gajudesk",{0,5,4}}}.
|
||||||
{deps,[{"otpr","hakuzaru",{0,6,0}},
|
{deps,[{"otpr","base58",{0,1,1}},
|
||||||
|
{"otpr","hakuzaru",{0,6,0}},
|
||||||
{"otpr","gmserialization",{0,1,3}},
|
{"otpr","gmserialization",{0,1,3}},
|
||||||
{"otpr","sophia",{9,0,0}},
|
{"otpr","sophia",{9,0,0}},
|
||||||
{"otpr","gmbytecode",{3,4,1}},
|
{"otpr","gmbytecode",{3,4,1}},
|
||||||
{"otpr","lom",{1,0,0}},
|
{"otpr","lom",{1,0,0}},
|
||||||
{"otpr","zj",{1,1,0}},
|
{"otpr","zj",{1,1,0}},
|
||||||
{"otpr","erl_base58",{0,1,0}},
|
|
||||||
{"otpr","eblake2",{1,0,0}},
|
{"otpr","eblake2",{1,0,0}},
|
||||||
{"otpr","ec_utils",{1,0,0}},
|
{"otpr","ec_utils",{1,0,0}},
|
||||||
{"otpr","zxwidgets",{1,0,1}}]}.
|
{"otpr","zxwidgets",{1,0,1}}]}.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user