aboutsummaryrefslogtreecommitdiffstats
path: root/lib/gs/examples/calc.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/gs/examples/calc.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/gs/examples/calc.erl')
-rw-r--r--lib/gs/examples/calc.erl108
1 files changed, 108 insertions, 0 deletions
diff --git a/lib/gs/examples/calc.erl b/lib/gs/examples/calc.erl
new file mode 100644
index 0000000000..992b8adb4e
--- /dev/null
+++ b/lib/gs/examples/calc.erl
@@ -0,0 +1,108 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%%
+%% ------------------------------------------------------------
+%% A Simple Calculator demo in Erlang
+%% ------------------------------------------------------------
+
+-module(calc).
+
+-export([start/0,calc/0]).
+
+start() ->
+ spawn(calc,calc,[]).
+
+calc() ->
+ I = gs:start(),
+ Win = gs:window(I,[{title,"Calc1"},{width,120},{height,150}]),
+ Label = gs:label(Win,[{label,{text,"0"}},{width,120}]),
+ B1 = gs:button(Win,[{label,{text,"1"}},{width,30},{x,0},{y,30}]),
+ B2 = gs:button(Win,[{label,{text,"2"}},{width,30},{x,30},{y,30}]),
+ B3 = gs:button(Win,[{label,{text,"3"}},{width,30},{x,60},{y,30}]),
+ B4 = gs:button(Win,[{label,{text,"4"}},{width,30},{x,0},{y,60}]),
+ B5 = gs:button(Win,[{label,{text,"5"}},{width,30},{x,30},{y,60}]),
+ B6 = gs:button(Win,[{label,{text,"6"}},{width,30},{x,60},{y,60}]),
+ B7 = gs:button(Win,[{label,{text,"7"}},{width,30},{x,0},{y,90}]),
+ B8 = gs:button(Win,[{label,{text,"8"}},{width,30},{x,30},{y,90}]),
+ B9 = gs:button(Win,[{label,{text,"9"}},{width,30},{x,60},{y,90}]),
+ B0 = gs:button(Win,[{label,{text,"0"}},{width,60},{x,0},{y,120}]),
+ C = gs:button(Win,[{label,{text,"C"}},{width,30},{x,60},{y,120}]),
+ AC = gs:button(Win,[{label,{text,"AC"}},{width,30},{x,90},{y,120},{fg,red}]),
+ Plus = gs:button(Win,[{label,{text,"+"}},{width,30},{x,90},{y,30}]),
+ Times = gs:button(Win,[{label,{text,"*"}},{width,30},{x,90},{y,60}]),
+ Minus = gs:button(Win,[{label,{text,"-"}},{width,30},{x,90},{y,90}]),
+ gs:config(Win,{map,true}),
+ Ids = [Label,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,Minus,Plus,Times,C,AC],
+ calc_loop(Ids,0,0,'+').
+
+calc_loop(Ids,M,V,Op) ->
+ [_Label,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,Minus,Plus,Times,C,AC] = Ids,
+ receive
+ {gs,B0,click,_,_} -> digit_press(Ids,M,V*10+0,Op);
+ {gs,B1,click,_,_} -> digit_press(Ids,M,V*10+1,Op);
+ {gs,B2,click,_,_} -> digit_press(Ids,M,V*10+2,Op);
+ {gs,B3,click,_,_} -> digit_press(Ids,M,V*10+3,Op);
+ {gs,B4,click,_,_} -> digit_press(Ids,M,V*10+4,Op);
+ {gs,B5,click,_,_} -> digit_press(Ids,M,V*10+5,Op);
+ {gs,B6,click,_,_} -> digit_press(Ids,M,V*10+6,Op);
+ {gs,B7,click,_,_} -> digit_press(Ids,M,V*10+7,Op);
+ {gs,B8,click,_,_} -> digit_press(Ids,M,V*10+8,Op);
+ {gs,B9,click,_,_} -> digit_press(Ids,M,V*10+9,Op);
+ {gs,Minus,click,_,_} -> calc(Ids,Op,M,V,'-');
+ {gs,Plus,click,_,_} -> calc(Ids,Op,M,V,'+');
+ {gs,Times,click,_,_} -> calc(Ids,Op,M,V,'*');
+ {gs,AC,click,_,_} -> ac(Ids,M,V,Op);
+ {gs,C,click,_,_} -> c(Ids,M,V,Op);
+ {gs,_,destroy,_,_} -> exit(normal);
+ _Other -> calc_loop(Ids,M,V,Op)
+ end.
+
+digit_press(Ids,M,V,Op) ->
+ [Label|_]=Ids,
+ gs:config(Label,[{label,{text,V}}]),
+ calc_loop(Ids,M,V,Op).
+
+calc(Ids,'+',M,V,Op) ->
+ NewM = M + V,
+ [Label|_]=Ids,
+ gs:config(Label,[{label,{text,NewM}}]),
+ calc_loop(Ids,NewM,0,Op);
+calc(Ids,'-',M,V,Op) ->
+ NewM = M - V,
+ [Label|_]=Ids,
+ gs:config(Label,[{label,{text,NewM}}]),
+ calc_loop(Ids,NewM,0,Op);
+calc(Ids,'*',M,V,Op) ->
+ NewM = M * V,
+ [Label|_]=Ids,
+ gs:config(Label,[{label,{text,NewM}}]),
+ calc_loop(Ids,NewM,0,Op).
+
+c(Ids,M,_V,Op) ->
+ [Label|_]=Ids,
+ gs:config(Label,[{label,{text,0}}]),
+ calc_loop(Ids,M,0,Op).
+
+ac(Ids,_M,_V,_Op) ->
+ [Label|_]=Ids,
+ gs:config(Label,[{label,{text,0}}]),
+ calc_loop(Ids,0,0,'+').
+
+%% ------------------------------------------------------------