ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CV/bin/cvc
Revision: 1.14
Committed: Sat Feb 12 19:29:46 2005 UTC (19 years, 4 months ago) by root
Branch: MAIN
Changes since 1.13: +2 -2 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     my $str = $_;
132 root 1.1 $str =~ s/[\-_ ]+/ /g;
133 root 1.9 $str =~ s/\.[^\.]+$//g;
134 root 1.14 $str =~ s/(?<=[0-9 ])(?:fc|bc|front|back|cover)[a-z]?$//;
135 root 1.1 [$str, $_]
136     }
137     grep !/\.(sfv|crc|par|par2)$/, readdir $dir;
138    
139     my %cluster;
140    
141     my @regexps = (
142 root 1.14 [qr<\d+$>, qr<^(.+?)\ *[0-9 ]+$>],
143 root 1.12 [qr<\([0-9 ]+\)$>, qr<^(.+?)[_ ]*\([0-9 ]\)$>],
144     [qr<\ [0-9 ]+$>, qr<^(.+?)\d+\ +[0-9 ]$>],
145     [qr<\ \([0-9 ]+\)$>, qr<^(.+?)\d+\ +\([0-9 ]\)$>],
146     [qr<^[0-9 ]\ >, qr<^[0-9 ]\ (.+)$>],
147 root 1.1 );
148    
149 root 1.5 my %chk_files;
150     $chk_files{$_->[1]} = 1 for @files;
151 root 1.1 for my $info (@regexps) {
152     my $re = $info->[0];
153     for (@files) {
154     if ($_->[0] =~ $re && $_->[0] =~ $info->[1]) {
155     push @{ ($cluster{$1} ||= [ $info, []])->[1] }, $_->[1];
156 root 1.5 delete $chk_files{$_->[1]};
157 root 1.6 # print "PUSH $1 : $_->[1] $_->[0] $re $info->[1] \n";
158 root 1.1 }
159     }
160     }
161 root 1.6 #push @{$cluster{"THE REST"}->[1]}, $_ for keys %chk_files;
162 root 1.1
163     $self->{cluster} = \%cluster;
164    
165 root 1.6 my @rest;
166 root 1.1 while (my ($k, $v) = each %cluster) {
167     my $n = scalar @{$v->[1]};
168     push @{$self->{list}{data}}, [$n, $k] if $n > 2;
169 root 1.6 if ($n <= 2) {
170     push @rest, $k
171     }
172     }
173     $cluster{"THE REST"} = [ [], [] ];
174     for my $r (@rest) {
175     push @{$cluster{"THE REST"}->[1]}, $_ for @{$cluster{$r}->[1]};
176     delete $cluster{$_};
177 root 1.1 }
178 root 1.6 push @{$cluster{"THE REST"}->[1]}, $_ for keys %chk_files;
179     push @{$self->{list}{data}}, [(scalar @{$cluster{"THE REST"}->[1]}), "THE REST"];
180 root 1.1 }
181    
182     package main;
183    
184     sub new_schnauzer {
185     my $w = new Gtk2::Window;
186     $w->add (my $s = new Gtk2::CV::Schnauzer);
187    
188     $s->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
189     $s->signal_connect (key_press_event => \&std_keys);
190    
191     $s->set_dir (".");
192     $w->show_all;
193    
194     $w;
195     }
196    
197     sub std_keys {
198     my $key = $_[1]->keyval;
199    
200     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
201    
202     if ($key == $Gtk2::Gdk::Keysyms{q}) {
203     main_quit Gtk2;
204     } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) {
205     new_schnauzer;
206     } else {
207     return 0;
208     }
209    
210     1;
211     }
212    
213     $viewer = new Gtk2::CV::ImageWindow;
214     $viewer->signal_connect (key_press_event => \&std_keys);
215     $viewer->signal_connect (delete_event => sub { main_quit Gtk2 });
216     $viewer->show_all;
217    
218     my $cluster = new cluster;
219    
220 root 1.2 $cluster->analyse ($ARGV[0]);
221 root 1.1 $cluster->show_all;
222    
223     #$viewer->set (path => "/fs/samsung/store-anime-done/yuumi_kazuaki_-_love_to_hajieki_to_sayonara_to_-_150.jpg");
224     #$viewer->set (path => "/root/pix/kvvz.jpg");
225    
226     main Gtk2;
227    
228