Sketchy list, map, variant interface

None of these are quite working right, but the hive contract can open in
the 'open from chain' button now.
This commit is contained in:
Jarvis Carroll 2025-08-22 18:38:57 +10:00
parent dc0b620a4c
commit f78d929fb9

View File

@ -1146,6 +1146,11 @@ get_arg({record, AFs}) ->
get_record(AFs); get_record(AFs);
get_arg({tuple, AFs}) -> get_arg({tuple, AFs}) ->
list_to_tuple(lists:map(fun get_arg/1, AFs)); list_to_tuple(lists:map(fun get_arg/1, AFs));
get_arg({map, [Key, Value]}) ->
#{get_arg(Key) => get_arg(Value)};
get_arg({variant, AFs, [VariantOne | _]}) ->
Elems = lists:map(fun get_arg/1, AFs),
list_to_tuple([VariantOne | Elems]);
get_arg({_, TextCtrl}) -> get_arg({_, TextCtrl}) ->
wxTextCtrl:getValue(TextCtrl). wxTextCtrl:getValue(TextCtrl).
@ -1201,28 +1206,14 @@ fun_interfaces(ScrollWin, FunSz, Buttons, Funs, NS, J) ->
make_arg_fields(ScrollWin, GridSz, Args, NS, J) -> make_arg_fields(ScrollWin, GridSz, Args, NS, J) ->
MakeArgField = MakeArgField =
fun fun
({AN, {T, already_normalized, T}}) -> ({AN, {_O, _N, T}}) when is_atom(T) ->
% tell(info, "~p Arg: ~p, Type: ~p", [?LINE, AN, T]), % tell(info, "~p Arg: ~p, Type: ~p", [?LINE, AN, T]),
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN), ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
TCT = wxTextCtrl:new(ScrollWin, ?wxID_ANY), TCT = wxTextCtrl:new(ScrollWin, ?wxID_ANY),
_ = wxFlexGridSizer:add(GridSz, ANT, fill()), _ = wxFlexGridSizer:add(GridSz, ANT, fill()),
_ = wxFlexGridSizer:add(GridSz, TCT, fill()), _ = wxFlexGridSizer:add(GridSz, TCT, fill()),
{T, TCT}; {T, TCT};
({T, already_normalized, T}) -> ({AN, {_O, _N, {record, InnerArgs}}}) ->
% 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]), % tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, InnerArgs]),
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN), ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
InnerSz = wxFlexGridSizer:new(2, 4, 4), InnerSz = wxFlexGridSizer:new(2, 4, 4),
@ -1232,24 +1223,24 @@ make_arg_fields(ScrollWin, GridSz, Args, NS, J) ->
_ = wxFlexGridSizer:add(GridSz, ANT, fill()), _ = wxFlexGridSizer:add(GridSz, ANT, fill()),
_ = wxFlexGridSizer:add(GridSz, InnerSz, fill()), _ = wxFlexGridSizer:add(GridSz, InnerSz, fill()),
{record, AFs}; {record, AFs};
({AN, {_TypeName, already_normalized, {tuple, InnerArgs}}}) -> ({AN, {_O, _N, {tuple, InnerArgs}}}) ->
% tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, InnerArgs]), % tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, InnerArgs]),
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN), ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
InnerSz = wxFlexGridSizer:new(2, 4, 4), InnerSz = wxFlexGridSizer:new(2, 4, 4),
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL), ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1), ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J), AFs = make_unnamed_fields(ScrollWin, InnerSz, InnerArgs, NS, J),
_ = wxFlexGridSizer:add(GridSz, ANT, fill()), _ = wxFlexGridSizer:add(GridSz, ANT, fill()),
_ = wxFlexGridSizer:add(GridSz, InnerSz, fill()), _ = wxFlexGridSizer:add(GridSz, InnerSz, fill()),
{tuple, AFs}; {tuple, AFs};
({AN, {_TypeName, already_normalized, {list, InnerArgs}}}) -> ({AN, {_O, _N, {list, [InnerType]}}}) ->
% tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, InnerArgs]), % tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, InnerArgs]),
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN), ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
ArgSz = wxBoxSizer:new(?wxVERTICAL), ArgSz = wxBoxSizer:new(?wxVERTICAL),
InnerSz = wxFlexGridSizer:new(2, 4, 4), InnerSz = wxFlexGridSizer:new(2, 4, 4),
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL), ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1), ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J), AFs = make_unnamed_fields(ScrollWin, InnerSz, [InnerType], NS, J),
B = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Add")}]), B = wxButton:new(ScrollWin, ?wxID_ANY, [{label, J("Add")}]),
AB = #w{name = {AN, add}, id = wxButton:getId(B), wx = B}, AB = #w{name = {AN, add}, id = wxButton:getId(B), wx = B},
_ = wxBoxSizer:add(ArgSz, InnerSz, fill()), _ = wxBoxSizer:add(ArgSz, InnerSz, fill()),
@ -1257,69 +1248,47 @@ make_arg_fields(ScrollWin, GridSz, Args, NS, J) ->
_ = wxFlexGridSizer:add(GridSz, ANT, fill()), _ = wxFlexGridSizer:add(GridSz, ANT, fill()),
_ = wxFlexGridSizer:add(GridSz, ArgSz, fill()), _ = wxFlexGridSizer:add(GridSz, ArgSz, fill()),
{list, AFs, AB}; {list, AFs, AB};
({AN, {_TypeName, already_normalized, T}}) -> ({AN, {_O, _N, {map, [Key, Value]}}}) ->
% tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, T]), % tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, T]),
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN), ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
InnerSz = wxFlexGridSizer:new(2, 4, 4), InnerSz = wxFlexGridSizer:new(2, 4, 4),
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL), ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1), ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
AFs = make_arg_fields(ScrollWin, InnerSz, T, NS, J), AFs = make_unnamed_fields(ScrollWin, InnerSz, [Key, Value], NS, J),
_ = wxFlexGridSizer:add(GridSz, ANT, fill()), _ = wxFlexGridSizer:add(GridSz, ANT, fill()),
_ = wxFlexGridSizer:add(GridSz, InnerSz, fill()), _ = wxFlexGridSizer:add(GridSz, InnerSz, fill()),
{tuple, AFs}; {map, AFs};
({AN, {{tuple, _}, already_normalized, {tuple, InnerArgs}}}) -> ({AN, {_O, _N, {variant, Variants = [{_, VariantElements} | _]}}}) ->
% tell(info, "~p Arg: ~p, Tuple: ~p", [?LINE, AN, InnerArgs]), % tell(info, "~p Arg: ~p, ~p: ~p", [?LINE, AN, TypeName, InnerArgs]),
ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN), ANT = wxStaticText:new(ScrollWin, ?wxID_ANY, AN),
InnerSz = wxFlexGridSizer:new(2, 4, 4), InnerSz = wxFlexGridSizer:new(2, 4, 4),
ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL), ok = wxFlexGridSizer:setFlexibleDirection(InnerSz, ?wxHORIZONTAL),
ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1), ok = wxFlexGridSizer:addGrowableCol(InnerSz, 1),
AFs = make_arg_fields(ScrollWin, InnerSz, InnerArgs, NS, J), AFs = make_unnamed_fields(ScrollWin, InnerSz, VariantElements, NS, J),
_ = wxFlexGridSizer:add(GridSz, ANT, fill()), _ = wxFlexGridSizer:add(GridSz, ANT, fill()),
_ = wxFlexGridSizer:add(GridSz, InnerSz, fill()), _ = wxFlexGridSizer:add(GridSz, InnerSz, fill()),
{tuple, AFs}; VariantNames = lists:map(fun({Name, _}) -> Name end, Variants),
({AN, {{list, _}, already_normalized, {list, InnerArgs}}}) -> {variant, AFs, VariantNames}
% 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, end,
lists:map(MakeArgField, Args). lists:map(MakeArgField, Args).
make_unnamed_fields(ScrollWin, InnerSz, Elems, NS, J) ->
tell(info, "ta", []),
ChooseName =
fun
(Ann = {_, _, T}) when is_atom(T) ->
{atom_to_list(T), Ann};
(Ann = {Name, _, {record, _}}) when is_list(Name) ->
io:format("record: ~p~n", [Ann]),
{Name, Ann};
(Ann = {_, _, {T, _}}) when is_atom(T) ->
{atom_to_list(T), Ann}
end,
tell(info, "tb", []),
WithNames = lists:map(ChooseName, Elems),
tell(info, "tc", []),
make_arg_fields(ScrollWin, InnerSz, WithNames, NS, J).
fill() -> fill() ->
[{proportion, 0}, {flag, ?wxEXPAND}]. [{proportion, 0}, {flag, ?wxEXPAND}].