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