File Coverage

blib/lib/Chess/GameClock/GclkDisplay.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             ####-----------------------------------
2             ### File : GclkDisplay.pm
3             ### Author : Ch.Minc
4             ### Purpose : Display counters for GameClock
5             ### Version : 1.1 2007/12/23
6             ####-----------------------------------
7              
8             package GclkDisplay ;
9              
10             our $VERSION = '1.1' ;
11              
12             require Exporter ;
13 1     1   2828 use strict ;
  1         3  
  1         35  
14 1     1   8 use warnings ;
  1         2  
  1         31  
15              
16 1     1   367 use Tk ;
  0            
  0            
17             use Time::HiRes qw(gettimeofday tv_interval);
18             use Chess::GameClock::GclkData qw (:tout) ;
19              
20             our @ISA=qw(Exporter) ;
21              
22             our @EXPORT_OK=qw (&display hmnsec loupe) ;
23              
24             my $varset ;
25             my %sous_menuref ;
26             my %soussous_ref ;
27             my %rb ;
28             my $aff ;
29             my @setaff=(qw/Blitz RapidesTournois/) ;
30             push(@setaff,$aff=shift(@setaff)) ;
31              
32             my $whites ; #our
33             my $blacks ;
34             my $mw ;
35             my $screensz ;
36              
37             sub display {
38             ($whites,$blacks,$screensz)=@_ ;
39              
40             # window where the timestamps of the game are written by GclkCounter
41             my $mwt=MainWindow->new(-title=>"LogTime") ;
42             my $spytext = $mwt->Text(qw/-width 120 -height 30/)->pack;
43             $mwt->iconify ;
44             tie *STDOUT, ref $spytext, $spytext;
45              
46              
47             # draw the clock windows
48             $mw=MainWindow->new(-title=>'Perl Chess Clock') ;
49              
50             my ($l,$v1,$v2)=&loupe($screensz) ;
51              
52              
53             my $fr=$mw->Frame->pack ;
54             my %option_mv=(qw/-height 1 -width 3 -anchor center / ) ;
55             # my $wmv='W' ;
56             # my $bmv='B' ;
57             my $white_mv=$fr->Button(# -textvariable=>\$whites->[0]{mvt}, x
58             -foreground=>'yellow',
59             -font=>' Arial 24 bold',
60             -activeforeground=>'yellow'
61             )->pack(-side=>'left') ;
62             my $black_mv=$fr->Button( #-textvariable=>\$blacks->[0]{mvt},
63             -font=>' Arial 24 bold',
64             -activeforeground=>'black',
65             )->pack(-side=>'left') ;
66             # $white_mv->configure(%option_mv) ; x
67             $white_mv->configure(-textvariable=>\$whites->[0]{mvt},%option_mv) ; # modif x
68             $black_mv->configure(-textvariable=>\$blacks->[0]{mvt},%option_mv) ;
69              
70              
71             my $cn1=$mw->Canvas(-height=>'15c',-width=>'30c')->pack ;
72             ;
73             my $txt1=$cn1->createText($l,$v1,
74             -text=>'00:00:00',
75             -font=>'Helvetica 200 bold',
76             -fill=>'yellow',
77             -justify=>'right',
78             -activefill=>'yellow',
79             -tags=>['txt1','box','r1']
80             ) ;
81              
82             my $txt2=$cn1->createText($l,$v2,-text=>'00:00:00',
83             -font=>'Helvetica 200 bold',
84             -fill=>'black',
85             -justify=>'right',
86             -activefill=>'black',
87             -tags=>['txt2','box','r2']
88             ) ;
89              
90              
91             my $rect1=$cn1->createRectangle('0.5c','1c','29c','7c',-width=>'0.3c',-outline=>'white',-tags=>['rect1', 'box', 'r1']) ;
92             my $rect2=$cn1->createRectangle('0.5c','7.5c','29c','14c',-width=>'0.3c',-outline=>'black',-tags=>['rect2', 'box' ,'r2']) ;
93              
94             my $fm=$mw->Frame() ;
95             $fm->pack(-side=>'bottom'
96             ) ;
97              
98             my $start=$fm->Button(-text=>'Start') ;
99             # -command=>['start',$whites,$whites,$blacks,$mw,$black_mv]);
100             my $stop=$fm->Button(-text=>'Halt') ;
101             my $quit=$fm->Button(-text=>"Quit") ;
102             # -command=>\&Tk::exit) ;
103              
104             my %cmd_opt=(qw/-anchor center -width 20 -height 4/);
105             $start->configure(%cmd_opt) ;
106             $stop->configure(%cmd_opt) ;
107             $quit->configure(%cmd_opt) ;
108             $start->pack(-side=>'left') ;
109             $stop->pack(-side=>'left') ;
110             $quit->pack(-side=>'left') ;
111              
112             # cancel mouse bindings for Button mv and set Alt-c keyboard command
113              
114             $white_mv->bindtags(['TrickyButton',$white_mv->toplevel,'all']) ;
115             $black_mv->bindtags(['TrickyButton',$black_mv->toplevel,'all']) ;
116             $mw->bind('<>'=>[\&cnttype,'w']) ;
117             $mw->eventAdd('<>'=>'') ;
118              
119             # cancel mouse bindings for Button $stop $start $quit
120             $stop->bindtags(['TrickyButton',$stop->toplevel,'all']) ;
121             $mw->bind('<>'=>['GclkCounter::stop',$stop,$whites,$blacks]) ;
122             $mw->eventAdd('<>'=>"") ;
123            
124             $start->bindtags(['TrickyButton',$start->toplevel,'all']) ;
125             $mw->bind('<>'=>['GclkCounter::start',
126             $whites,$blacks,$mw,$white_mv,$black_mv]);
127             $mw->eventAdd('<>'=>"") ;
128              
129             $quit->bindtags(['TrickyButton',$quit->toplevel,'all']) ;
130             $mw->bind('<>'=>sub{&Tk::exit(0)} ) ;
131             $mw->eventAdd('<>'=>"") ;
132              
133             # bind keyboard to toggle counters
134             map{$mw->bind("",['GclkCounter::capture', 'B1-',$whites,$blacks])}(qw/a z e r t y q s d f g < w x c v b/) ;
135             map{$mw->bind("",['GclkCounter::capture', 'B3-',$whites,$blacks])}(qw/u i o p Multi_key $ j k l m ugrave * n comma ; : \/ ! /) ;
136              
137             # force the focus on window Chess Clock
138             $mw->focusForce ;
139              
140              
141             $mw->repeat(1000=>sub {
142             {
143             #my $wmv=$whites->[0]{mv} ;
144             # my $bmv=$blacks->[0]{mv} ;
145             # $fr->update ;
146             my $elapsed =($whites->[0]{state} eq 'On')? tv_interval ($whites->[0]{ts}):0 ;
147             #print $whites->[0]{state} ;
148             my $td=$whites->[0]{ct} ;
149             my $tj=$whites->[0]{cmpt} ;
150             $td -=$elapsed ;
151             $tj +=$elapsed ;
152             $cn1->dchars($txt1,0,7) ;
153             my $taff= $aff=~ /Blitz/ ? $td : $tj ;
154             my $str1=sprintf("%02d:%02d:%02d",&hmnsec($taff)) ;
155             $cn1->insert($txt1,1,$str1) ;
156             }
157             ;
158             # affichage suivant la cadence Blitz-Fisher-Bronstein temps restant
159             # KO temps écoulé/temps restant
160             {
161             my $elapsed =($blacks->[0]{state} eq 'On')? tv_interval ($blacks->[0]{ts}):0 ;
162             my $td=$blacks->[0]{ct} ;
163             my $tj=$blacks->[0]{cmpt} ;
164             $td -=$elapsed ;
165             $tj +=$elapsed ;
166             $cn1->dchars($txt2,0,7) ;
167             my $taff= $aff=~ /Blitz/ ? $td : $tj ;
168             my $str2=sprintf("%02d:%02d:%02d",&hmnsec($taff) ) ;
169             $cn1->insert($txt2,1,$str2) ;
170             }
171             ;
172             #$mw->update ;
173             } ) ;
174              
175             }
176              
177             sub loupe{
178             my $x=shift ;
179             $mw->scaling($x) ;
180             my $scale=0.76*$x ;
181             my($l,$v1,$v2)=('550','150','400') ;
182             $l *=$scale ;
183             $v1 *=$scale ;
184             $v2 *=$scale ;
185             return($l,$v1,$v2) ;
186             }
187              
188             sub cnttype{
189             # change counter aspect up or down
190             push(@setaff,$aff=shift(@setaff)) ;
191             }
192              
193              
194              
195             sub hmnsec{
196             # convert time in sec to hh:mm:ss
197             my $sec=shift ;
198             if ($sec < 0 || !defined($sec) ) {
199             return(0,0,0);
200             }
201             my $h=int($sec / 3600) ;
202             my $mn=int(($sec% 3600)/60) ;
203             my $s=$sec%60 ;
204             return ($h,$mn,$s) ;
205             }
206              
207             =head1 NAME
208              
209             GclkDisplay - Display the counters
210              
211             =head1 VERSION
212              
213             Version 1.1
214              
215             =cut
216              
217             =head1 SYNOPSIS
218              
219             Draw the Chess Counter Window
220              
221             use GclkDisplay;
222              
223             &display($whites,$blacks,$scaling)
224              
225             where $whites and $blacks are GclkCounter object and $scaling a scalar
226             for changing the size of the window displayed.
227              
228             =head1 EXPORT
229              
230             display
231              
232             =head1 FUNCTIONS
233              
234             =head2 display
235              
236             see SYNOPSIS
237              
238             =cut
239              
240             =head2 cnttype
241              
242             an internal routine for toggling counters time
243             between time elased and time remaining.
244              
245             Global parameters
246              
247             =cut
248              
249              
250             =head2 hmnsec
251              
252             convert time in sec to hh:mm:ss format
253              
254             my($h,$mn,$s)=hmnsec(time_in_seconds) ;
255              
256             =head2 loupe
257              
258             adjust the parameters for the window size.
259              
260             my ($l,$v1,$v2)=&loupe($scaling) ;
261              
262             where $scaling is between 0.5 and 2.0
263              
264             (Note:This function is perhaps screen type/graphics board
265             dependant, in case of malfunction).
266              
267             =head1 AUTHOR
268              
269             Charles Minc, C<< >>
270              
271             =head1 BUGS
272              
273             Please report any bugs or feature requests to
274             C, or through the web interface at
275             L.
276             I will be notified, and then you'll automatically be notified of progress on
277             your bug as I make changes.
278              
279             =head1 SUPPORT
280              
281             You can find documentation for this module with the perldoc command.
282              
283             perldoc GameClock
284              
285             You can also look for information at:
286              
287             =over 4
288              
289             =item * AnnoCPAN: Annotated CPAN documentation
290              
291             L
292              
293             =item * CPAN Ratings
294              
295             L
296              
297             =item * RT: CPAN's request tracker
298              
299             L
300              
301             =item * Search CPAN
302              
303             L
304              
305             =back
306              
307             =head1 ACKNOWLEDGEMENTS
308              
309             =head1 COPYRIGHT & LICENSE
310              
311             Copyright 2006 Charles Minc, all rights reserved.
312              
313             This program is free software; you can redistribute it and/or modify it
314             under the same terms as Perl itself.
315              
316             =cut
317              
318             1; # End of GclkDisplay