App-PLab
view release on metacpan or search on metacpan
bin/PrAverB view on Meta::CPAN
$canvas-> polyline(\@r);
if ( defined $me->{number}) {
$canvas-> text_out( $me->{number}, $iv-> point2screen( $me->{bounds}->[0], $me->{bounds}->[1]));
}
if ( $w-> {selectedRect} && $me == $w-> {selectedRect} && !$iv->{transaction}) {
my $c = $canvas-> color;
my $pc = $w->{ini}->{Color_Selection} + 0;
$pc = ~($pc) & 0xFFFFFF;
$canvas-> color( $pc);
$canvas-> rop( rop::XorPut);
@r = $me-> get_screen_bounds;
my $hw = $r[0]+($r[2]-$r[0])/2;
my $hh = $r[1]+($r[3]-$r[1])/2;
if ( $me->{state} == 0) {
$canvas-> bar( $r[0],$r[1],$r[0]+4,$r[1]+4);
$canvas-> bar( $hw-2,$r[1],$hw+2,$r[1]+4);
$canvas-> bar( $r[2]-5,$r[1],$r[2]-1,$r[1]+4);
$canvas-> bar( $r[0],$r[3]-5,$r[0]+4,$r[3]-1);
$canvas-> bar( $hw-2,$r[3]-5,$hw+2,$r[3]-1);
$canvas-> bar( $r[2]-5,$r[3]-5,$r[2]-1,$r[3]-1);
$canvas-> bar( $r[0],$hh-2,$r[0]+4,$hh+2);
$canvas-> bar( $r[2]-5,$hh-2,$r[2]-1,$hh+2);
} else {
$canvas-> arc( $r[0]+16, $r[1]+16, 8, 8, 180, 270);
$canvas-> arc( $r[0]+16, $r[3]-16, 8, 8, 90, 180);
$canvas-> arc( $r[2]-16, $r[3]-16, 8, 8, 0, 90);
$canvas-> arc( $r[2]-16, $r[1]+16, 8, 8, 270, 360);
$canvas-> line( $r[0]+2, $hh - 5, $r[0]+2, $hh + 5);
$canvas-> line( $hw - 5, $r[1]+2, $hw + 5, $r[1]+2);
$canvas-> line( $r[2]-2, $hh - 5, $r[2]-2, $hh + 5);
$canvas-> line( $hw - 5, $r[3]-2, $hw + 5, $r[3]-2);
}
$r[0] += 3;
$r[1] += 3;
$r[2] -= 3;
$r[3] -= 3;
$canvas-> rectangle( @r);
$canvas-> rop( rop::CopyPut);
$canvas-> color( $c);
}
}
sub compare_to
{
my @d = map {
my $g = $_[0]-> {bounds}-> [$_] - $_[1]-> {bounds}->[$_];
$g = 0 if abs($g) < 8; # XXX
$g;
} 0,1;
return ($d[1] != 0) ? -$d[1] : $d[0];
}
package AveWindow;
use vars qw(@ISA);
@ISA = qw(App::PLab::ImageAppWindow);
sub win_inidefaults
{
my $w = $_[0];
return (
$w-> SUPER::win_inidefaults,
PropShowMode => '1',
);
}
sub on_create
{
my $self = $_[0];
my $w = $_[0];
$self-> SUPER::on_create;
$self-> {dataExt} = 'pab';
$w-> {selectedRect} = undef;
$w-> {rects} = [];
$w-> insert( Popup =>
autoPopup => 0,
selected => 0,
name => 'FigurePopup',
items => [
['~Duplicate' => 'Ctrl+D' => kb::NoKey => q(win_figdup)],
['De~lete' => 'Del' => kb::NoKey => q(win_figdelete)],
['~Properties' => sub { $w-> fig_propdialog( $w-> {selectedRect})}],
],
);
my $scale = $::application-> uiScaling;
$scale = 1 if $scale < 1;
my %btn_profile = (
glyphs => 2,
text => "",
selectable => 0,
transparent => 1,
flat => 1,
size => [ map { $_ * $scale } 36, 36],
borderWidth => 1,
);
$w-> ToolBar-> insert(
[ SpeedButton =>
origin => [ 114 * $scale, 1],
image => App::PLab::ButtonGlyphs::icon( bg::floppy),
hint => 'Save file',
enabled => 0,
name => "FileSave",
onClick => sub { $w-> win_saveframe; },
%btn_profile,
],
[ SpeedButton =>
origin => [ 150 * $scale, 1],
image => App::PLab::ButtonGlyphs::icon( bg::print),
hint => 'Print',
enabled => 0,
name => "FilePrint",
onClick => sub { $w-> win_printframe(0); },
%btn_profile,
],
);
}
sub win_closeframe
{
my $w = $_[0];
$w-> SUPER::win_closeframe;
$w-> fig_clear();
}
sub win_newextras
{
my $w = $_[0];
$w-> SUPER::win_newextras;
my $pabname = $w-> win_extname( $w->{file});
if ( open F, "< $pabname") {
$_ = <F>;
return unless /Average\sbrightness\sdata/;
return unless /extinfo/;
my $i;
LOOP: while (<F>) {
my $comments;
chomp;
if ( /\#(.*)/) {
$comments = $1;
# print "got comments:$comments\n";
s/\#.*//;
}
next unless length $_;
my @dp = split(' ', $_);
# print "got data:@dp\n";
next unless $dp[0] =~ /^\d+$/;
next unless defined $comments;
@dp = split(' ', $comments);
# print "got split comments:@dp\n";
for ( @dp) {
next LOOP unless /^[\d\.]+$/;
}
# print "@dp:ok!\n";
$i++;
my $threshold = shift @dp;
next if $threshold < 0 || $threshold > 255;
my $fig = $w-> fig_add( @dp);
$fig-> {number} = $i;
$fig-> {threshold} = $threshold;
}
close F;
}
}
sub win_printframe
{
my ( $w, $usedlg) = @_;
if ( $usedlg) {
my $d = $w-> {printerDialog};
$w-> {printerDialog} = $d = Prima::PrintSetupDialog-> create( owner => $w) unless $d;
$w-> iv_cancelmode( $w-> IV);
return unless $d-> execute;
}
my $p = $::application-> get_printer;
$p-> font-> size( 9);
if ( !$p-> begin_doc) {
Prima::MsgBox::message_box( $w->name, "Error starting print document", mb::Ok|mb::Error);
return;
}
my $ww = Prima::Window-> create(
borderIcons => 0,
borderStyle => bs::None,
size => [300, 100],
centered => 1,
);
$ww-> insert( Label =>
bin/PrAverB view on Meta::CPAN
my $sum2 = $a2-> sum;
my $ave = $area ? $sum2 / $area : 0;
printf F "%-3d %-14.8g %-14.8g %-14.8g", $i, $ave, $sum2, $area;
print F "# $t @{$_->{rect}}\n";
}
close F;
$w-> modified( 0);
} else {
return 0 if Prima::MsgBox::message_box( $::application-> name,
"Error saving file $pabname. Ignore changes?", mb::YesNo|mb::Warning) == mb::No;
}
return 1;
}
sub win_figrenumber
{
my $w = $_[0];
my $i = 0;
my $needRepaint = 0;
for ( sort { $a-> compare_to( $b) } @{$w-> {rects}}) {
$i++;
$needRepaint = 1 if !$needRepaint && defined $_-> {number} && $_-> {number} != $i;
$_-> {number} = $i;
}
return $needRepaint;
}
sub win_figdelete
{
my ( $w) = @_;
return unless $w->{selectedRect};
$w->{selectedRect}-> destroy;
$w-> modified( 1);
$w-> {rects}->[-1]-> select if @{$w-> {rects}};
$w-> pointer( cr::Default);
}
sub win_figdup
{
my ( $w) = @_;
return unless $w->{selectedRect};
my @rc = @{$w->{selectedRect}->{rect}};
my $x = $w-> fig_add( map { $_ += 20} @rc);
$w-> modified( 1);
$x-> select;
}
sub win_figclear
{
my ( $w) = @_;
$w-> fig_clear;
$w-> IV-> repaint;
$w-> pointer( cr::Default);
$w-> modified( 1);
}
sub win_framechanged
{
my $w = $_[0];
$w-> SUPER::win_framechanged;
$w-> menu-> FilePrint-> enabled( defined $w-> {file});
$w-> menu-> FileSave-> enabled( defined $w-> {file});
$w-> ToolBar-> FilePrint-> enabled( defined $w-> {file});
$w-> ToolBar-> FileSave-> enabled( defined $w-> {file});
}
# FIG
sub fig_clear
{
$_[0]-> {selectedRect} = undef;
$_[0]-> {rects} = [];
}
sub fig_add
{
my $w = shift;
my $obj = new Figure @_;
push @{$w-> {rects}}, $obj;
$obj->{index} = scalar(@{$w-> {rects}}) - 1;
$obj->{owner} = $w;
$obj->{IV} = $w-> IV;
return $obj;
}
sub fig_propdialog
{
my $i2 = undef if 0;
my ($w, $me) = @_;
my $d = $w-> {figPropDlg};
my ($i1,$imask);
( $i1, $imask, $i2) = $w-> fig_getspots( $me);
unless ( $d) {
my $selpoint = sub {
my ( $d, $item) = @_;
$d-> menu-> checked( $w->{ini}->{PropShowMode}, 0);
$d-> menu-> checked( $item, 1);
$w->{ini}->{PropShowMode} = $item;
$d-> Threshold-> notify(q(Change)); # force changes
};
$d = Prima::Dialog-> create(
size => [ 400, 320],
text => 'Spot properties',
owner => $w,
menuItems => [
['~Options' => [
['1' => '~Positive' => 'Ctrl+P' => '^P' =>$selpoint],
['2' => '~Negative' => 'Ctrl+N' => '^N' =>$selpoint],
['3' => '~Mask' => 'Ctrl+M' => '^M' =>$selpoint],
]],
],
%App::PLab::ImageAppWindow::dlgProfile,
);
$d-> menu-> check( $w->{ini}->{PropShowMode});
$d-> insert( Button =>
origin => [ 10, 10],
size => [ 56, 36],
default => 1,
text => '~Ok',
bin/PrAverB view on Meta::CPAN
sub IV_xorrect
{
my ( $w, $self) = @_;
my @r = @{$self->{xorData}};
my $pc = $w->{ini}->{Color_Selection} + 0;
$pc = ~($pc) & 0xFFFFFF;
$self-> begin_paint;
$self-> set(
linePattern => lp::Dash,
color => $pc,
rop => rop::XorPut,
);
$self-> polyline( [ @r, @r[0,1]] );
$self-> end_paint;
}
sub IV_xorpoly
{
my ( $w, $self) = @_;
my $pc = $w-> backColor;
my @r = @{$self->{xorPolyData}};
$self-> begin_paint;
$self-> set(
linePattern => lp::Dash,
color => $pc,
rop => rop::XorPut,
);
$self-> polyline( [ @r, @r[0,1]] );
$self-> end_paint;
}
sub IV_MouseDown
{
my ( $w, $self, $btn, $mod, $x, $y) = @_;
if ( !$self->{transaction})
{
my ( $ax, $ay) = $self-> screen2point( $x, $y);
for ( @{$w-> {rects}}) {
if ( $_-> on_mousedown( $w, $self, $btn, $mod, $x, $y, $ax, $ay)) {
$self-> clear_event;
return;
}
}
if ( $btn == mb::Left) {
$self-> {transaction} = tran::init;
$w-> iv_cancelmagnify( $self);
$self-> capture( 1);
$self-> {anchor} = [ $x, $y];
$self-> {xorData} = [ $x, $y, $x, $y, $x, $y, $x, $y];
$w-> IV_xorrect( $self);
$self-> clear_event;
$w-> sb_text( "Draw a region");
return;
}
}
$w-> SUPER::IV_MouseDown( $self, $btn, $mod, $x, $y);
return unless $self-> eventFlag;
$self-> clear_event;
}
sub IV_MouseClick
{
my ( $w, $self, $btn, $mod, $x, $y, $dbl) = @_;
return if $self->{transaction};
my ( $ax, $ay) = $self-> screen2point( $x, $y);
for ( @{$w-> {rects}}) {
if ( $_-> on_mouseclick( $w, $self, $btn, $mod, $x, $y, $ax, $ay, $dbl)) {
$self-> clear_event;
return;
}
}
}
sub IV_MouseUp
{
my ( $w, $self, $btn, $mod, $x, $y) = @_;
return unless $self->{transaction};
$w-> SUPER::IV_MouseUp( $self, $btn, $mod, $x, $y);
return unless $self-> eventFlag;
if ( $self->{transaction} == tran::init && $btn == mb::Left) {
$self-> {transaction} = undef;
$self-> capture( 0);
$w-> IV_xorrect( $self);
$self-> clear_event;
if ( $self-> {anchor}->[0] != $x && $self-> {anchor}->[1] != $y) {
my $ix = $w-> fig_add( $self-> screen2point( @{$self-> {xorData}}));
$self-> {xorData} = [(-1)x4];
$w-> {selectedRect} = $ix;
} else {
$w-> {selectedRect} = undef;
}
$self-> repaint;
return;
}
if ( $w-> {selectedRect} && $self-> {transaction})
{
my ( $ax, $ay) = $self-> screen2point( $x, $y);
if ( $w-> {selectedRect}-> on_mouseup( $w, $self, $btn, $mod, $x, $y, $ax, $ay)) {
$self-> clear_event;
return;
}
}
}
sub IV_MouseMove
{
my ( $w, $self, $mod, $x, $y) = @_;
$w-> SUPER::IV_MouseMove( $self, $mod, $x, $y);
return unless $self-> eventFlag;
if ( $self->{transaction} && $self->{transaction} == tran::init) {
$w-> IV_xorrect( $self);
$self-> {xorData}-> [3] = $y;
$self-> {xorData}-> [4] = $x;
$self-> {xorData}-> [5] = $y;
$self-> {xorData}-> [6] = $x;
$w-> IV_xorrect( $self);
$self-> clear_event;
return;
}
if ( $w-> {selectedRect} && $w-> {selectedRect}-> on_mousemove( $w, $self, $mod, $x, $y)) {
$self-> clear_event;
return;
}
}
sub IV_Paint
{
my ( $w, $self, $canvas) = @_;
$self-> on_paint( $canvas);
my $r = $w-> {rects};
my $z = $self-> zoom;
$canvas-> color( $w-> {ini}->{Color_AreaBorder});
$canvas-> translate(0,0);
for ( @$r) {
$_-> on_paint( $w, $self, $canvas);
}
}
# OPT
sub opt_colors
{
return {
'Selection' => [ cl::Gray, 'Selection'],
'AreaBorder' => [ cl::Cyan, 'Area border'],
};
}
sub opt_keys
{
return {
%{$_[0]-> SUPER::opt_keys()},
FileSave => [ kb::F2, 'Save frame layout'],
FilePrint => [ '^P', 'Print current frame layout'],
EditDuplicate => [ '^D', 'Duplicate selected rectange'],
EditDelete => [ kb::Delete , 'Delete selected rectange'],
EditDeleteAll => [ kb::NoKey , 'Delete all rectanges'],
},
}
# OPT_END
package Run;
my $wfile = App::PLab::ImageAppWindow::winmenu_file();
splice( @{$$wfile[1]}, 8, 0,
[],
['-FileSave' => "~Save" => q(win_saveframe)],
['-FilePrint' => "~Print..." => sub { $_[0]-> win_printframe(1); }],
);
my $wedt = App::PLab::ImageAppWindow::winmenu_edit();
splice( @{$$wedt[2]}, 0, 0,
[ EditDuplicate => "~Duplicate" => q(win_figdup)],
[ EditDelete => "De~lete" => q(win_figdelete)],
[ EditDeleteAll => "Delete ~all" => q(win_figclear), ],
[],
);
my $w = AveWindow-> create(
menuItems => [
$wfile,
$wedt,
App::PLab::ImageAppWindow::winmenu_view(),
],
);
$w-> IV-> delegations(['Paint', 'MouseClick']);
$w-> sb_text("Started OK");
$w-> visible(1);
$w-> select;
$w-> win_extwarn;
run Prima;
( run in 1.569 second using v1.01-cache-2.11-cpan-98e64b0badf )