ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CV/bin/cvc
Revision: 1.31
Committed: Wed Jun 29 22:11:56 2005 UTC (18 years, 11 months ago) by root
Branch: MAIN
Changes since 1.30: +11 -7 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.31 # qr<^(\d\d\d\w?) >,
105     qr<^(.+?)\ *(\d+)$>,
106     qr<^(.+?)\ *\((\d+)\)$>,
107     qr<^(.+?)(\d+)\ +(\d+)$>,
108     qr<^(.+?)(\d+)\ +\((\d+)\)$>,
109 root 1.24
110 root 1.26 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 root 1.31 # 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 root 1.1 );
119    
120 root 1.20 for my $re (@regexps) {
121 root 1.1 for (@files) {
122 root 1.19 #print "$_->[0]\n" if $_->[1] =~ /^kisa.tan/;
123 root 1.20 #if ($_->[0] =~ $re && $_->[0] =~ $info->[1]) {
124     if ($_->[0] =~ $re) {
125 root 1.21 $cluster{$1}{$_->[1]} = 1;
126     # print "PUSH $1 : $_->[1] $_->[0] $re $info->[1] \n";
127 root 1.1 }
128     }
129     }
130 root 1.6 #push @{$cluster{"THE REST"}->[1]}, $_ for keys %chk_files;
131 root 1.1
132 root 1.18 my %file_sorted;
133    
134 root 1.6 my @rest;
135 root 1.21 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 root 1.6 }
142     }
143 root 1.18
144     my @remaining = grep !$file_sorted{$_},
145     map $_->[1],
146     @files;
147 root 1.20 $cluster{"REMAINING FILES"} = \@remaining;
148 root 1.18 push @{$self->{list}{data}}, [(scalar @remaining), "REMAINING FILES"];
149 root 1.1 }
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 root 1.28 Gtk2::CV::Plugin->call (new_imagewindow => $viewer);
186 root 1.1 $viewer->show_all;
187    
188     my $cluster = new cluster;
189    
190 root 1.2 $cluster->analyse ($ARGV[0]);
191 root 1.1 $cluster->show_all;
192    
193     main Gtk2;
194    
195