ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CV/bin/cvc
Revision: 1.6
Committed: Tue Feb 8 06:16:34 2005 UTC (19 years, 4 months ago) by root
Branch: MAIN
Changes since 1.5: +33 -60 lines
Log Message:
some 'improvements'

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