ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/CV/bin/cvc
Revision: 1.28
Committed: Mon Jun 27 18:25:50 2005 UTC (21 years, 3 months ago) by root
Branch: MAIN
Changes since 1.27: +6 -0 lines
Log Message:
*** empty log message ***

File Contents

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