ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/CV/bin/cvc
Revision: 1.2
Committed: Sun Oct 31 21:01:40 2004 UTC (21 years, 11 months ago) by root
Branch: MAIN
Changes since 1.1: +133 -3 lines
Log Message:
cvc - custom changes for elmex ;)
cv - added documentation for the ctrl+a command
Schnauzer.pm - ctrl+a command (select all)

File Contents

# User Rev Content
1 root 1.2 #!/opt/perl/bin/perl
2 root 1.1
3     use Gtk2 -init;
4     use Gtk2::Gdk::Keysyms;
5    
6     use Gtk2::CV::ImageWindow;
7     use Gtk2::CV::Schnauzer;
8    
9     $VERSION = 0.1;
10    
11     my $viewer;
12    
13     package cluster;
14    
15     use Glib::Object::Subclass Gtk2::Window;
16    
17     use Gtk2::SimpleList;
18    
19 root 1.2 sub select_move_dir {
20     my ($self, $idx) = @_;
21     return unless $idx < scalar @{$self->{dirlist}};
22     $self->{dirlbl}->set_text ("$idx: ".$self->{dirlist}->[$idx]);
23     $self->{diridx} = $idx;
24     }
25     sub cycle_move_dir_idx {
26     my ($self) = @_;
27     my $i = $self->{diridx};
28     if (($i + 1) < scalar @{$self->{dirlist}}) {
29     $i++;
30     } else {
31     $i = 0;
32     }
33     $self->{diridx} = $i;
34     $self->select_move_dir ($i);
35     }
36    
37     sub move_pics {
38     my ($self, $spec) = @_;
39     return unless defined $ARGV[1];
40    
41     # dirname: 2nd program argument + category + name from analyze (in the list)
42     my $dirname = $ARGV[1].'/'.$self->{dirlist}->[$self->{diridx}];
43    
44     # only add the special when ctrl is pressed
45     if ($spec) {
46     my @s = $self->{list}->get_selected_indices;
47     unless (defined $s[0]) {
48     print "nothing selected!\n";
49     return;
50     }
51     my $d = $self->{list}->{data}->[$s[0]]->[1];
52     unless (defined $d) {
53     print "no such name on idx $s[0]\n";
54     }
55     mkdir $dirname;
56     $dirname .= '/'.$d;
57     }
58     print "dirname: '$dirname'\n";
59     mkdir $dirname;
60     $self->{schnauzer}->movesel ($dirname);
61     }
62    
63 root 1.1 sub INIT_INSTANCE {
64     my ($self) = @_;
65    
66 root 1.2 $self->set_default_size (900, 700);
67    
68     $self->{dirlbl} = new Gtk2::Label;
69     $self->{dirlistlbl} = new Gtk2::Label;
70     $self->{dirlist} = [ qw/teen hard asian teenhard asianhard young younghard/ ];
71     my $drlslbl;
72     my $i = 1;
73     for (@{$self->{dirlist}}) {
74     $drlslbl .= "$i: $_, ";
75     $i++;
76     }
77     $self->{dirlistlbl}->set_text ($drlslbl);
78     $self->{diridx} = 0;
79     $self->select_move_dir (0);
80 root 1.1
81     my $vbox = new Gtk2::VBox;
82     $self->add ($vbox);
83    
84     my $box = new Gtk2::HBox;
85 root 1.2 $vbox->pack_start ($self->{dirlistlbl}, 0, 1, 0);
86     $vbox->pack_start ($self->{dirlbl}, 0, 1, 0);
87 root 1.1 $vbox->add ($box);
88     $box->add (my $sw = new Gtk2::ScrolledWindow);
89     $sw->add (
90     $self->{list} = new Gtk2::SimpleList
91     "#" => "int",
92     "Name" => "text",
93     );
94    
95     $box->add ($self->{schnauzer} = new Gtk2::CV::Schnauzer);
96 root 1.2 $self->{schnauzer}->{draw}->signal_connect (key_press_event => sub {
97     my $key = $_[1]->keyval;
98    
99     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
100     if ($key == $Gtk2::Gdk::Keysyms{m}) {
101     $self->move_pics (0);
102     } elsif ($key == $Gtk2::Gdk::Keysyms{1}) {
103     $self->select_move_dir (0);
104     } elsif ($key == $Gtk2::Gdk::Keysyms{2}) {
105     $self->select_move_dir (1);
106     } elsif ($key == $Gtk2::Gdk::Keysyms{3}) {
107     $self->select_move_dir (2);
108     } elsif ($key == $Gtk2::Gdk::Keysyms{4}) {
109     $self->select_move_dir (3);
110     } elsif ($key == $Gtk2::Gdk::Keysyms{5}) {
111     $self->select_move_dir (4);
112     } elsif ($key == $Gtk2::Gdk::Keysyms{6}) {
113     $self->select_move_dir (5);
114     } elsif ($key == $Gtk2::Gdk::Keysyms{7}) {
115     $self->select_move_dir (6);
116     } elsif ($key == $Gtk2::Gdk::Keysyms{8}) {
117     $self->select_move_dir (7);
118     } elsif ($key == $Gtk2::Gdk::Keysyms{9}) {
119     $self->select_move_dir (8);
120     } elsif ($key == $Gtk2::Gdk::Keysyms{t}) {
121     $self->cycle_move_dir_idx;
122     } else {
123     return 0;
124     }
125     return 1;
126     });
127 root 1.1
128     $self->{schnauzer}->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
129    
130     $self->{list}->get_column(0)->set_sort_column_id(0);
131     $self->{list}->get_column(1)->set_sort_column_id(1);
132    
133 root 1.2 $self->{list}->signal_connect (key_press_event => sub {
134     my $key = $_[1]->keyval;
135    
136     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
137    
138     if ($key == $Gtk2::Gdk::Keysyms{a}) {
139     $self->{schnauzer}->selall;
140     } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{d}) {
141     $self->{schnauzer}->delsel;
142     } elsif ($key == $Gtk2::Gdk::Keysyms{u}) {
143     $self->{schnauzer}->update_all;
144     } elsif ($key == $Gtk2::Gdk::Keysyms{1}) {
145     $self->select_move_dir (0);
146     } elsif ($key == $Gtk2::Gdk::Keysyms{2}) {
147     $self->select_move_dir (1);
148     } elsif ($key == $Gtk2::Gdk::Keysyms{3}) {
149     $self->select_move_dir (2);
150     } elsif ($key == $Gtk2::Gdk::Keysyms{4}) {
151     $self->select_move_dir (3);
152     } elsif ($key == $Gtk2::Gdk::Keysyms{5}) {
153     $self->select_move_dir (4);
154     } elsif ($key == $Gtk2::Gdk::Keysyms{6}) {
155     $self->select_move_dir (5);
156     } elsif ($key == $Gtk2::Gdk::Keysyms{7}) {
157     $self->select_move_dir (6);
158     } elsif ($key == $Gtk2::Gdk::Keysyms{8}) {
159     $self->select_move_dir (7);
160     } elsif ($key == $Gtk2::Gdk::Keysyms{9}) {
161     $self->select_move_dir (8);
162     } elsif ($key == $Gtk2::Gdk::Keysyms{t}) {
163     $self->cycle_move_dir_idx;
164     } elsif ($key == $Gtk2::Gdk::Keysyms{m}) {
165     $self->move_pics ($ctrl);
166     } else {
167     return 0;
168     }
169     return 1;
170    
171     });
172    
173 root 1.1 $self->{list}->signal_connect (cursor_changed => sub {
174     my $row = scalar +($_[0]->get_selection->get_selected_rows)[0]->get_indices;
175    
176     my $k = $_[0]{data}[$row][1];
177     $k = $self->{cluster}{$k};
178    
179     $self->{schnauzer}->set_paths (
180     [map "$self->{path}/$_", @{$k->[1]}],
181     );
182    
183     1;
184    
185     });
186     }
187    
188     sub analyse {
189     my ($self, $path) = @_;
190    
191     opendir my $dir, $path
192     or die "$path: $!";
193    
194     $self->{path} = $path;
195    
196     my @files = map {
197     my $str = $_;
198     $str =~ s/[\-_ ]+/ /g;
199     $str =~ s/\.[^\.]+//g;
200     [$str, $_]
201     }
202     grep !/\.(sfv|crc|par|par2)$/, readdir $dir;
203    
204     my %cluster;
205    
206     my @regexps = (
207     [qr<\d+$>, qr<^(.+?)\ *(\d+)$>],
208     [qr<\ \d+$>, qr<^(.+?)(\d+)\ +(\d+)$>],
209     );
210    
211     for my $info (@regexps) {
212     my $re = $info->[0];
213     for (@files) {
214     if ($_->[0] =~ $re && $_->[0] =~ $info->[1]) {
215     push @{ ($cluster{$1} ||= [ $info, []])->[1] }, $_->[1];
216     }
217     }
218     }
219    
220     $self->{cluster} = \%cluster;
221    
222     while (my ($k, $v) = each %cluster) {
223     my $n = scalar @{$v->[1]};
224     push @{$self->{list}{data}}, [$n, $k] if $n > 2;
225     }
226     }
227    
228     package main;
229    
230     sub new_schnauzer {
231     my $w = new Gtk2::Window;
232     $w->add (my $s = new Gtk2::CV::Schnauzer);
233    
234     $s->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
235     $s->signal_connect (key_press_event => \&std_keys);
236    
237     $s->set_dir (".");
238     $w->show_all;
239    
240     $w;
241     }
242    
243     sub std_keys {
244     my $key = $_[1]->keyval;
245    
246     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
247    
248     if ($key == $Gtk2::Gdk::Keysyms{q}) {
249     main_quit Gtk2;
250     } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) {
251     new_schnauzer;
252     } else {
253     return 0;
254     }
255    
256     1;
257     }
258    
259     $viewer = new Gtk2::CV::ImageWindow;
260     $viewer->signal_connect (key_press_event => \&std_keys);
261     $viewer->signal_connect (delete_event => sub { main_quit Gtk2 });
262     $viewer->show_all;
263    
264     my $cluster = new cluster;
265    
266 root 1.2 $cluster->analyse ($ARGV[0]);
267 root 1.1 $cluster->show_all;
268    
269     #$viewer->set (path => "/fs/samsung/store-anime-done/yuumi_kazuaki_-_love_to_hajieki_to_sayonara_to_-_150.jpg");
270     #$viewer->set (path => "/root/pix/kvvz.jpg");
271    
272     main Gtk2;
273    
274