annotate src/libvorbis-1.3.3/examples/frameview.pl @ 94:d278df1123f9

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