ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/CV/bin/cvc
Revision: 1.30
Committed: Mon Jun 27 20:24:35 2005 UTC (21 years, 3 months ago) by root
Branch: MAIN
Changes since 1.29: +1 -5 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 root 1.28 require Gtk2::CV::Plugin;
10     require "$ENV{HOME}/.cvrc" if -r "$ENV{HOME}/.cvrc";
11    
12 root 1.1 $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 root 1.2 $self->set_default_size (900, 700);
26    
27 root 1.25 my $box = new Gtk2::HPaned;
28 root 1.6 $self->add ($box);
29 root 1.1
30 root 1.25 $box->child2_resize (1);
31     $box->set (position => 260);
32    
33 root 1.1 $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 root 1.25 $self->{schnauzer}->set_geometry_hints;
42 root 1.1 $self->{schnauzer}->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
43    
44 root 1.28 Gtk2::CV::Plugin->call (new_schnauzer => $self->{schnauzer});
45    
46 root 1.1 $self->{list}->get_column(0)->set_sort_column_id(0);
47     $self->{list}->get_column(1)->set_sort_column_id(1);
48    
49 root 1.2 $self->{list}->signal_connect (key_press_event => sub {
50     my $key = $_[1]->keyval;
51 root 1.3 my $state = $_[1]->state;
52 root 1.2
53     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
54    
55 root 1.30 if ($key == $Gtk2::Gdk::Keysyms{Up}) {
56 root 1.3 return 0;
57     } elsif ($key == $Gtk2::Gdk::Keysyms{Down}) {
58     return 0;
59 root 1.2 } else {
60 root 1.29 return $self->{schnauzer}->signal_emit (key_press_event => $_[1]);
61 root 1.2 }
62     return 1;
63    
64     });
65    
66 root 1.1 $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 root 1.20 [map "$self->{path}/$_", @$k],
74 root 1.1 );
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 root 1.18 my $path = $_ = Glib::filename_to_unicode $_;
91 root 1.15 s/[\-_ ]+/ /g;
92     s/\.[^\.]+$//g;
93 root 1.20 s/(?<=[0-9 ])(?:fc|bc|front|back|cover|lq|hq)?[a-z]{0,3}$//;
94     s/(?<=[0-9])\[\d+\]$//;
95 root 1.15 s/ +$//;
96     [$_, $path]
97 root 1.1 }
98 root 1.15 grep !/\.(sfv|crc|par|par2)$/i, readdir $dir;
99 root 1.1
100     my %cluster;
101 root 1.20 $self->{cluster} = \%cluster;
102 root 1.1
103     my @regexps = (
104 root 1.24 qr<^(\d\d\d\w?) >,
105    
106 root 1.26 qr<((?:199[0-9]|200[0-9])(?:0[1-9]|1[012])(?:0[1-9]|[12][0-9]|3[01]))>,
107     qr<((?:0[1-9]|[12][0-9]|3[01])(?:0[1-9]|1[012])(?:199[0-9]|200[0-9]))>,
108 root 1.27 qr<^(\d*[^0-9].*?)\ *[0-9_ ]+$>,
109     qr<^(\d*[^0-9].*?)\ *\([0-9_ ]+\)$>,
110 root 1.25 qr<^[0-9_ ]+\ *([^0-9].*)$>,
111 root 1.27 qr<^(.*)[_ \-]+.*?$>,
112     qr<^.*?[_ \-]+(.*)$>,
113     qr<^(.*)[_ \-]+\d+[_ \-]+.*?$>,
114 root 1.1 );
115    
116 root 1.20 for my $re (@regexps) {
117 root 1.1 for (@files) {
118 root 1.19 #print "$_->[0]\n" if $_->[1] =~ /^kisa.tan/;
119 root 1.20 #if ($_->[0] =~ $re && $_->[0] =~ $info->[1]) {
120     if ($_->[0] =~ $re) {
121 root 1.21 $cluster{$1}{$_->[1]} = 1;
122     # print "PUSH $1 : $_->[1] $_->[0] $re $info->[1] \n";
123 root 1.1 }
124     }
125     }
126 root 1.6 #push @{$cluster{"THE REST"}->[1]}, $_ for keys %chk_files;
127 root 1.1
128 root 1.18 my %file_sorted;
129    
130 root 1.6 my @rest;
131 root 1.21 for my $k (keys %cluster) {
132     my @v = keys %{ $cluster{$k }};
133     $cluster{$k} = \@v;
134     if (@v > 2) {
135     push @{$self->{list}{data}}, [scalar @v, $k];
136     $file_sorted{$_} = 1 for @v;
137 root 1.6 }
138     }
139 root 1.18
140     my @remaining = grep !$file_sorted{$_},
141     map $_->[1],
142     @files;
143 root 1.20 $cluster{"REMAINING FILES"} = \@remaining;
144 root 1.18 push @{$self->{list}{data}}, [(scalar @remaining), "REMAINING FILES"];
145 root 1.1 }
146    
147     package main;
148    
149     sub new_schnauzer {
150     my $w = new Gtk2::Window;
151     $w->add (my $s = new Gtk2::CV::Schnauzer);
152    
153     $s->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
154     $s->signal_connect (key_press_event => \&std_keys);
155    
156     $s->set_dir (".");
157     $w->show_all;
158    
159     $w;
160     }
161    
162     sub std_keys {
163     my $key = $_[1]->keyval;
164    
165     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
166    
167     if ($key == $Gtk2::Gdk::Keysyms{q}) {
168     main_quit Gtk2;
169     } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) {
170     new_schnauzer;
171     } else {
172     return 0;
173     }
174    
175     1;
176     }
177    
178     $viewer = new Gtk2::CV::ImageWindow;
179     $viewer->signal_connect (key_press_event => \&std_keys);
180     $viewer->signal_connect (delete_event => sub { main_quit Gtk2 });
181 root 1.28 Gtk2::CV::Plugin->call (new_imagewindow => $viewer);
182 root 1.1 $viewer->show_all;
183    
184     my $cluster = new cluster;
185    
186 root 1.2 $cluster->analyse ($ARGV[0]);
187 root 1.1 $cluster->show_all;
188    
189     main Gtk2;
190    
191