App-PLab
view release on metacpan or search on metacpan
lib/App/PLab/ImageApp.pm view on Meta::CPAN
sub Dir_Change
{
my ( $self, $dir) = @_;
my $w = $self-> owner;
my $mask = $self-> {mask};
my @files = grep { /$mask/i; } $dir-> files( 'reg');
@files = sort {uc($a) cmp uc($b)} @files if $self->{sorted};
my %vecs = ();
my $nums = $w-> {cypherMask};
for (@files)
{
next unless /^(.+)(\d{$nums})\.([^\.]*)$/;
my ($sername, $num, $ext) = ($1, $2, $3);
$vecs{ $sername} = [ pack( "b1000", "0" x 100), $ext] unless exists $vecs{ $sername};
vec( $vecs{ $sername}->[0], $num, 1) = 1;
}
my @series = ();
my $max = 10 ** $nums - 1;
for my $sername (sort keys %vecs)
{
my ($j, $k);
my $s = unpack( b1000 => $vecs{ $sername}->[0]); # to exploit string functions
$j = index( $s, '1');
while ( $j >= 0)
{
$k = index( $s, '0', $j);
if ( $k < 0)
{
$s = '';
push @series, [ $sername , $vecs{ $sername}->[1],
sprintf("%0${nums}d",$j), sprintf("%0${nums}d",$max)] if $j < $max;
}
else
{
$s = ('0' x $k) . substr( $s, $k);
push @series, [ $sername , $vecs{ $sername}->[1],
sprintf("%0${nums}d",$j), sprintf("%0${nums}d",$k - 1)] if $j < $k - 1;
}
$j = index( $s, '1');
}
}
$self-> {series} = [@series];
$self-> Files-> items([ map { "$$_[0]$$_[2].$$_[1]"} @series]);
$self-> Directory_FontChanged( $self-> Directory);
}
sub Files_DrawItem
{
my ( $dlg, $me, $canvas, $index, $left, $bottom, $right, $top, $hilite, $focused) = @_;
return unless $dlg-> {series};
my $backColor = $hilite ? $me-> hiliteBackColor : $me-> backColor;
my $color = $hilite ? $me-> hiliteColor : cl::Fore | wc::ListBox;
$canvas-> color($backColor);
$canvas-> bar( $left, $bottom, $right, $top);
$canvas-> color($color);
my @ser = @{$dlg->{series}->[$index]};
my $text = "$ser[0]$ser[2].$ser[1]";
my $series = "$ser[2]-$ser[3]";
my $font = $canvas-> font;
my $h = $canvas-> font-> height;
my $w = $canvas-> get_text_width( $text);
$canvas-> text_out( $text, $left + 2, ($top + $bottom + 1 - $h) / 2);
$canvas-> font( height => $canvas-> font-> height - 2, pitch => fp::Fixed, style => fs::Bold);
$h = $canvas-> font-> height;
my $x = $left + $canvas-> get_text_width(' ') + $w;
$w = $canvas-> get_text_width( "9");
$canvas-> text_out( $series, $x + 1, ($top + $bottom + 1 - $h) / 2);
$canvas-> rectangle( $x, ($top + $bottom + 1 - $h) / 2, $x + $w * length( $series) + 2, ($top + $bottom + $h) / 2);
$canvas-> font( $font);
}
sub Files_MeasureItem
{
my ( $dlg, $self, $index, $sref) = @_;
$$sref = $self->get_text_width( $self-> get_item_text( $index)) + $self->get_text_width('m') * 8;
$self-> clear_event;
}
package App::PLab::TrDeviceBitmap;
use vars qw(@ISA);
@ISA = qw(Prima::DeviceBitmap);
sub translate
{
unless ( $#_) {
my @a = $_[0]-> SUPER::translate;
if ( $_[0]-> {override}) {
$a[$_] -= $_[0]-> {override}->[$_] for 0,1;
}
return @a;
}
my ( $self, $trx, $try) = @_;
if ( $self-> {override}) {
$trx += $self-> {override}-> [0];
$try += $self-> {override}-> [1];
}
$self-> SUPER::translate( $trx, $try);
}
sub clipRect
{
unless ( $#_) {
my @a = $_[0]-> SUPER::clipRect;
if ( $_[0]-> {override}) {
$a[$_] -= $_[0]-> {override}->[$_] for 0,1;
$a[$_+2] -= $_[0]-> {override}->[$_] for 0,1;
}
return @a;
}
my ( $self, $trx, $try, $tax, $tay) = @_;
if ( $self-> {override}) {
$trx += $self-> {override}-> [0];
$try += $self-> {override}-> [1];
$tax += $self-> {override}-> [0];
$tay += $self-> {override}-> [1];
}
$self-> SUPER::clipRect( $trx, $try, $tax, $tay);
}
package App::PLab::MagnifyingGlassWidget;
use vars qw(@ISA);
@ISA = qw(Prima::Widget);
sub profile_default
{
my $def = $_[ 0]-> SUPER::profile_default;
my %prf = (
width => 154,
height => 102,
lib/App/PLab/ImageApp.pm view on Meta::CPAN
], [ CheckBox =>
origin => [ 110, 28],
size => [ 374, 36],
name => 'UseDef',
text => '~Use default save path',
onClick => sub {
$_[0]-> owner-> Path-> enabled( !$_[0]-> checked);
},
hint => 'Default path is where image file located',
], [ InputLine =>
origin => [ 10, 10],
size => [ 341, 20],
name => 'Path',
], [ SpeedButton =>
origin => [ 354, 10],
name => 'VB::Button1',
size => [ 26, 20],
text => '...',
borderWidth => 1,
hint => 'Select custom directory where additional files will be saved',
onClick => sub {
my $d = defined $w->{dirpt} ? $w->{dirpt} : Prima::ChDirDialog-> create;
$w->{dirpt} = $d;
$d-> directory( $_[0]-> owner-> Path-> text);
if ( $d-> execute != mb::Cancel) {
$_[0]-> owner-> UseDef-> uncheck;
$_[0]-> owner-> Path-> enabled(1);
$_[0]-> owner-> Path-> text( $d-> directory);
}
},
]);
$nb-> insert_to_page( 0,
[ Label =>
origin => [ 230, 94],
size => [ 135, 20],
text => 'Status line delay (sec)',
], [ SpinEdit =>
origin => [ 230, 72],
size => [ 135, 20],
min => 1,
max => 60,
step => 1,
name => 'StatusDelay',
]);
# Colors and appearance
$nb-> insert_to_page( 1, CheckBox =>
origin => [ 10, 60],
text => 'Show ~hints',
name => 'ShowHint',
hint => 'Enables these little pop-ups like the one you are looking at right now',
);
my $optColors = $w-> opt_colors;
my @colorNames = map { $optColors->{$_}->[1] } sort keys %$optColors;
my @colorKeys = map { "Color_$_" } sort keys %$optColors;
if ( scalar keys %$optColors) {
my $x1 = $nb-> insert_to_page( 1, ComboBox =>
origin => [ 10, 10],
size => [ 170, $nb-> font-> height + 2],
style => cs::DropDownList,
name => 'NameSel',
items => \@colorNames,
onChange => sub {
my $colors = $dlg-> {page2}-> {colors};
$nbpages-> {deprecate} = 1;
$nbpages-> ColorSel-> value( $$colors[ $w->{nameSelFoc} = $_[0]-> focusedItem]);
$nbpages-> {deprecate} = undef;
},
);
$nb-> insert_to_page( 1, Label =>
origin => [ 10, 12 + $x1-> height],
size => [ 300, 28],
text => 'Color setup',
focusLink => $x1,
);
$nb-> insert_to_page( 1, ColorComboBox =>
name => 'ColorSel',
origin => [ 190, 10],
size => [ 56, $nb-> font-> height + 2],
onChange => sub {
my $self = shift;
if ( !$nbpages-> {deprecate} && $self->enabled) {
my $colors = $dlg-> {page2}-> {colors};
$$colors[ $nbpages-> NameSel-> focusedItem] = $self-> value;
my $i;
for ( $i = 0; $i < scalar @colorKeys; $i++) {
$w->{ini}->{$colorKeys[$i]} = $colors->[$i];
}
$w-> opt_colormount;
$w-> IV-> repaint;
}
},
);
}
# Keys
my $optKeys = $w-> opt_keys;
my %o_items;
for ( keys %$optKeys) {
m/^([A-Z][a-z]*)/;
push( @{$o_items{$1}}, [$_]);
}
$nb-> insert_to_page( 2, [ StringOutline =>
origin => [ 10, 58],
size => [ 200, 222],
name => 'KeyList',
items => [ map {[ $_, $o_items{$_}]} sort keys %o_items ],
onSelectItem => sub {
my ( $me, $foc) = @_;
my ( $item, $lev) = $_[0]-> get_item( $foc);
return unless $item;
$w-> {keyMappings_change} = 1;
unless ( ref($item->[1])) {
my $key = $_[0]-> get_item_text( $item);
my $x = $w-> {keyMappings}-> {"Key_$key"};
$nbpages-> KeySelector-> enabled(1);
$nbpages-> KeySelector-> key( $w-> {keyMappings}-> {"Key_$key"} );
$nbpages-> KeyDescription-> text( $optKeys-> {$key}-> [1] );
$nbpages-> KeySelector-> show;
} else {
$nbpages-> KeySelector-> hide;
$nbpages-> KeySelector-> enabled(0);
$nbpages-> KeyDescription-> text( '');
}
delete $w-> {keyMappings_change};
},
], [ KeySelector =>
origin => [ 220, 110],
size => [ 150, 170],
name => 'KeySelector',
visible => 0,
onChange => sub {
return if $w-> {keyMappings_change};
my $kl = $nbpages-> KeyList;
my ( $item, $lev) = $kl-> get_item( $kl-> focusedItem);
return unless $item;
my $okey = $kl-> get_item_text( $item);
my $key = "Key_$okey";
my $value = $_[0]-> key;
lib/App/PLab/ImageApp.pm view on Meta::CPAN
"\nDo you want to use it anyway?",
mb::YesNo|mb::Warning) != mb::Yes;
}
}
return 1;
}
sub opt_proppop
{
my ( $w, $dlg, $nb, $nbpages, $mr) = @_;
if ( $mr) {
# General
my $x = $nbpages-> Path-> text;
$x =~ s/^\s+//;
$x =~ s/\s+$//;
if ( $x eq '.' || $x eq '..' || length( $x) == 0) {
$nbpages-> UseDef-> check;
}
$w->{ini}->{extSaveDir} = $nbpages-> UseDef-> checked ?
'' : $nbpages-> Path-> text;
$w->{ini}->{silentExtDir} = 0 unless length $w->{ini}->{extSaveDir};
$w-> win_extpathchanged if $w->{ini}->{extSaveDir} ne $dlg->{page0}->{extSaveDir};
my $newmask = $nbpages-> RG_SeriesType-> RG_Long-> checked ? 3 : 2;
if ( $newmask != $w-> {cypherMask}) {
$w-> {cypherMask} = $newmask;
$w-> win_closeextras;
$w-> win_newextras;
$w-> win_extraschanged;
}
$w->{ini}->{statusDelay} = $nbpages-> StatusDelay-> value;
# Hints
$::application-> showHint( $w-> {ini}-> {showHint} = $nbpages-> ShowHint-> checked);
# Keys
$w-> winmenu_updatemappings;
} else {
# Colors
if ( $dlg-> {page2}-> {csave}) {
$w-> {ini}-> {$_} = $dlg->{page2}->{csave}-> {$_} for keys %{$dlg->{page2}->{csave}};
$w-> opt_colormount;
$w-> IV-> repaint;
}
# Keys
$w-> {keyMappings} = $w-> {keyMappings_save};
$nbpages-> KeyList-> notify(q(SelectItem), $nbpages-> KeyList-> focusedItem);
}
delete $w-> {keyMappings_save};
}
sub opt_properties
{
my $w = $_[0];
unless ( $w-> {propertySheet}) {
my $dlg = Prima::Window-> create(
size => [ 420, 460],
text => 'Properties',
owner => $w,
ownerShowHint => 0,
# font => $::application-> get_message_font,
%dlgProfile,
);
my $nb;
$w-> dlg_okcancel( $dlg);
$dlg-> OK-> set(
modalResult => 0,
onClick => sub {
$dlg-> ok if $w-> opt_propvalid( $dlg, $nb, $nb-> Notebook);
},
);
$nb = $dlg-> insert( TabbedNotebook =>
origin => [ 5, 66],
size => [ 410, 392],
growMode => gm::Client,
pageCount => 2,
tabs => ['General', 'Appearance', 'Keys'],
name => 'Notebook',
);
$w-> opt_propcreate( $dlg, $nb, $nb-> Notebook);
$w-> {propertySheet} = $dlg;
}
my $dlg = $w-> {propertySheet};
my $nb = $dlg-> Notebook;
my $nbpages = $nb-> Notebook;
$w-> opt_proppush( $dlg, $nb, $nbpages);
$w-> iv_cancelmode( $w-> IV);
$w-> opt_proppop( $dlg, $nb, $nbpages, $dlg-> execute == mb::OK);
}
# OPT_END
# IV
sub IV_MouseDown
{
my ( $w, $self, $btn, $mod, $x, $y) = @_;
{
my @r = $self-> get_active_area;
$self-> clear_event, return if $x < $r[0] or $x >= $r[2] or $y < $r[1] or $y >= $r[3];
}
$self-> clear_event, return if !$ImageApp::testing and !defined $w-> IV-> image;
my $ms = $self-> get_mouse_state;
my $lr = mb::Left | mb::Right;
if ((( $ms & $lr) == $lr) or ( $btn == mb::Middle)) {
defined $w-> {magnify} ? $w-> iv_cancelmagnify( $self) : $w-> iv_magnify( $self),
return;
}
if (( $btn == mb::Right) and ( !defined $self->{transaction})) {
$self-> {dragData} = [ $x, $y, $self-> deltas];
$w-> iv_entermode( $self, 3);
$self-> {savePointer} = $self->pointer;
$self-> pointer( $ico);
$self-> clear_event;
return;
lib/App/PLab/ImageApp.pm view on Meta::CPAN
my $scale = $::application-> uiScaling;
$scale = 1 if $scale < 1;
$w-> insert( "Panel",
text => "",
name => "ToolBar",
origin => [ 2, $y - 2 - 38 * $scale],
size => [ $x - 4, 38 * $scale],
raise => 1,
image => App::PLab::ImageAppGlyphs::image( bga::tile_m),
growMode => gm::GrowHiX | gm::GrowLoY,
);
my %btn_profile = (
glyphs => 2,
text => "",
selectable => 0,
transparent => 1,
flat => 1,
size => [ map { $_ * $scale } 36, 36],
borderWidth => 1,
);
$w-> ToolBar-> insert(
[ SpeedButton =>
origin => [1, 1],
image => App::PLab::ButtonGlyphs::icon( bg::fldropen),
hint => 'Open file',
onClick => sub { $w-> win_openfile; },
%btn_profile,
],
[ SpeedButton =>
name => "PrevImage",
origin => [42 * $scale, 1],
image => App::PLab::ImageAppGlyphs::icon( bga::prev),
enabled => 0,
hint => 'Previous image',
onClick => sub { $w-> win_prevfile; },
%btn_profile,
],
[ SpeedButton =>
name => "NextImage",
origin => [78 * $scale, 1],
image => App::PLab::ImageAppGlyphs::icon( bga::next),
enabled => 0,
hint => 'Next image',
onClick => sub { $w-> win_nextfile; },
%btn_profile,
],
);
$w-> insert( "Panel",
text => "",
name => "StatusBar",
rect => [0, 0, $w-> width, 22],
indent => 2,
raise => 0,
buffered => 1,
growMode => gm::GrowHiX,
font => { name => "System VIO", height => 18,},
);
$w-> insert( 'App::PLab::TrImageViewer' =>
name => "IV",
rect => [ 2, $w-> StatusBar-> height + 2, $x - 2, $y - $w-> ToolBar-> height - 8],
hScroll => 1,
vScroll => 1,
growMode => gm::Client,
delegations => [qw(Size MouseUp MouseDown MouseMove Paint)],
widgetClass => wc::Window,
);
return %profile;
}
1;
=pod
=head1 NAME
App::PLab::ImageApp - ancient stuff, please move along, nothing to see here
=cut
( run in 0.754 second using v1.01-cache-2.11-cpan-5735350b133 )