--- CV/bin/cv 2003/11/04 02:48:09 1.10 +++ CV/bin/cv 2003/11/08 01:00:08 1.21 @@ -6,18 +6,29 @@ use Gtk2::CV::ImageWindow; use Gtk2::CV::Schnauzer; +use Gtk2::CV; + +Gtk2::Rc->parse (Gtk2::CV::find_rcfile "gtkrc"); + +use File::Spec; + +my $mainwin; my $viewer; my $schnauzer; +my $info; +my $help; sub new_schnauzer { - my $w = new Gtk2::Window; - $w->add (my $s = new Gtk2::CV::Schnauzer); + my $s = new Gtk2::CV::Schnauzer; - $s->signal_connect (activate => sub { $viewer->load_image ($_[1]) }); $s->signal_connect_after (key_press_event => \&std_keys); - - $s->set_dir ("."); - $w->show_all; + $s->signal_connect (activate => sub { + my $label = sprintf "%s (%d)", + (File::Spec->splitpath ($_[1]))[2], + -s $_[1]; + $info->set_label ($label); + $viewer->load_image ($_[1]); + }); $s; } @@ -26,35 +37,148 @@ my $key = $_[1]->keyval; my $state = $_[1]->state; - my $ctrl = grep $_ eq "control-mask", @$state; + my $ctrl = $state * "control-mask"; if ($key == $Gtk2::Gdk::Keysyms{q}) { main_quit Gtk2; } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) { - new_schnauzer; + my $w = new Gtk2::Window; + $w->add (my $s = new_schnauzer); + $s->set_dir (File::Spec->curdir); + $w->show_all; + } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{h}) { + unless ($help) { + require Gtk2::PodViewer; + + $help = new Gtk2::Window; + $help->set_title ("CV Help"); + $help->set_default_size (500, 300); + $help->signal_connect (delete_event => sub { $help->hide; 1 }); + + $help->add (my $sw = new Gtk2::ScrolledWindow); + $sw->add (my $h = new Gtk2::PodViewer); + + #binmode DATA, ":utf8"; + $h->load_string (do { local $/; }); + } + + $help->show_all; } else { + #$mainwin->show_all; $schnauzer->handle_key ($key, $state); } 1; } -$viewer = new Gtk2::CV::ImageWindow; -$viewer->signal_connect (key_press_event => \&std_keys); -$viewer->signal_connect (delete_event => sub { main_quit Gtk2 }); +{ + $viewer = new Gtk2::CV::ImageWindow; -$schnauzer = new_schnauzer; + $viewer->set_title ("CV: Image"); -if (@ARGV) { - $viewer->load_image ($ARGV[0]); + $viewer->signal_connect (key_press_event => \&std_keys); + $viewer->signal_connect (delete_event => sub { main_quit Gtk2 }); - if (@ARGV > 1) { - $schnauzer->set_paths (\@ARGV); - } + $viewer->signal_connect (button3_press_event => sub { + $mainwin->visible + ? $mainwin->hide + : $mainwin->show_all; + }); + + $schnauzer = new_schnauzer; + + $mainwin = new Gtk2::Window; + $mainwin->set_title ("CV"); + $mainwin->add (my $vbox = new Gtk2::VBox); + + $vbox->add ($schnauzer); + $vbox->add (my $frame = new Gtk2::Frame); + $frame->add (my $hbox = new Gtk2::HBox 0, 0); + $hbox->pack_start ((new Gtk2::Label "Info"), 0, 0, 0); + $hbox->pack_start (($info = new Gtk2::Label), 1, 1, 0); +} + +if (@ARGV) { + $schnauzer->set_paths (\@ARGV); + $schnauzer->handle_key ($Gtk2::Gdk::Keysyms{space}, []); +} else { + $schnauzer->set_dir (File::Spec->curdir); + $mainwin->show_all; } $viewer->show_all; main Gtk2; +__DATA__ + +=head1 NAME + +cv - a fast gtk+ image viewer modeled after xv + +=head1 SYNOPSIS + + cv [file...] + +=head1 DESCRIPTION + +None yet. + +=head2 THE IMAGE WINDOW + +You can use the following keys in the image window: + + q quit the program + < half the image size + > double the image size + , shrink the image by 10% + . enlarge the image by 10% + n reset to normal size + m maximize to screensize + M maxime to screensize, respecting image aspect + u uncrop + r set scaling mode to 'nearest' (fastest) + s set scaling mode to 'bilinear' (default) + S set scaling mode to 'hyper' (slowest) + t rotate clockwise 90° + T rotate counterclockwise° + ctrl-v open a new visual schnauzer window for the current dir + +The following keys are redirected to the default visual schnauzer window: + + space next image + backspace last image + +=head2 THE VISUAL SCHNAUZER + +You can use the following keys in the schnauzer window: + + space move to and display next image + backspace move to and display previous image + return display selected picture + + cursor keys move selection + page-up move one page up + page-down move one page down + home move to first file + end move to last file + + ctrl-g generate icons for the selected files + ctrl-d delete selected files WITHOUT ASKING AGAIN + +=head1 BUGS/TODO + + rotate on disk + print + lots of ui issues + save(?) + preferences + ctrl-u in schnauzer + shift-cursor in schnauzer + +=head1 AUTHOR + +Marc Lehmann . + +=cut