Gtk2-CV

 view release on metacpan or  search on metacpan

bin/cv  view on Meta::CPAN

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 )