Gtk2-CV
view release on metacpan or search on metacpan
use Gtk2::CV::ImageWindow;
use Gtk2::CV::Schnauzer;
use Carp (); $Carp::MaxArgLen = 256;
use Gtk2::CV::Plugin::NameCluster;
use Gtk2::CV::Plugin::RCluster;
use Gtk2::CV::Plugin::PatRenamer;
use Gtk2::CV::Plugin::MetaCluster;
use AnyEvent::Fork::Template;
Gtk2::CV::Jobber::set_template $AnyEvent::Fork::Template;
# now we can initialize Gtk2 etc.
init Gtk2;
Gtk2::Rc->parse (Gtk2::CV::find_rcfile "gtkrc");
use File::Spec;
my $mainwin;
my $viewer;
my $viewer_count;
my $schnauzer;
my $info;
my $help;
my $schnauzer_idx = 0;
sub new_schnauzer {
my $s = new Gtk2::CV::Schnauzer;
$s->signal_connect_after (key_press_event => \&std_keys);
$s->signal_connect (activate => sub {
my $label = sprintf "%s (%d)",
(Glib::filename_display_name +(File::Spec->splitpath ($_[1]))[2]),
-s $_[1];
$info->set_label ($label);
$viewer->load_image ($_[1]) if $viewer; # TODO: error, or chose ANY viewer
});
Gtk2::CV::Plugin->call (new_schnauzer => $s);
$s
}
our %VIEWER; # global viewer container so we can propagate signals
$SIG{USR1} = sub {
# I assume glib calls us in a safe enough context to create an idle watcher
add Glib::Idle sub {
$_->reload for values %VIEWER;
0
};
};
sub new_viewer {
my $self = new Gtk2::CV::ImageWindow;
Scalar::Util::weaken ($VIEWER{$self+0} = $self);
$viewer_count++;
$self->set_title ("CV: Image");
$self->signal_connect (key_press_event => sub {
$viewer = $_[0];
my $key = $_[1]->keyval;
my $state = $_[1]->state;
if ($state * "control-mask" && $key == $Gtk2::Gdk::Keysyms{c}) {
my $viewer = new_viewer ();
$viewer->set_image ($_[0]->{image});
$viewer->show_all;
1
} else {
&std_keys
or $schnauzer->signal_emit (key_press_event => $_[1])
}
});
$self->signal_connect (delete_event => sub { $_[0]->destroy; 0 });
$self->signal_connect (destroy => sub {
delete $VIEWER{$_[0]+0};
$viewer = undef if $viewer == $_[0];
main_quit Gtk2 unless --$viewer_count;
0
});
$self->signal_connect (button3_press_event => sub {
$mainwin->visible
? $mainwin->hide
: $mainwin->show_all;
1
});
Gtk2::CV::Plugin->call (new_imagewindow => $self);
$self
}
sub std_keys {
my $key = $_[1]->keyval;
my $state = $_[1]->state;
my $ctrl = $state * "control-mask";
if ($key == $Gtk2::Gdk::Keysyms{q}) {
$viewer->destroy;
} elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) {
my $w = new Gtk2::Window;
$w->set_role ("schnauzer");
$w->set_title ("CV: Schnauzer");
$w->add (my $s = new_schnauzer);
$s->set_dir (File::Spec->curdir);
$s->set_geometry_hints;
( run in 1.536 second using v1.01-cache-2.11-cpan-99c4e6809bf )