Skip to content

Instantly share code, notes, and snippets.

@pazworld
Last active August 11, 2022 11:15
Show Gist options
  • Save pazworld/f5b82ee2f9886581191491d58d7e943b to your computer and use it in GitHub Desktop.
Save pazworld/f5b82ee2f9886581191491d58d7e943b to your computer and use it in GitHub Desktop.

These are my wxErlang study file.

  • box_sizer_test.erl - BoxSizer
  • countdown_gui.erl - Count down timer
  • draw_rect.erl - Draw green rectangle on a panel
-module(box_sizer_test).
-export([start/0]).
-include_lib("wx/include/wx.hrl").
start() ->
wx:new(),
Frame = wxFrame:new(wx:null(), ?wxID_ANY, "BoxSizer"),
Button1 = wxButton:new(Frame, ?wxID_ANY, [{label, "Button 1"}]),
Button2 = wxButton:new(Frame, ?wxID_ANY, [{label, "Button 2"}]),
MainSizer = wxBoxSizer:new(?wxVERTICAL),
wxSizer:add(MainSizer, Button1, [{flag, ?wxEXPAND}, {proportion, 1}]),
wxSizer:add(MainSizer, Button2, [{flag, ?wxBOTTOM bor ?wxEXPAND}]),
wxWindow:setSizer(Frame, MainSizer),
wxFrame:show(Frame).
-module(buffered_paint).
-export([start/0]).
-include_lib("wx/include/wx.hrl").
start() ->
wx:new(),
Frame = wxFrame:new(wx:null(), ?wxID_ANY, "buffered_paint", [{size, {250, 200}}]),
Buffer = init_buffer(Frame),
wxFrame:connect(Frame, close_window),
wxFrame:connect(Frame, paint),
wxFrame:connect(Frame, size),
wxFrame:show(Frame),
main_loop(Frame, Buffer, 0, 100),
wx:destroy(),
ok.
main_loop(Frame, Buffer, X, Y) ->
receive
#wx{event = #wxClose{}} ->
wxWindow:destroy(Frame);
#wx{obj = Obj, event = #wxPaint{}} ->
DC = wxBufferedDC:new(wxClientDC:new(Obj), [{buffer, Buffer}]),
wxBufferedDC:destroy(DC),
main_loop(Frame, Buffer, X, Y);
#wx{obj = Obj, event = #wxSize{}} ->
NewBuffer = init_buffer(Obj),
%wxFrame:refresh(Obj),
main_loop(Frame, NewBuffer, X, Y);
Event ->
io:format("Receive event: ~w~n", [Event]),
main_loop(Frame, Buffer, X, Y)
end.
init_buffer(Frame) ->
{W, H} = wxFrame:getClientSize(Frame),
Buffer = wxBitmap:new(W, H),
draw_to_buffer(Frame, Buffer),
Buffer.
draw_to_buffer(Frame, Buffer) ->
DC = wxBufferedDC:new(wxClientDC:new(Frame), [{buffer, Buffer}]),
wxDC:setBackground(DC, ?wxWHITE_BRUSH),
wxDC:clear(DC),
wxDC:drawText(DC, "Hoge hoge", {10, 10}),
wxDC:drawLine(DC, {10, 10}, {200, 10}),
{W, H} = wxDC:getSize(DC),
wxDC:setPen(DC, wxPen:new(?wxBLUE, [{width, 3}])),
wxDC:drawCircle(DC, {W div 2, H div 2}, 50),
wxBufferedDC:destroy(DC).
%% this sample is from https://arifishaq.files.wordpress.com/2017/12/wxerlang-getting-started.pdf
-module(countdown_gui).
-export([start/0]).
-export([handle_click/2, update_gui/3]).
-include_lib("wx/include/wx.hrl").
start() ->
wx:new(),
Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Countdown"),
%% build and layout the GUI components
Label = wxStaticText:new(Frame, ?wxID_ANY, "Seconds remaining"),
Counter = wxTextCtrl:new(Frame, ?wxID_ANY, [{value, "42"}, {size, {150, 50}}]),
Font = wxFont:new(42, ?wxFONTFAMILY_DEFAULT, ?wxFONTSTYLE_NORMAL, ?wxFONTWEIGHT_BOLD),
wxTextCtrl:setFont(Counter, Font),
Button = wxButton:new(Frame, ?wxID_ANY, [{label, "Start"}, {pos, {0, 64}}, {size, {150, 50}}]),
MainSizer = wxBoxSizer:new(?wxVERTICAL),
wxSizer:add(MainSizer, Label, [{flag, ?wxALL bor ?wxALIGN_CENTER}, {border, 5}]),
wxSizer:add(MainSizer, Counter, [{flag, ?wxEXPAND bor ?wxALL}, {border, 5}]),
wxSizer:add(MainSizer, Button, [{flag, ?wxEXPAND bor ?wxALIGN_BOTTOM}, {border, 5}]),
wxWindow:setSizer(Frame, MainSizer),
wxSizer:setSizeHints(MainSizer, Frame),
wxButton:connect(Button, command_button_clicked, [{callback, fun handle_click/2}, {userData, #{counter => Counter, env => wx:get_env()}}]),
wxFrame:show(Frame).
handle_click(#wx{obj = Button, userData = #{counter := Counter, env := Env}},
_Event) ->
wx:set_env(Env),
Label = wxButton:getLabel(Button),
case list_to_integer(wxTextCtrl:getValue(Counter)) of
0 when Label =:= "Start" ->
ok;
_ when Label =:= "Start" ->
wxTextCtrl:setEditable(Counter, false),
wxButton:setLabel(Button, "Stop"),
timer:apply_after(1000, ?MODULE, update_gui, [Counter, Button, Env]);
_ when Label =:= "Stop" ->
wxTextCtrl:setEditable(Counter, true),
wxButton:setLabel(Button, "Start")
end.
update_gui(Counter, Button, Env) ->
wx:set_env(Env),
case wxButton:getLabel(Button) of
"Stop" ->
Value = wxTextCtrl:getValue(Counter),
case list_to_integer(Value) of
1 ->
wxTextCtrl:setValue(Counter, "0"),
wxTextCtrl:setEditable(Counter, true),
wxButton:setLabel(Button, "Start");
N ->
wxTextCtrl:setValue(Counter, integer_to_list(N - 1)),
timer:apply_after(1000, ?MODULE, update_gui, [Counter, Button, Env])
end;
"Start" ->
ok
end.
-module(draw_rect).
-export([start/0]).
-include_lib("wx/include/wx.hrl").
start() ->
wx:new(),
Frame = wxFrame:new(wx:null(), ?wxID_ANY, "draw rect"),
Panel = wxPanel:new(Frame, [{size, {300, 300}}]),
wxPanel:connect(Panel, paint, [{callback, fun on_paint/2}]),
wxFrame:show(Frame).
on_paint(#wx{obj = Panel}, _Event) ->
DC = wxPaintDC:new(Panel),
Pen = wxPen:new({0, 255, 0}),
wxPaintDC:setPen(DC, Pen),
Brush = wxBrush:new({0, 255, 0}),
wxPaintDC:setBrush(DC, Brush),
wxPaintDC:drawRectangle(DC, {100, 100, 100, 100}).
-module(key_loop).
-export([start/0]).
-include_lib("wx/include/wx.hrl").
start() ->
wx:new(),
Frame = wxFrame:new(wx:null(), ?wxID_ANY, "draw rect"),
Panel = wxPanel:new(Frame, [{size, {300, 300}}]),
wxFrame:connect(Frame, close_window),
wxPanel:connect(Panel, paint),
wxFrame:show(Frame),
main_loop(Frame, Panel, 0, 100),
wx:destroy(),
ok.
main_loop(Frame, Panel, X, Y) ->
receive
#wx{event = #wxClose{}} ->
wxWindow:destroy(Frame);
#wx{obj = Obj, event = #wxPaint{}} ->
draw_rect(Obj, X, Y),
main_loop(Frame, Panel, X, Y);
Event ->
io:format("Receive event: ~w~n", [Event]),
main_loop(Frame, Panel, X, Y)
after
50 ->
Jpressed = wx_misc:getKeyState($J),
Kpressed = wx_misc:getKeyState($K),
NextY = if
Jpressed -> Y + 10;
Kpressed -> Y - 10;
true -> Y
end,
draw_rect(Panel, X, NextY),
main_loop(Frame, Panel, (X + 10) rem 300, NextY)
end.
draw_rect(Panel, X, Y) ->
DC = wxClientDC:new(Panel),
wxDC:clear(DC),
Pen = wxPen:new({0, 255, 0}),
wxDC:setPen(DC, Pen),
Brush = wxBrush:new({0, 255, 0}),
wxDC:setBrush(DC, Brush),
wxDC:drawRectangle(DC, {X, Y, 16, 16}),
wxClientDC:destroy(DC).
% This program is ported from python sample in https://bty.sakura.ne.jp/wp/archives/42.
% This program uses Japanese characters.
-module(listctrl).
-export([start/0]).
-include_lib("wx/include/wx.hrl").
start() ->
Captions = ["都道府県", "男女計", "男", "女"],
Data = [
["北海道", "5570", "2638", "2933"],
["青森県", "1,407", "663", "744"],
["岩手県", "1,364", "652", "712"],
["宮城県", "2,347", "1,140", "1,208"],
["秋田県", "1,121", "527", "593"],
["山形県", "1,198", "575", "623"],
["福島県", "2,067", "1,004", "1,063"],
["茨城県", "2,969", "1,477", "1,492"],
["栃木県", "2,014", "1,001", "1,013"],
["群馬県", "2,016", "993", "1,024"],
["埼玉県", "7,090", "3,570", "3,520"],
["千葉県", "6,098", "3,047", "3,051"],
["東京都", "12,758", "6,354", "6,405"],
["神奈川県", "8,880", "4,484", "4,396"]
],
wx:new(),
Frame = wxFrame:new(wx:null(), ?wxID_ANY, "ListCtrl test"),
ListCtrl = wxListCtrl:new(Frame, [{style, ?wxLC_REPORT}]),
listctrl_add_Captions(ListCtrl, Captions),
listctrl_set_data(ListCtrl, Data),
wxFrame:show(Frame),
ok.
listctrl_add_Captions(ListCtrl, Captions) ->
lists:foldl(
fun(Caption, Column) ->
wxListCtrl:insertColumn(ListCtrl, Column, Caption),
Column + 1
end,
0,
Captions
).
listctrl_set_data(ListCtrl, Data) ->
lists:foldl(
fun(Datum, Row) ->
wxListCtrl:insertItem(ListCtrl, Row, hd(Datum)),
lists:foldl(
fun(Num, Column) ->
wxListCtrl:setItem(ListCtrl, Row, Column, Num),
Column + 1
end,
1,
tl(Datum)
),
Row + 1
end,
0,
Data
).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment