package MTools::MTimer; # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU LGPL Libray General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU Library General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA, # or refer to http://www.gnu.org/copyleft/lgpl.html # ################################################################## # Le composant MTimer encapsule la d?claration et l'utilisation d'un timer. # Les param?tres : # * $timeout : repr?sente timeout en ms du timer (totologique ? non...) # * $repeat : active ou non le caract?re r?p?titif du timer (valeur 0 ou 1) # * $callback : est optionnel et permet d'appeler une callback au timeout. # Les ?v?nements : # * TIME_OUT : ?mis au timeout en plus de l'appel ? une ?ventuelle callback # * TIMER_STOPPED : ?mis si le timer est interrompu avant un timeout # Les propi?t?s : # * timeout : ... # * repeat : ... # * callback : ... # * -visible : d?finie pour assurer la compatibilit? avec les autres objets MTools. # Si la valeur est 0 le composant est d?sactiv? (appel ? la fonction stop), # si la valeur est 1 (appel ? la fonction start), le composant est activ?. # Cette propri?t? permet notamment d'activer un timer dans un ?tat d'un MSwitch. # Les fonctions public : # * start permet de d?marrer le timer # * stop permet de stopper le timer # Nota : cf. ci-dessus, ces fonctions peuvent ?tre contr?l?es par la propri?t? -visible use strict; use MTools; use MTools::MObjet; use vars qw /@ISA/; BEGIN { @ISA = qw /MTools::MObjet/; } use Tk; sub new { my ($class, $timeout, $repeat, $callback, %options) = @_; my $self = {}; bless $self, $class; $repeat = 0 if !defined $repeat; $repeat = 0 if !defined $callback; $self -> recordEvent ('TIME_OUT'); $self -> recordEvent ('TIMER_STOPPED'); $self -> recordProperty ('timeout', $timeout); $self -> recordProperty ('repeat', $repeat); $self -> recordProperty ('callback', $callback); $self -> recordProperty ('-visible', 0); $self -> plisten ('-visible', sub { my ($src, $key, $val) = @_; if ($val == 0) { $self -> stop (); } else { $self -> start (); } }); $self -> mconfigure (%options); return $self; } sub start { my ($self) = @_; my $repeat = $self -> mget ('repeat'); my $timeout = $self -> mget ('timeout'); my $callback = $self -> mget ('callback'); my $function = $repeat ? 'repeat' : 'after'; $self -> {__timer} = $zinc -> $function ($timeout, sub { $self -> notify ('TIME_OUT'); if ($callback) { executer ($callback); } }); } sub stop { my ($self) = @_; $zinc -> afterCancel ($self -> {__timer}); $self -> notify ('TIMER_STOPPED'); } 1;