ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CV/bin/cv
(Generate patch)

Comparing CV/bin/cv (file contents):
Revision 1.60 by root, Sat Sep 24 00:43:52 2005 UTC vs.
Revision 1.64 by root, Fri Dec 9 18:31:54 2005 UTC

23 23
24use File::Spec; 24use File::Spec;
25 25
26my $mainwin; 26my $mainwin;
27my $viewer; 27my $viewer;
28my $viewer_count;
28my $schnauzer; 29my $schnauzer;
29my $info; 30my $info;
30my $help; 31my $help;
31 32
32my $schnauzer_idx = 0; 33my $schnauzer_idx = 0;
38 $s->signal_connect (activate => sub { 39 $s->signal_connect (activate => sub {
39 my $label = sprintf "%s (%d)", 40 my $label = sprintf "%s (%d)",
40 (File::Spec->splitpath ($_[1]))[2], 41 (File::Spec->splitpath ($_[1]))[2],
41 -s $_[1]; 42 -s $_[1];
42 $info->set_label ($label); 43 $info->set_label ($label);
43 $viewer->load_image ($_[1]); 44 $viewer->load_image ($_[1]) if $viewer; # TODO: error, or chose ANY viewer
44 }); 45 });
45 46
46 Gtk2::CV::Plugin->call (new_schnauzer => $s); 47 Gtk2::CV::Plugin->call (new_schnauzer => $s);
47 48
48 $s 49 $s
50}
51
52sub new_viewer {
53 my $self = new Gtk2::CV::ImageWindow;
54
55 $viewer_count++;
56
57 $self->set_title ("CV: Image");
58
59 $self->signal_connect (key_press_event => sub {
60 $viewer = $_[0];
61
62 my $key = $_[1]->keyval;
63 my $state = $_[1]->state;
64
65 if ($state * "control-mask" && $key == $Gtk2::Gdk::Keysyms{c}) {
66 my $viewer = new_viewer ();
67 $viewer->set_image ($_[0]->{image});
68 $viewer->show_all;
69 1
70 } else {
71 &std_keys
72 or $schnauzer->signal_emit (key_press_event => $_[1])
73 }
74 });
75 $self->signal_connect (delete_event => sub { $_[0]->destroy; 0 });
76 $self->signal_connect (destroy => sub {
77 $viewer = undef if $viewer == $_[0];
78
79 main_quit Gtk2 unless --$viewer_count;
80
81 0
82 });
83
84 $self->signal_connect (button3_press_event => sub {
85 $mainwin->visible
86 ? $mainwin->hide
87 : $mainwin->show_all;
88
89 1
90 });
91
92 Gtk2::CV::Plugin->call (new_imagewindow => $self);
93
94 $self
49} 95}
50 96
51sub std_keys { 97sub std_keys {
52 my $key = $_[1]->keyval; 98 my $key = $_[1]->keyval;
53 my $state = $_[1]->state; 99 my $state = $_[1]->state;
54 100
55 my $ctrl = $state * "control-mask"; 101 my $ctrl = $state * "control-mask";
56 102
57 if ($key == $Gtk2::Gdk::Keysyms{q}) { 103 if ($key == $Gtk2::Gdk::Keysyms{q}) {
58 main_quit Gtk2; 104 $viewer->destroy;
59 } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) { 105 } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) {
60 my $w = new Gtk2::Window; 106 my $w = new Gtk2::Window;
61 107
62 $w->set_title ("CV: Schnauzer"); 108 $w->set_title ("CV: Schnauzer");
63 $w->add (my $s = new_schnauzer); 109 $w->add (my $s = new_schnauzer);
88 134
89 1 135 1
90} 136}
91 137
92{ 138{
93 $viewer = new Gtk2::CV::ImageWindow; 139 $viewer = new_viewer;
94 140 $::cur_viewer = $viewer;
95 $viewer->set_title ("CV: Image");
96
97 $viewer->signal_connect (key_press_event => sub {
98 &std_keys
99 or $schnauzer->signal_emit (key_press_event => $_[1])
100 });
101 $viewer->signal_connect (delete_event => sub { main_quit Gtk2 });
102
103 $viewer->signal_connect (button3_press_event => sub {
104 $mainwin->visible
105 ? $mainwin->hide
106 : $mainwin->show_all;
107 1
108 });
109
110 Gtk2::CV::Plugin->call (new_imagewindow => $viewer);
111 141
112 $schnauzer = new_schnauzer; 142 $schnauzer = new_schnauzer;
113 143
114 $mainwin = new Gtk2::Window; 144 $mainwin = new Gtk2::Window;
115 $mainwin->set_title ("CV"); 145 $mainwin->set_title ("CV");
266 r set scaling mode to 'nearest' (fastest) 296 r set scaling mode to 'nearest' (fastest)
267 s set scaling mode to 'bilinear' (default) 297 s set scaling mode to 'bilinear' (default)
268 shift-s set scaling mode to 'hyper' (slowest) 298 shift-s set scaling mode to 'hyper' (slowest)
269 t rotate clockwise 90° 299 t rotate clockwise 90°
270 T rotate counterclockwise° 300 T rotate counterclockwise°
301 a apply all rotations loslessly to a jpeg file (using exiftran)
271 ctrl-v open a new visual schnauzer window for the current dir 302 ctrl-v open a new visual schnauzer window for the current dir
303 ctrl-c clone the current image window
272 ctrl-e run an editor ($CV_EDITOR or "gimp") on the current image 304 ctrl-e run an editor ($CV_EDITOR or "gimp") on the current image
273 ctrl-p fire up the print dialog 305 ctrl-p fire up the print dialog
274 escape cancel a crop action 306 escape cancel a crop action
275 307
276And when playing movies, these additional keys are active: 308And when playing movies, these additional keys are active:
293Left-clicking into the image window will let you crop the image (usually 325Left-clicking into the image window will let you crop the image (usually
294to zoom into large images that CV scales down). 326to zoom into large images that CV scales down).
295 327
296=head2 THE VISUAL SCHNAUZER 328=head2 THE VISUAL SCHNAUZER
297 329
330Any image-loading action in a schnauzer window acts on the
331"last-recently-activated" imagewindow, which currently is simply the last
332image window that received a keypress.
333
298You can use the following keys in the schnauzer window: 334You can use the following keys in the schnauzer window:
299 335
300 ctrl-space, 336 ctrl-space,
301 space move to and display next image 337 space move to and display next image
302 ctrl-backspace, 338 ctrl-backspace,
335=item Keyboard 371=item Keyboard
336 372
337Moving the cursor with the keyboard will first deselect all files and then 373Moving the cursor with the keyboard will first deselect all files and then
338select the file you moved to. 374select the file you moved to.
339 375
340=item Clicking and Shift-Clicking 376=item Clicking
341 377
342Clicking on an entry will select the one you clicked and (unless Shift is 378Clicking on an entry will select the one you clicked and deselect all
343pressed) deselect all others. 379others.
344 380
345=item Dragging and Shift-Dragging 381=item Shift-Clicking
382
383Shift-clicking will toggle the selection on the entry under the mouse.
384
385=item Dragging
346 386
347Dragging will select all entries between the one selected when pushing the 387Dragging will select all entries between the one selected when pushing the
348button and the one selected when releasing the button. If you move above 388button and the one selected when releasing the button. If you move above
349or below the schnauzer area while drag-selecting, the schnauzer will move 389or below the schnauzer area while drag-selecting, the schnauzer will move
350up/down one row twice per second. In addition, horizontal mouse movement 390up/down one row twice per second. In addition, horizontal mouse movement

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines