ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CV/bin/cvc
Revision: 1.32
Committed: Wed Jun 29 23:11:00 2005 UTC (18 years, 10 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.31: +0 -0 lines
State: FILE REMOVED
Log Message:
*** empty log message ***

File Contents

# Content
1 #!/opt/bin/perl
2
3 use Gtk2 -init;
4 use Gtk2::Gdk::Keysyms;
5
6 use Gtk2::CV::ImageWindow;
7 use Gtk2::CV::Schnauzer;
8
9 require Gtk2::CV::Plugin;
10 require "$ENV{HOME}/.cvrc" if -r "$ENV{HOME}/.cvrc";
11
12 $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 sub INIT_INSTANCE {
23 my ($self) = @_;
24
25 $self->set_default_size (900, 700);
26
27 my $box = new Gtk2::HPaned;
28 $self->add ($box);
29
30 $box->child2_resize (1);
31 $box->set (position => 260);
32
33 $box->add (my $sw = new Gtk2::ScrolledWindow);
34 $sw->add (
35 $self->{list} = new Gtk2::SimpleList
36 "#" => "int",
37 "Name" => "text",
38 );
39
40 $box->add ($self->{schnauzer} = new Gtk2::CV::Schnauzer);
41 $self->{schnauzer}->set_geometry_hints;
42 $self->{schnauzer}->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
43
44 Gtk2::CV::Plugin->call (new_schnauzer => $self->{schnauzer});
45
46 $self->{list}->get_column(0)->set_sort_column_id(0);
47 $self->{list}->get_column(1)->set_sort_column_id(1);
48
49 $self->{list}->signal_connect (key_press_event => sub {
50 my $key = $_[1]->keyval;
51 my $state = $_[1]->state;
52
53 my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
54
55 if ($key == $Gtk2::Gdk::Keysyms{Up}) {
56 return 0;
57 } elsif ($key == $Gtk2::Gdk::Keysyms{Down}) {
58 return 0;
59 } else {
60 return $self->{schnauzer}->signal_emit (key_press_event => $_[1]);
61 }
62 return 1;
63
64 });
65
66 $self->{list}->signal_connect (cursor_changed => sub {
67 my $row = scalar +($_[0]->get_selection->get_selected_rows)[0]->get_indices;
68
69 my $k = $_[0]{data}[$row][1];
70 $k = $self->{cluster}{$k};
71
72 $self->{schnauzer}->set_paths (
73 [map "$self->{path}/$_", @$k],
74 );
75
76 1;
77
78 });
79 }
80
81 sub analyse {
82 my ($self, $path) = @_;
83
84 opendir my $dir, $path
85 or die "$path: $!";
86
87 $self->{path} = $path;
88
89 my @files = map {
90 my $path = $_ = Glib::filename_to_unicode $_;
91 s/[\-_ ]+/ /g;
92 s/\.[^\.]+$//g;
93 s/(?<=[0-9 ])(?:fc|bc|front|back|cover|lq|hq)?[a-z]{0,3}$//;
94 s/(?<=[0-9])\[\d+\]$//;
95 s/ +$//;
96 [$_, $path]
97 }
98 grep !/\.(sfv|crc|par|par2)$/i, readdir $dir;
99
100 my %cluster;
101 $self->{cluster} = \%cluster;
102
103 my @regexps = (
104 # qr<^(\d\d\d\w?) >,
105 qr<^(.+?)\ *(\d+)$>,
106 qr<^(.+?)\ *\((\d+)\)$>,
107 qr<^(.+?)(\d+)\ +(\d+)$>,
108 qr<^(.+?)(\d+)\ +\((\d+)\)$>,
109
110 qr<((?:199[0-9]|200[0-9])(?:0[1-9]|1[012])(?:0[1-9]|[12][0-9]|3[01]))>,
111 qr<((?:0[1-9]|[12][0-9]|3[01])(?:0[1-9]|1[012])(?:199[0-9]|200[0-9]))>,
112 # qr<^(\d*[^0-9].*?)\ *[0-9_ ]+$>,
113 # qr<^(\d*[^0-9].*?)\ *\([0-9_ ]+\)$>,
114 # qr<^[0-9_ ]+\ *([^0-9].*)$>,
115 # qr<^(.*)[_ \-]+.*?$>,
116 # qr<^.*?[_ \-]+(.*)$>,
117 # qr<^(.*)[_ \-]+\d+[_ \-]+.*?$>,
118 );
119
120 for my $re (@regexps) {
121 for (@files) {
122 #print "$_->[0]\n" if $_->[1] =~ /^kisa.tan/;
123 #if ($_->[0] =~ $re && $_->[0] =~ $info->[1]) {
124 if ($_->[0] =~ $re) {
125 $cluster{$1}{$_->[1]} = 1;
126 # print "PUSH $1 : $_->[1] $_->[0] $re $info->[1] \n";
127 }
128 }
129 }
130 #push @{$cluster{"THE REST"}->[1]}, $_ for keys %chk_files;
131
132 my %file_sorted;
133
134 my @rest;
135 for my $k (keys %cluster) {
136 my @v = keys %{ $cluster{$k }};
137 $cluster{$k} = \@v;
138 if (@v > 2) {
139 push @{$self->{list}{data}}, [scalar @v, $k];
140 $file_sorted{$_} = 1 for @v;
141 }
142 }
143
144 my @remaining = grep !$file_sorted{$_},
145 map $_->[1],
146 @files;
147 $cluster{"REMAINING FILES"} = \@remaining;
148 push @{$self->{list}{data}}, [(scalar @remaining), "REMAINING FILES"];
149 }
150
151 package main;
152
153 sub new_schnauzer {
154 my $w = new Gtk2::Window;
155 $w->add (my $s = new Gtk2::CV::Schnauzer);
156
157 $s->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
158 $s->signal_connect (key_press_event => \&std_keys);
159
160 $s->set_dir (".");
161 $w->show_all;
162
163 $w;
164 }
165
166 sub std_keys {
167 my $key = $_[1]->keyval;
168
169 my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
170
171 if ($key == $Gtk2::Gdk::Keysyms{q}) {
172 main_quit Gtk2;
173 } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) {
174 new_schnauzer;
175 } else {
176 return 0;
177 }
178
179 1;
180 }
181
182 $viewer = new Gtk2::CV::ImageWindow;
183 $viewer->signal_connect (key_press_event => \&std_keys);
184 $viewer->signal_connect (delete_event => sub { main_quit Gtk2 });
185 Gtk2::CV::Plugin->call (new_imagewindow => $viewer);
186 $viewer->show_all;
187
188 my $cluster = new cluster;
189
190 $cluster->analyse ($ARGV[0]);
191 $cluster->show_all;
192
193 main Gtk2;
194
195