ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CV/bin/cvc
Revision: 1.17
Committed: Sat Feb 12 19:51:01 2005 UTC (19 years, 3 months ago) by root
Branch: MAIN
Changes since 1.16: +1 -1 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     $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.8 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.6 my $box = new Gtk2::HBox;
53     $self->add ($box);
54 root 1.1
55     $box->add (my $sw = new Gtk2::ScrolledWindow);
56     $sw->add (
57     $self->{list} = new Gtk2::SimpleList
58     "#" => "int",
59     "Name" => "text",
60     );
61    
62     $box->add ($self->{schnauzer} = new Gtk2::CV::Schnauzer);
63 root 1.6 #$self->{schnauzer}->{draw}->signal_connect (key_press_event => sub {
64     # my $key = $_[1]->keyval;
65     # my $state = $_[1]->state;
66     #
67     # my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
68     # if ($ctrl && $key == $Gtk2::Gdk::Keysyms{c}) {
69     # $self->move_pics (0, $self->{direntry}->get_text())
70     # if ($self->{direntry}->get_text() ne "")
71     # } else {
72     # return 0;
73     # }
74     # return 1;
75     #});
76 root 1.1
77     $self->{schnauzer}->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
78    
79     $self->{list}->get_column(0)->set_sort_column_id(0);
80     $self->{list}->get_column(1)->set_sort_column_id(1);
81    
82 root 1.2 $self->{list}->signal_connect (key_press_event => sub {
83     my $key = $_[1]->keyval;
84 root 1.3 my $state = $_[1]->state;
85 root 1.2
86     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
87    
88 root 1.3 if ($key == $Gtk2::Gdk::Keysyms{t}) {
89 root 1.2 $self->cycle_move_dir_idx;
90     } elsif ($key == $Gtk2::Gdk::Keysyms{m}) {
91     $self->move_pics ($ctrl);
92 root 1.5 } elsif ($key == $Gtk2::Gdk::Keysyms{c}) {
93     $self->move_pics (0, $self->{direntry}->get_text())
94     if ($self->{direntry}->get_text() ne "")
95 root 1.3 } elsif ($key == $Gtk2::Gdk::Keysyms{Up}) {
96     return 0;
97     } elsif ($key == $Gtk2::Gdk::Keysyms{Down}) {
98     return 0;
99 root 1.2 } else {
100 root 1.3 $self->{schnauzer}->handle_key ($key, $state);
101 root 1.2 }
102     return 1;
103    
104     });
105    
106 root 1.1 $self->{list}->signal_connect (cursor_changed => sub {
107     my $row = scalar +($_[0]->get_selection->get_selected_rows)[0]->get_indices;
108    
109     my $k = $_[0]{data}[$row][1];
110     $k = $self->{cluster}{$k};
111    
112     $self->{schnauzer}->set_paths (
113     [map "$self->{path}/$_", @{$k->[1]}],
114     );
115    
116     1;
117    
118     });
119     }
120    
121     sub analyse {
122     my ($self, $path) = @_;
123    
124     opendir my $dir, $path
125     or die "$path: $!";
126    
127     $self->{path} = $path;
128    
129     my @files = map {
130 root 1.11 $_ = Glib::filename_to_unicode $_;
131 root 1.15 my $path = $_;
132     s/[\-_ ]+/ /g;
133     s/\.[^\.]+$//g;
134     s/(?<=[0-9 ])(?:fc|bc|front|back|cover)[a-z]?$//;
135     s/ +$//;
136     [$_, $path]
137 root 1.1 }
138 root 1.15 grep !/\.(sfv|crc|par|par2)$/i, readdir $dir;
139 root 1.1
140     my %cluster;
141    
142     my @regexps = (
143 root 1.17 [qr<\d$>, qr<^(.+?)\ *[0-9 ]+$>],
144 root 1.16 [qr<\([0-9 ]+\)$>, qr<^(.+?)\ *\([0-9 ]+\)$>],
145     [qr<\ [0-9 ]+$>, qr<^(.+?)\d+\ +[0-9 ]+$>],
146     [qr<\ \([0-9 ]+\)$>, qr<^(.+?)\d+\ +\([0-9 ]+\)$>],
147     [qr<^[0-9 ]+\ >, qr<^[0-9 ]+\ (.+)$>],
148 root 1.1 );
149    
150 root 1.5 my %chk_files;
151     $chk_files{$_->[1]} = 1 for @files;
152 root 1.1 for my $info (@regexps) {
153     my $re = $info->[0];
154     for (@files) {
155     if ($_->[0] =~ $re && $_->[0] =~ $info->[1]) {
156     push @{ ($cluster{$1} ||= [ $info, []])->[1] }, $_->[1];
157 root 1.5 delete $chk_files{$_->[1]};
158 root 1.6 # print "PUSH $1 : $_->[1] $_->[0] $re $info->[1] \n";
159 root 1.1 }
160     }
161     }
162 root 1.6 #push @{$cluster{"THE REST"}->[1]}, $_ for keys %chk_files;
163 root 1.1
164     $self->{cluster} = \%cluster;
165    
166 root 1.6 my @rest;
167 root 1.1 while (my ($k, $v) = each %cluster) {
168     my $n = scalar @{$v->[1]};
169     push @{$self->{list}{data}}, [$n, $k] if $n > 2;
170 root 1.6 if ($n <= 2) {
171     push @rest, $k
172     }
173     }
174     $cluster{"THE REST"} = [ [], [] ];
175     for my $r (@rest) {
176     push @{$cluster{"THE REST"}->[1]}, $_ for @{$cluster{$r}->[1]};
177     delete $cluster{$_};
178 root 1.1 }
179 root 1.6 push @{$cluster{"THE REST"}->[1]}, $_ for keys %chk_files;
180     push @{$self->{list}{data}}, [(scalar @{$cluster{"THE REST"}->[1]}), "THE REST"];
181 root 1.1 }
182    
183     package main;
184    
185     sub new_schnauzer {
186     my $w = new Gtk2::Window;
187     $w->add (my $s = new Gtk2::CV::Schnauzer);
188    
189     $s->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
190     $s->signal_connect (key_press_event => \&std_keys);
191    
192     $s->set_dir (".");
193     $w->show_all;
194    
195     $w;
196     }
197    
198     sub std_keys {
199     my $key = $_[1]->keyval;
200    
201     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
202    
203     if ($key == $Gtk2::Gdk::Keysyms{q}) {
204     main_quit Gtk2;
205     } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) {
206     new_schnauzer;
207     } else {
208     return 0;
209     }
210    
211     1;
212     }
213    
214     $viewer = new Gtk2::CV::ImageWindow;
215     $viewer->signal_connect (key_press_event => \&std_keys);
216     $viewer->signal_connect (delete_event => sub { main_quit Gtk2 });
217     $viewer->show_all;
218    
219     my $cluster = new cluster;
220    
221 root 1.2 $cluster->analyse ($ARGV[0]);
222 root 1.1 $cluster->show_all;
223    
224     #$viewer->set (path => "/fs/samsung/store-anime-done/yuumi_kazuaki_-_love_to_hajieki_to_sayonara_to_-_150.jpg");
225     #$viewer->set (path => "/root/pix/kvvz.jpg");
226    
227     main Gtk2;
228    
229