aboutsummaryrefslogtreecommitdiffstats
path: root/lib/wx/examples/demo/ex_gauge.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/wx/examples/demo/ex_gauge.erl')
-rw-r--r--lib/wx/examples/demo/ex_gauge.erl208
1 files changed, 208 insertions, 0 deletions
diff --git a/lib/wx/examples/demo/ex_gauge.erl b/lib/wx/examples/demo/ex_gauge.erl
new file mode 100644
index 0000000000..d30c3fea58
--- /dev/null
+++ b/lib/wx/examples/demo/ex_gauge.erl
@@ -0,0 +1,208 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 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%
+
+-module(ex_gauge).
+
+-behaviour(wx_object).
+
+-include_lib("wx/include/wx.hrl").
+
+-export([start/1, init/1, terminate/2, code_change/3,
+ handle_info/2, handle_call/3, handle_event/2]).
+
+-record(gauge, {obj,
+ value,
+ timer,
+ range
+ }).
+
+-record(state,
+ {
+ parent,
+ config,
+ normal_gauge,
+ undeterminate_gauge,
+ simulate_button,
+ simulate_undet_button
+ }).
+
+-define(ID_START_STOP, 1).
+-define(ID_START_STOP_UNDET, 2).
+-define(SET_VALUE, 3).
+-define(VERTICAL, 4).
+
+start(Config) ->
+ wx_object:start_link(?MODULE, Config, []).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+init(Config) ->
+ wx:batch(fun() -> do_init(Config) end).
+do_init(Config) ->
+ Parent = proplists:get_value(parent, Config),
+ Panel = wxPanel:new(Parent, []),
+
+ %% Setup sizers
+ MainSizer = wxBoxSizer:new(?wxVERTICAL),
+ AlignSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
+ [{label, "wxGauge"}]),
+
+ %% Create two horizontal gauges with range 0-100
+ Range = 100,
+ NormalGauge = wxGauge:new(Panel, 1, Range, [{size, {200, -1}},
+ {style, ?wxGA_HORIZONTAL}]),
+ UndetGauge = wxGauge:new(Panel, 2, Range, [{size, {200, -1}},
+ {style, ?wxGA_HORIZONTAL}]),
+
+ %% Add to sizers
+ wxSizer:add(AlignSizer, NormalGauge, [{flag, ?wxEXPAND}]),
+ wxSizer:add(AlignSizer, UndetGauge, [{flag, ?wxEXPAND}]),
+ {OptSizer, SimulateButton, SimulateUndetermButton}
+ = create_option_sizer(Panel),
+
+ wxSizer:add(MainSizer, AlignSizer, [{flag, ?wxEXPAND}]),
+ wxSizer:add(MainSizer, OptSizer, []),
+
+ wxWindow:connect(Panel, command_togglebutton_clicked),
+ wxWindow:connect(Panel, command_button_clicked),
+
+ wxPanel:setSizer(Panel, MainSizer),
+ {Panel, #state{parent=Panel, config=Config,
+ normal_gauge = #gauge{obj=NormalGauge, value = 0,
+ range = Range},
+ undeterminate_gauge = #gauge{obj=UndetGauge, value = 0,
+ range = Range},
+ simulate_button = SimulateButton,
+ simulate_undet_button = SimulateUndetermButton}}.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Callbacks handled as normal gen_server callbacks
+handle_info(tick, State=#state{normal_gauge = Gauge=#gauge{obj = Obj,
+ value = Value,
+ timer = Timer,
+ range = Range},
+ simulate_button = Button}) ->
+ Timer2 =
+ if Value >= Range ->
+ wxToggleButton:setValue(Button, false),
+ wxToggleButton:setLabel(Button, "Simulate load"),
+ wxGauge:setValue(Obj, Range),
+ demo:format(State#state.config, "Simulation finished.\n", []),
+ Timer;
+ true ->
+ simulate_load(Obj, Value)
+
+ end,
+ {noreply, State#state{normal_gauge = Gauge#gauge{value = Value+5,
+ timer = Timer2}}};
+handle_info(pulse, State=#state{undeterminate_gauge = Gauge=#gauge{obj = Obj}}) ->
+ wxGauge:pulse(Obj),
+ Timer = erlang:send_after(300, self(), pulse),
+ {noreply, State#state{undeterminate_gauge = Gauge#gauge{timer = Timer}}}.
+
+handle_call(Msg, _From, State) ->
+ demo:format(State#state.config,"Got Call ~p\n",[Msg]),
+ {reply,ok, State}.
+
+%% Async Events are handled in handle_event as in handle_info
+handle_event(#wx{id = ?ID_START_STOP,
+ event = #wxCommand{type = command_togglebutton_clicked,
+ commandInt = Int}},
+ State = #state{normal_gauge = #gauge{obj=Gauge,
+ value = Value,
+ timer = Timer},
+ simulate_button = Button}) ->
+ case Int of
+ 1 ->
+ wxToggleButton:setLabel(Button, "Stop simulation"),
+ simulate_load(Gauge, Value);
+ 0 ->
+ erlang:cancel_timer(Timer),
+ wxToggleButton:setLabel(Button, "Simulate load"),
+ ok
+ end,
+ {noreply, State};
+handle_event(#wx{id = ?ID_START_STOP_UNDET,
+ event = #wxCommand{type = command_togglebutton_clicked,
+ commandInt = Int}},
+ State = #state{undeterminate_gauge = G = #gauge{obj=Gauge,
+ timer = Timer},
+ simulate_undet_button = Button}) ->
+ Timer2 =
+ case Int of
+ 1 ->
+ wxToggleButton:setLabel(Button, "Stop simulation"),
+ wxGauge:pulse(Gauge),
+ erlang:send_after(300, self(), pulse);
+ 0 ->
+ wxToggleButton:setLabel(Button, "Simulate undeterminate load"),
+ reset(G),
+ undefined
+ end,
+ case Timer of
+ undefined -> ok;
+ _ -> erlang:cancel_timer(Timer)
+ end,
+ {noreply, State#state{undeterminate_gauge = G#gauge{timer = Timer2}}};
+handle_event(#wx{id = ?wxID_CLEAR,
+ event = #wxCommand{type = command_button_clicked}},
+ State = #state{normal_gauge = Gauge,
+ undeterminate_gauge = Gauge2}) ->
+ reset(Gauge),
+ reset(Gauge2),
+ {noreply, State#state{normal_gauge = Gauge#gauge{value = 0}}};
+handle_event(Ev = #wx{}, State = #state{}) ->
+ demo:format(State#state.config,"Got Event ~p\n",[Ev]),
+ {noreply, State}.
+
+code_change(_, _, State) ->
+ {stop, ignore, State}.
+
+terminate(_Reason, _State) ->
+ ok.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Local functions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+simulate_load(Gauge, Value) ->
+ wxGauge:setValue(Gauge, Value),
+ erlang:send_after(300, self(), tick).
+
+reset(#gauge{obj = Gauge}) ->
+ wxGauge:setValue(Gauge, 0).
+
+
+create_option_sizer(Panel) ->
+ OptSizer = wxStaticBoxSizer:new(?wxVERTICAL, Panel,
+ [{label, "Options"}]),
+
+ SimulateButton = wxToggleButton:new(Panel, ?ID_START_STOP, "Simulate load",
+ [{size, {200, 35}}]),
+ SimulateUndetermButton = wxToggleButton:new(Panel, ?ID_START_STOP_UNDET,
+ "Simulate Undeterminate load",
+ [{size, {200, 35}}]),
+ ClearButton = wxButton:new(Panel, ?wxID_CLEAR,
+ [{size, {200, 35}}]),
+
+ wxSizer:add(OptSizer, SimulateButton),
+ wxSizer:add(OptSizer, SimulateUndetermButton),
+ wxSizer:add(OptSizer, ClearButton),
+
+ wxWindow:connect(Panel, command_checkbox_clicked),
+
+ {OptSizer, SimulateButton, SimulateUndetermButton}.