Mercurial > hg > sv-dependency-builds
comparison src/libvorbis-1.3.3/examples/frameview.pl @ 1:05aa0afa9217
Bring in flac, ogg, vorbis
author | Chris Cannam |
---|---|
date | Tue, 19 Mar 2013 17:37:49 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:c7265573341e | 1:05aa0afa9217 |
---|---|
1 #!/usr/bin/perl -w | |
2 use strict; | |
3 use Tk; | |
4 use Tk::Xrm; | |
5 use Tk qw(exit); | |
6 | |
7 my $version="Analyzer 20020429"; | |
8 | |
9 my %bases; | |
10 my $first_file=undef; | |
11 my $last_file=undef; | |
12 my $fileno=0; | |
13 | |
14 my @panel_labels; | |
15 my @panel_ones; | |
16 my @panel_twos; | |
17 my @panel_onevars; | |
18 my @panel_twovars; | |
19 my @panel_keys; | |
20 my $panel_count; | |
21 | |
22 # pop the toplevels | |
23 | |
24 my $toplevel=new MainWindow(-class=>'AnalyzerGraph'); | |
25 my $Xname=$toplevel->Class; | |
26 $toplevel->optionAdd("$Xname.geometry", "800x600",20); | |
27 | |
28 my $geometry=$toplevel->optionGet('geometry',''); | |
29 $geometry=~/^(\d+)x(\d+)/; | |
30 | |
31 $toplevel->configure(-width=>$1); | |
32 $toplevel->configure(-height=>$2); | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 $toplevel->optionAdd("$Xname.background", "#4fc627",20); | |
39 $toplevel->optionAdd("$Xname*highlightBackground", "#80c0d3",20); | |
40 $toplevel->optionAdd("$Xname.Panel.background", "#4fc627",20); | |
41 $toplevel->optionAdd("$Xname.Panel.foreground", "#d0d0d0",20); | |
42 $toplevel->optionAdd("$Xname.Panel.font", | |
43 '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); | |
44 $toplevel->optionAdd("$Xname*Statuslabel.font", | |
45 '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); | |
46 $toplevel->optionAdd("$Xname*Statuslabel.foreground", "#606060"); | |
47 $toplevel->optionAdd("$Xname*Status.font", | |
48 '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); | |
49 | |
50 $toplevel->optionAdd("$Xname*AlertDetail.font", | |
51 '-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*',20); | |
52 | |
53 | |
54 $toplevel->optionAdd("$Xname*background", "#d0d0d0",20); | |
55 $toplevel->optionAdd("$Xname*foreground", '#000000',20); | |
56 | |
57 $toplevel->optionAdd("$Xname*Button*background", "#f0d0b0",20); | |
58 $toplevel->optionAdd("$Xname*Button*foreground", '#000000',20); | |
59 $toplevel->optionAdd("$Xname*Button*borderWidth", '2',20); | |
60 $toplevel->optionAdd("$Xname*Button*relief", 'groove',20); | |
61 $toplevel->optionAdd("$Xname*Button*padY", 1,20); | |
62 | |
63 #$toplevel->optionAdd("$Xname*Scale*background", "#f0d0b0",20); | |
64 $toplevel->optionAdd("$Xname*Scale*foreground", '#000000',20); | |
65 $toplevel->optionAdd("$Xname*Scale*borderWidth", '1',20); | |
66 #$toplevel->optionAdd("$Xname*Scale*relief", 'groove',20); | |
67 $toplevel->optionAdd("$Xname*Scale*padY", 1,20); | |
68 | |
69 $toplevel->optionAdd("$Xname*Checkbutton*background", "#f0d0b0",20); | |
70 $toplevel->optionAdd("$Xname*Checkbutton*foreground", '#000000',20); | |
71 $toplevel->optionAdd("$Xname*Checkbutton*borderWidth", '2',20); | |
72 $toplevel->optionAdd("$Xname*Checkbutton*relief", 'groove',20); | |
73 | |
74 $toplevel->optionAdd("$Xname*activeBackground", "#ffffff",20); | |
75 $toplevel->optionAdd("$Xname*activeForeground", '#0000a0',20); | |
76 $toplevel->optionAdd("$Xname*borderWidth", 0,20); | |
77 $toplevel->optionAdd("$Xname*relief", 'flat',20); | |
78 $toplevel->optionAdd("$Xname*activeBorderWidth", 1,20); | |
79 $toplevel->optionAdd("$Xname*highlightThickness", 0,20); | |
80 $toplevel->optionAdd("$Xname*padX", 2,20); | |
81 $toplevel->optionAdd("$Xname*padY", 2,20); | |
82 $toplevel->optionAdd("$Xname*font", | |
83 '-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*',20); | |
84 $toplevel->optionAdd("$Xname*Entry.font", | |
85 '-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*',20); | |
86 $toplevel->optionAdd("$Xname*Exit.font", | |
87 '-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*',20); | |
88 $toplevel->optionAdd("$Xname*Exit.relief", 'groove',20); | |
89 $toplevel->optionAdd("$Xname*Exit.padX", 1,20); | |
90 $toplevel->optionAdd("$Xname*Exit.padY", 1,20); | |
91 $toplevel->optionAdd("$Xname*Exit.borderWidth", 2,20); | |
92 $toplevel->optionAdd("$Xname*Exit*background", "#a0a0a0",20); | |
93 $toplevel->optionAdd("$Xname*Exit*disabledForeground", "#ffffff",20); | |
94 | |
95 #$toplevel->optionAdd("$Xname*Canvas.background", "#c0c0c0",20); | |
96 | |
97 $toplevel->optionAdd("$Xname*Entry.background", "#ffffff",20); | |
98 $toplevel->optionAdd("$Xname*Entry.disabledForeground", "#c0c0c0",20); | |
99 $toplevel->optionAdd("$Xname*Entry.relief", "sunken",20); | |
100 $toplevel->optionAdd("$Xname*Entry.borderWidth", 1,20); | |
101 | |
102 $toplevel->optionAdd("$Xname*Field.background", "#ffffff",20); | |
103 $toplevel->optionAdd("$Xname*Field.disabledForeground", "#c0c0c0",20); | |
104 $toplevel->optionAdd("$Xname*Field.relief", "flat",20); | |
105 $toplevel->optionAdd("$Xname*Field.borderWidth", 1,20); | |
106 | |
107 $toplevel->optionAdd("$Xname*Label.disabledForeground", "#c0c0c0",20); | |
108 $toplevel->optionAdd("$Xname*Label.borderWidth", 1,20); | |
109 | |
110 $toplevel->configure(-background=>$toplevel->optionGet("background","")); | |
111 | |
112 #$toplevel->resizable(FALSE,FALSE); | |
113 | |
114 my $panel=new MainWindow(-class=>'AnalyzerPanel'); | |
115 my $X2name=$panel->Class; | |
116 | |
117 $panel->optionAdd("$X2name.background", "#353535",20); | |
118 $panel->optionAdd("$X2name*highlightBackground", "#80c0d3",20); | |
119 $panel->optionAdd("$X2name.Panel.background", "#353535",20); | |
120 $panel->optionAdd("$X2name.Panel.foreground", "#4fc627",20); | |
121 $panel->optionAdd("$X2name.Panel.font", | |
122 '-*-helvetica-bold-o-*-*-18-*-*-*-*-*-*-*',20); | |
123 $panel->optionAdd("$X2name*Statuslabel.font", | |
124 '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); | |
125 $panel->optionAdd("$X2name*Statuslabel.foreground", "#4fc627",20); | |
126 $panel->optionAdd("$X2name*Status.font", | |
127 '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); | |
128 | |
129 $panel->optionAdd("$X2name*AlertDetail.font", | |
130 '-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*',20); | |
131 | |
132 | |
133 $panel->optionAdd("$X2name*background", "#d0d0d0",20); | |
134 $panel->optionAdd("$X2name*foreground", '#000000',20); | |
135 | |
136 $panel->optionAdd("$X2name*Button*background", "#f0d0b0",20); | |
137 $panel->optionAdd("$X2name*Button*foreground", '#000000',20); | |
138 $panel->optionAdd("$X2name*Button*borderWidth", '2',20); | |
139 $panel->optionAdd("$X2name*Button*relief", 'groove',20); | |
140 $panel->optionAdd("$X2name*Button*padY", 1,20); | |
141 | |
142 $panel->optionAdd("$X2name*Checkbutton*background", "#f0d0b0",20); | |
143 $panel->optionAdd("$X2name*Checkbutton*foreground", '#000000',20); | |
144 $panel->optionAdd("$X2name*Checkbutton*borderWidth", '2',20); | |
145 #$panel->optionAdd("$X2name*Checkbutton*padX", '0',20); | |
146 #$panel->optionAdd("$X2name*Checkbutton*padY", '0',20); | |
147 #$panel->optionAdd("$X2name*Checkbutton*relief", 'groove',20); | |
148 | |
149 $panel->optionAdd("$X2name*activeBackground", "#ffffff",20); | |
150 $panel->optionAdd("$X2name*activeForeground", '#0000a0',20); | |
151 $panel->optionAdd("$X2name*borderWidth", 0,20); | |
152 $panel->optionAdd("$X2name*relief", 'flat',20); | |
153 $panel->optionAdd("$X2name*activeBorderWidth", 1,20); | |
154 $panel->optionAdd("$X2name*highlightThickness", 0,20); | |
155 $panel->optionAdd("$X2name*padX", 2,20); | |
156 $panel->optionAdd("$X2name*padY", 2,20); | |
157 $panel->optionAdd("$X2name*font", | |
158 '-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*',20); | |
159 $panel->optionAdd("$X2name*Entry.font", | |
160 '-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*',20); | |
161 | |
162 $panel->optionAdd("$X2name*Exit.font", | |
163 '-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*',20); | |
164 $panel->optionAdd("$X2name*Exit.relief", 'groove',20); | |
165 $panel->optionAdd("$X2name*Exit.padX", 1,20); | |
166 $panel->optionAdd("$X2name*Exit.padY", 1,20); | |
167 $panel->optionAdd("$X2name*Exit.borderWidth", 2,20); | |
168 $panel->optionAdd("$X2name*Exit*background", "#a0a0a0",20); | |
169 $panel->optionAdd("$X2name*Exit*disabledForeground", "#ffffff",20); | |
170 | |
171 $panel->optionAdd("$X2name*Entry.background", "#ffffff",20); | |
172 $panel->optionAdd("$X2name*Entry.disabledForeground", "#c0c0c0",20); | |
173 $panel->optionAdd("$X2name*Entry.relief", "sunken",20); | |
174 $panel->optionAdd("$X2name*Entry.borderWidth", 1,20); | |
175 | |
176 $panel->optionAdd("$X2name*Field.background", "#ffffff",20); | |
177 $panel->optionAdd("$X2name*Field.disabledForeground", "#c0c0c0",20); | |
178 $panel->optionAdd("$X2name*Field.relief", "flat",20); | |
179 $panel->optionAdd("$X2name*Field.borderWidth", 1,20); | |
180 | |
181 $panel->optionAdd("$X2name*Label.disabledForeground", "#c0c0c0",20); | |
182 $panel->optionAdd("$X2name*Label.borderWidth", 1,20); | |
183 | |
184 $panel->configure(-background=>$panel->optionGet("background","")); | |
185 | |
186 #$panel->resizable("FALSE","FALSE"); | |
187 | |
188 my $panel_shell=$panel->Label(Name=>"shell",-borderwidth=>1,-relief=>'raised')-> | |
189 place(-x=>10,-y=>36,-relwidth=>1.0,-relheight=>1.0, | |
190 -width=>-20,-height=>-46,-anchor=>'nw'); | |
191 | |
192 my $panel_quit=$panel_shell->Button(-class=>"Exit",-text=>"quit",-command=>[sub{Shutdown()}])-> | |
193 place(-x=>-1,-y=>-1,-relx=>1.0,-rely=>1.0,-anchor=>'se'); | |
194 | |
195 $panel->Label(Name=>"logo text",-class=>"Panel",-text=>$version)-> | |
196 place(-x=>5,-y=>5,-anchor=>'nw'); | |
197 | |
198 | |
199 my $graph_shell=$toplevel->Label(Name=>"shell",-borderwidth=>1,-relief=>'raised')-> | |
200 place(-x=>10,-y=>36,-relwidth=>1.0,-relheight=>1.0, | |
201 -width=>-20,-height=>-46,-anchor=>'nw'); | |
202 | |
203 my $graph_status=$toplevel->Label(Name=>"logo text",-class=>"Panel",-text=>"Starting up")-> | |
204 place(-x=>5,-y=>5,-anchor=>'nw'); | |
205 | |
206 | |
207 my $panely=5; | |
208 my $panel_rescan=$panel_shell->Button(-text=>"rescan",-command=>[sub{scan_directory()}])-> | |
209 place(-x=>-5,-relx=>1.,-y=>$panely,-anchor=>'ne'); | |
210 $panely+=$panel_rescan->reqheight()+6; | |
211 | |
212 | |
213 my$temp=$graph_shell->Button(-text=>"<<", | |
214 -command=>[sub{$fileno-=10;$fileno=$first_file if($fileno<$first_file); | |
215 load_graph();}])-> | |
216 place(-x=>5,-y=>-5,-rely=>1.,-relwidth=>.2,-width=>-5,-anchor=>'sw'); | |
217 $graph_shell->Button(-text=>">>", | |
218 -command=>[sub{$fileno+=10;$fileno=$last_file if($fileno>$last_file); | |
219 load_graph();}])-> | |
220 place(-x=>-5,-y=>-5,-relwidth=>.2,-rely=>1.,-width=>-5,-relx=>1.,-anchor=>'se'); | |
221 $graph_shell->Button(-text=>"<", | |
222 -command=>[sub{$fileno-=1;$fileno=$first_file if($fileno<$first_file); | |
223 load_graph();}])-> | |
224 place(-x=>5,-y=>-5,-relwidth=>.3,-width=>-7,-rely=>1.,-relx=>.2,-anchor=>'sw'); | |
225 $graph_shell->Button(-text=>">", | |
226 -command=>[sub{$fileno+=1;$fileno=$last_file if($fileno>$last_file); | |
227 load_graph();}])-> | |
228 place(-x=>-5,-y=>-5,-relwidth=>.3,-width=>-7,-rely=>1.,-relx=>.8,-anchor=>'se'); | |
229 my$graphy=-10-$temp->reqheight(); | |
230 my$graph_slider=$temp=$graph_shell->Scale(-bigincrement=>1, | |
231 -resolution=>1, | |
232 -showvalue=>'TRUE',-variable=>\$fileno,-orient=>'horizontal')-> | |
233 place(-x=>5,-y=>$graphy,-relwidth=>1.,-rely=>1.,-width=>-10,-anchor=>'sw'); | |
234 $graphy-=$temp->reqheight()+5; | |
235 | |
236 my$onecrop; | |
237 my$twocrop; | |
238 | |
239 my$oneresize=$temp=$graph_shell->Checkbutton(-text=>"rescale",-variable=>\$onecrop, | |
240 -command=>[sub{draw_graph();}])-> | |
241 place(-x=>5,-y=>5,-anchor=>'nw'); | |
242 | |
243 my$one=$graph_shell->Canvas()-> | |
244 place(-relwidth=>1.,-width=>-10,-relheight=>.5,-height=>($graphy/2)-5-$temp->reqheight(), | |
245 -x=>5,-y=>5+$temp->reqheight,-anchor=>'nw'); | |
246 | |
247 | |
248 my$tworesize=$temp=$graph_shell->Checkbutton(-text=>"rescale",-variable=>\$twocrop, | |
249 -command=>[sub{draw_graph();}])-> | |
250 place(-rely=>1.,-y=>5,-anchor=>'nw',-in=>$one); | |
251 my$two=$graph_shell->Canvas()-> | |
252 place(-relwidth=>1.,-relheight=>1.,-rely=>1.,-y=>5+$temp->reqheight(),-anchor=>'nw',-in=>$one); | |
253 | |
254 scan_directory(); | |
255 | |
256 my%onestate; | |
257 my%twostate; | |
258 my @data; | |
259 | |
260 $onestate{"canvas"}=$one; | |
261 $onestate{"vars"}=\@panel_onevars; | |
262 $twostate{"canvas"}=$two; | |
263 $twostate{"vars"}=\@panel_twovars; | |
264 | |
265 $graph_slider->configure(-command=>[sub{load_graph()}]); | |
266 load_graph(); | |
267 $toplevel->bind('MainWindow','<Configure>',[sub{$toplevel->update(); | |
268 draw_graph()}]); | |
269 | |
270 Tk::MainLoop(); | |
271 | |
272 sub load_graph{ | |
273 | |
274 scan_directory()if(!defined($panel_count)); | |
275 | |
276 @data=undef; | |
277 | |
278 for(my$i=0;$i<$panel_count;$i++){ | |
279 my$filename=$panel_keys[$i]."_$fileno.m"; | |
280 if(open F, "$filename"){ | |
281 $data[$i]=[(<F>)]; | |
282 close F; | |
283 } | |
284 } | |
285 draw_graph(); | |
286 } | |
287 | |
288 sub graphhelper{ | |
289 my($graph)=@_; | |
290 my$count=0; | |
291 my@colors=("#ff0000","#00df00","#0000ff","#ffff00","#ff00ff","#00ffff","#ffffff", | |
292 "#9f0000","#007f00","#00009f","#8f8f00","#8f008f","#008f8f","#000000"); | |
293 | |
294 my$w=$graph->{"canvas"}; | |
295 my$rescale=0; | |
296 | |
297 Status("Plotting $fileno"); | |
298 $w->delete('foo'); | |
299 $w->delete('legend'); | |
300 $w->delete('lines'); | |
301 | |
302 # count range | |
303 for(my$i=0;$i<$panel_count;$i++){ | |
304 if($graph->{"vars"}->[$i]){ | |
305 if(defined($data[$i])){ | |
306 if(!defined($graph->{"minx"})){ | |
307 $data[$i]->[0]=~m/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/; | |
308 $graph->{"maxx"}=$1; | |
309 $graph->{"minx"}=$1; | |
310 $graph->{"maxy"}=$2; | |
311 $graph->{"miny"}=$2; | |
312 $rescale=1; | |
313 } | |
314 | |
315 for(my$j=0;$j<=$#{$data[$i]};$j++){ | |
316 $data[$i]->[$j]=~m/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/; | |
317 $rescale=1 if($1>$graph->{"maxx"}); | |
318 $rescale=1 if($1<$graph->{"minx"}); | |
319 $rescale=1 if($2>$graph->{"maxy"}); | |
320 $rescale=1 if($2<$graph->{"miny"}); | |
321 $graph->{"maxx"}=$1 if($1>$graph->{"maxx"}); | |
322 $graph->{"minx"}=$1 if($1<$graph->{"minx"}); | |
323 $graph->{"maxy"}=$2 if($2>$graph->{"maxy"}); | |
324 $graph->{"miny"}=$2 if($2<$graph->{"miny"}); | |
325 } | |
326 } | |
327 $count++; | |
328 } | |
329 } | |
330 | |
331 my$width=$w->width(); | |
332 my$height=$w->height(); | |
333 | |
334 $rescale=1 if(!defined($graph->{"width"}) || | |
335 $width!=$graph->{"width"} || | |
336 $height!=$graph->{"height"}); | |
337 | |
338 $graph->{"width"}=$width; | |
339 $graph->{"height"}=$height; | |
340 | |
341 if(defined($graph->{"maxx"})){ | |
342 # draw axes, labels | |
343 # look for appropriate axis scales | |
344 | |
345 if($rescale){ | |
346 | |
347 $w->delete('ylabel'); | |
348 $w->delete('xlabel'); | |
349 $w->delete('axes'); | |
350 | |
351 my$yscale=1.; | |
352 my$xscale=1.; | |
353 my$iyscale=1.; | |
354 my$ixscale=1.; | |
355 while(($graph->{"maxx"}-$graph->{"minx"})*$xscale>15){$xscale*=.1;$ixscale*=10.;} | |
356 while(($graph->{"maxy"}-$graph->{"miny"})*$yscale>15){$yscale*=.1;$iyscale*=10.;} | |
357 | |
358 while(($graph->{"maxx"}-$graph->{"minx"})*$xscale<3){$xscale*=10.;$ixscale*=.1;} | |
359 while(($graph->{"maxy"}-$graph->{"miny"})*$yscale<3){$yscale*=10.;$iyscale*=.1;} | |
360 | |
361 # how tall are the x axis labels? | |
362 $w->createText(-1,-1,-anchor=>'se',-tags=>['foo'],-text=>"0123456789."); | |
363 my($x1,$y1,$x2,$y2)=$w->bbox('foo'); | |
364 $w->delete('foo'); | |
365 my$maxlabelheight=$y2-$y1; | |
366 my$useabley=$height-$maxlabelheight-3; | |
367 my$pixelpery=$useabley/($graph->{"maxy"}-$graph->{"miny"}); | |
368 | |
369 # place y axis labels at proper spacing/height | |
370 my$lasty=-$maxlabelheight/2; | |
371 my$topyval=int($graph->{"maxy"}*$yscale+1.)*$iyscale; | |
372 | |
373 for(my$i=0;;$i++){ | |
374 my$yval= $topyval-$i*$iyscale; | |
375 my$y= ($graph->{"maxy"}-$yval)*$pixelpery; | |
376 last if($y>$useabley); | |
377 if($y-$maxlabelheight>=$lasty){ | |
378 $w->createText(0,$y,-anchor=>'e',-tags=>['ylabel'],-text=>"$yval"); | |
379 $lasty=$y; | |
380 } | |
381 } | |
382 | |
383 # get the max ylabel width and place them at proper x | |
384 ($x1,$y1,$x2,$y2)=$w->bbox('ylabel'); | |
385 my$maxylabelwidth=$x2-$x1; | |
386 $w->move('ylabel',$maxylabelwidth,0); | |
387 | |
388 my$beginx=$maxylabelwidth+3; | |
389 my$useablex=$width-$beginx; | |
390 | |
391 # draw basic axes | |
392 $w->createLine($beginx,0,$beginx,$useabley,$width,$useabley, | |
393 -tags=>['axes'],-width=>2); | |
394 # draw y tix | |
395 $lasty=-$maxlabelheight/2; | |
396 for(my$i=0;;$i++){ | |
397 my$yval= $topyval-$i*$iyscale; | |
398 my$y= ($graph->{"maxy"}-$yval)*$pixelpery; | |
399 last if($y>$useabley); | |
400 if($yval==0){ | |
401 $w->createLine($beginx,$y,$width,$y, | |
402 -tags=>['axes'],-width=>1); | |
403 }else{ | |
404 if($y-$maxlabelheight>=$lasty){ | |
405 $w->createLine($beginx,$y,$width,$y, | |
406 -tags=>['axes'],-width=>1, | |
407 -stipple=>'gray50'); | |
408 | |
409 $lasty=$y; | |
410 } | |
411 } | |
412 } | |
413 | |
414 # place x axis labels at proper spacing | |
415 my$topxval=int($graph->{"maxx"}*$xscale+1.)*$ixscale; | |
416 my$pixelperx=$useablex/($graph->{"maxx"}-$graph->{"minx"}); | |
417 | |
418 for(my$i=0;;$i++){ | |
419 my$xval= $topxval-$i*$ixscale; | |
420 my$x= $width-($graph->{"maxx"}-$xval)*$pixelperx; | |
421 | |
422 last if($x<$beginx); | |
423 # bounding boxen are hard. place temp labels. | |
424 $w->createText(-1,-1,-anchor=>'e',-tags=>['foo'],-text=>"$xval"); | |
425 } | |
426 | |
427 ($x1,$y1,$x2,$y2)=$w->bbox('foo'); | |
428 my$maxxlabelwidth=$x2-$x1; | |
429 $w->delete('foo'); | |
430 my$lastx=$width; | |
431 | |
432 for(my$i=0;;$i++){ | |
433 my$xval= $topxval-$i*$ixscale; | |
434 my$x= $width-($graph->{"maxx"}-$xval)*$pixelperx; | |
435 | |
436 last if($x-$maxxlabelwidth/2<0 || $x<$beginx); | |
437 if($xval==0 && $x<$width){ | |
438 $w->createLine($x,0,$x,$useabley,-tags=>['axes'],-width=>1); | |
439 } | |
440 | |
441 if($x+$maxxlabelwidth<=$lastx){ | |
442 $w->createText($x,$height-1,-anchor=>'s',-tags=>['xlabel'],-text=>"$xval"); | |
443 $w->createLine($x,0,$x,$useabley,-tags=>['axes'],-width=>1,-stipple=>"gray50"); | |
444 $lastx=$x; | |
445 } | |
446 } | |
447 $graph->{"labelheight"}=$maxlabelheight; | |
448 $graph->{"xo"}=$beginx; | |
449 $graph->{"ppx"}=$pixelperx; | |
450 $graph->{"ppy"}=$pixelpery; | |
451 } | |
452 | |
453 # plot the files | |
454 $count=0; | |
455 my$legendy=$graph->{"labelheight"}/2; | |
456 for(my$i=0;$i<$panel_count;$i++){ | |
457 if($graph->{"vars"}->[$i]){ | |
458 $count++; # count here for legend color selection stability | |
459 if(defined($data[$i])){ | |
460 # place a legend placard; | |
461 my$color=$colors[($count-1)%($#colors+1)]; | |
462 $w->createText($width,$legendy,-anchor=>'e',-tags=>['legend'], | |
463 -fill=>$color,-text=>$panel_keys[$i]); | |
464 $legendy+=$graph->{"labelheight"}; | |
465 | |
466 # plot the lines | |
467 my@pairs=map{if(/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/){ | |
468 (($1-$graph->{"minx"})*$graph->{"ppx"}+$graph->{"xo"}, | |
469 (-$2+$graph->{"maxy"})*$graph->{"ppy"})}} (@{$data[$i]}); | |
470 | |
471 $w->createLine((@pairs),-fill=>$color,-tags=>['lines']); | |
472 } | |
473 } | |
474 } | |
475 } | |
476 } | |
477 | |
478 sub draw_graph{ | |
479 | |
480 if($onecrop){ | |
481 $onestate{"minx"}=undef; | |
482 $onestate{"miny"}=undef; | |
483 $onestate{"maxx"}=undef; | |
484 $onestate{"maxy"}=undef; | |
485 } | |
486 if($twocrop){ | |
487 $twostate{"minx"}=undef; | |
488 $twostate{"miny"}=undef; | |
489 $twostate{"maxx"}=undef; | |
490 $twostate{"maxy"}=undef; | |
491 } | |
492 | |
493 for(my$i=0;$i<$panel_count;$i++){ | |
494 if($twostate{"vars"}->[$i]){ | |
495 | |
496 #re-place the canvases | |
497 | |
498 $oneresize->place(-x=>5,-y=>5,-anchor=>'nw'); | |
499 | |
500 $one->place(-relwidth=>1.,-width=>-10,-relheight=>.5, | |
501 -height=>($graphy/2)-5-$oneresize->reqheight(), | |
502 -x=>5,-y=>5+$oneresize->reqheight,-anchor=>'nw'); | |
503 | |
504 $tworesize->place(-rely=>1.,-y=>5,-anchor=>'nw',-in=>$one); | |
505 $two->place(-relwidth=>1.,-relheight=>1.,-rely=>1., | |
506 -y=>5+$tworesize->reqheight(),-anchor=>'nw',-in=>$one); | |
507 | |
508 graphhelper(\%onestate); | |
509 graphhelper(\%twostate); | |
510 return; | |
511 } | |
512 } | |
513 | |
514 $oneresize->place(-x=>5,-y=>5,-anchor=>'nw'); | |
515 | |
516 $one->place(-relwidth=>1.,-width=>-10,-relheight=>1., | |
517 -height=>$graphy-5-$oneresize->reqheight(), | |
518 -x=>5,-y=>5+$oneresize->reqheight,-anchor=>'nw'); | |
519 | |
520 $tworesize->placeForget(); | |
521 $two->placeForget(); | |
522 | |
523 graphhelper(\%onestate); | |
524 } | |
525 | |
526 sub depopulate_panel{ | |
527 my $win; | |
528 foreach $win (@panel_labels){ | |
529 $win->destroy(); | |
530 } | |
531 @panel_labels=(); | |
532 foreach $win (@panel_ones){ | |
533 $win->destroy(); | |
534 } | |
535 @panel_ones=(); | |
536 foreach $win (@panel_twos){ | |
537 $win->destroy(); | |
538 } | |
539 @panel_twos=(); | |
540 @panel_keys=(); | |
541 } | |
542 | |
543 sub populate_panel{ | |
544 my $localy=$panely; | |
545 my $key; | |
546 my $i=0; | |
547 foreach $key (sort (keys %bases)){ | |
548 $panel_keys[$i]=$key; | |
549 if(!defined($panel_onevars[$i])){ | |
550 $panel_onevars[$i]=0; | |
551 $panel_twovars[$i]=0; | |
552 } | |
553 | |
554 my $temp=$panel_twos[$i]=$panel_shell-> | |
555 Checkbutton(-variable=>\$panel_twovars[$i],-command=>['main::draw_graph'],-text=>'2')-> | |
556 place(-y=>$localy,-x=>-5,-anchor=>"ne",-relx=>1.); | |
557 my $oney=$temp->reqheight(); | |
558 my $onex=$temp->reqwidth()+15; | |
559 | |
560 $temp=$panel_ones[$i]=$panel_shell-> | |
561 Checkbutton(-variable=>\$panel_onevars[$i],-command=>['main::draw_graph'],-text=>'1')-> | |
562 place(-y=>0,-x=>0,-anchor=>"ne",-in=>$temp,-bordermode=>'outside'); | |
563 $oney=$temp->reqheight() if ($oney<$temp->reqheight()); | |
564 $onex+=$temp->reqwidth(); | |
565 | |
566 $temp=$panel_labels[$i]=$panel_shell->Label(-text=>$key,-class=>'Field',-justify=>'left')-> | |
567 place(-y=>$localy,-x=>5,-anchor=>"nw",-relwidth=>1.,-width=>-$onex, | |
568 -bordermode=>'outside'); | |
569 $oney=$temp->reqheight() if ($oney<$temp->reqheight()); | |
570 | |
571 $localy+=$oney+2; | |
572 $i++; | |
573 } | |
574 $panel_count=$i; | |
575 | |
576 $localy+=$panel_quit->reqheight()+50; | |
577 my $geometry=$panel->geometry(); | |
578 $geometry=~/^(\d+)/; | |
579 | |
580 $panel->configure(-height=>$localy); | |
581 $panel->configure(-width=>$1); | |
582 } | |
583 | |
584 sub Shutdown{ | |
585 Tk::exit(); | |
586 } | |
587 | |
588 sub Status{ | |
589 my$text=shift @_; | |
590 $graph_status->configure(-text=>"$text"); | |
591 $toplevel->update(); | |
592 } | |
593 | |
594 sub scan_directory{ | |
595 | |
596 %bases=(); | |
597 my$count=0; | |
598 | |
599 $first_file=undef; | |
600 $last_file=undef; | |
601 | |
602 if(opendir(D,".")){ | |
603 my$file; | |
604 while(defined($file=readdir(D))){ | |
605 if($file=~m/^(\S*)_(\d+).m/){ | |
606 $bases{"$1"}="0"; | |
607 $first_file=$2 if(!defined($first_file) || $2<$first_file); | |
608 $last_file=$2 if(!defined($last_file) || $2>$last_file); | |
609 $count++; | |
610 | |
611 Status("Reading... $count")if($count%117==0); | |
612 } | |
613 } | |
614 closedir(D); | |
615 } | |
616 Status("Done Reading: $count files"); | |
617 depopulate_panel(); | |
618 populate_panel(); | |
619 | |
620 $fileno=$first_file if($fileno<$first_file); | |
621 $fileno=$last_file if($fileno>$last_file); | |
622 | |
623 $graph_slider->configure(-from=>$first_file,-to=>$last_file); | |
624 | |
625 } | |
626 | |
627 | |
628 | |
629 | |
630 |