aboutsummaryrefslogtreecommitdiffstats
path: root/lib/gs/examples/calc2.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gs/examples/calc2.erl')
-rw-r--r--lib/gs/examples/calc2.erl96
1 files changed, 96 insertions, 0 deletions
diff --git a/lib/gs/examples/calc2.erl b/lib/gs/examples/calc2.erl
new file mode 100644
index 0000000000..d28780de01
--- /dev/null
+++ b/lib/gs/examples/calc2.erl
@@ -0,0 +1,96 @@
+%%
+%% %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
+%% Describes how to match against the data field.
+%% ------------------------------------------------------------
+
+-module(calc2).
+-export([start/0,calc/0]).
+
+start() ->
+ spawn(calc2,calc,[]).
+
+calc() ->
+ I = gs:start(),
+ Win = gs:window(I,[{title,"Calc2"},{width,120},{height,150}]),
+ Lbl = gs:label(Win,[{label,{text,"0"}},{width,120}]),
+ gs:button(Win,[{label,{text,"1"}},{width,30},{x,0},{y,30},{data,1}]),
+ gs:button(Win,[{label,{text,"2"}},{width,30},{x,30},{y,30},{data,2}]),
+ gs:button(Win,[{label,{text,"3"}},{width,30},{x,60},{y,30},{data,3}]),
+ gs:button(Win,[{label,{text,"4"}},{width,30},{x,0},{y,60},{data,4}]),
+ gs:button(Win,[{label,{text,"5"}},{width,30},{x,30},{y,60},{data,5}]),
+ gs:button(Win,[{label,{text,"6"}},{width,30},{x,60},{y,60},{data,6}]),
+ gs:button(Win,[{label,{text,"7"}},{width,30},{x,0},{y,90},{data,7}]),
+ gs:button(Win,[{label,{text,"8"}},{width,30},{x,30},{y,90},{data,8}]),
+ gs:button(Win,[{label,{text,"9"}},{width,30},{x,60},{y,90},{data,9}]),
+ gs:button(Win,[{label,{text,"0"}},{width,60},{x,0},{y,120},{data,0}]),
+ gs:button(Win,[{label,{text,"C"}},{width,30},{x,60},{y,120},{data,'C'}]),
+ gs:button(Win,[{label,{text,"AC"}},{width,30},{x,90},{y,120},{data,'AC'},
+ {fg,red}]),
+ gs:button(Win,[{label,{text,"+"}},{width,30},{x,90},{y,30},{data,'+'}]),
+ gs:button(Win,[{label,{text,"*"}},{width,30},{x,90},{y,60},{data,'*'}]),
+ gs:button(Win,[{label,{text,"-"}},{width,30},{x,90},{y,90},{data,'-'}]),
+ gs:config(Win,{map,true}),
+ calc_loop(Lbl,0,0,'+').
+
+calc_loop(Lbl,M,V,Op) ->
+ receive
+ {gs,_,click,D,_} when integer(D) ->
+ digit_press(Lbl,M,V*10+D,Op);
+ {gs,_,click,'C',_} ->
+ c(Lbl,M,V,Op);
+ {gs,_,click,'AC',_} ->
+ ac(Lbl,M,V,Op);
+ {gs,_,click,NewOp,_} ->
+ calc(Lbl,Op,M,V,NewOp);
+ {gs,_,destroy,_,_} ->
+ exit(normal);
+ _Other ->
+ calc_loop(Lbl,M,V,Op)
+ end.
+
+digit_press(Lbl,M,V,Op) ->
+ gs:config(Lbl,[{label,{text,V}}]),
+ calc_loop(Lbl,M,V,Op).
+
+calc(Lbl,'+',M,V,Op) ->
+ NewM = M + V,
+ gs:config(Lbl,[{label,{text,NewM}}]),
+ calc_loop(Lbl,NewM,0,Op);
+calc(Lbl,'-',M,V,Op) ->
+ NewM = M - V,
+ gs:config(Lbl,[{label,{text,NewM}}]),
+ calc_loop(Lbl,NewM,0,Op);
+calc(Lbl,'*',M,V,Op) ->
+ NewM = M * V,
+ gs:config(Lbl,[{label,{text,NewM}}]),
+ calc_loop(Lbl,NewM,0,Op).
+
+c(Lbl,M,_V,Op) ->
+ gs:config(Lbl,[{label,{text,0}}]),
+ calc_loop(Lbl,M,0,Op).
+
+ac(Lbl,_M,_V,_Op) ->
+ gs:config(Lbl,[{label,{text,0}}]),
+ calc_loop(Lbl,0,0,'+').
+
+%% ------------------------------------------------------------