ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/CV/bin/cvc
Revision: 1.5
Committed: Mon Nov 1 11:05:11 2004 UTC (21 years, 11 months ago) by root
Branch: MAIN
Changes since 1.4: +40 -6 lines
Log Message:
added mouse whell to schnauzer

File Contents

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