ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CV/bin/cvc
Revision: 1.3
Committed: Sun Oct 31 21:29:12 2004 UTC (19 years, 7 months ago) by root
Branch: MAIN
Changes since 1.2: +19 -74 lines
Log Message:
fixed a small bug in schnauzer

File Contents

# User Rev Content
1 root 1.2 #!/opt/perl/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     my ($self, $spec) = @_;
21     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     if ($spec) {
28     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     }
40     print "dirname: '$dirname'\n";
41     mkdir $dirname;
42     $self->{schnauzer}->movesel ($dirname);
43     }
44    
45 root 1.1 sub INIT_INSTANCE {
46     my ($self) = @_;
47    
48 root 1.2 $self->set_default_size (900, 700);
49    
50     $self->{dirlbl} = new Gtk2::Label;
51 root 1.3 $self->{dirlist} = new Gtk2::HBox;
52     for my $n (qw/teen teen hard asian teenhard asianhard young younghard/) {
53     my $btn = Gtk2::Button->new_with_label ($n);
54     $btn->can_focus (0);
55     $self->{dirlist}->pack_start ($btn, 0, 1, 0);
56     $btn->signal_connect (clicked => sub {
57     $self->{dirlbl}->set_text ($n);
58     });
59     $self->{dirlbl}->set_text ($n);
60 root 1.2 }
61 root 1.1
62     my $vbox = new Gtk2::VBox;
63     $self->add ($vbox);
64    
65     my $box = new Gtk2::HBox;
66 root 1.3 $vbox->pack_start ($self->{dirlist}, 0, 1, 0);
67 root 1.2 $vbox->pack_start ($self->{dirlbl}, 0, 1, 0);
68 root 1.1 $vbox->add ($box);
69     $box->add (my $sw = new Gtk2::ScrolledWindow);
70     $sw->add (
71     $self->{list} = new Gtk2::SimpleList
72     "#" => "int",
73     "Name" => "text",
74     );
75    
76     $box->add ($self->{schnauzer} = new Gtk2::CV::Schnauzer);
77 root 1.2 $self->{schnauzer}->{draw}->signal_connect (key_press_event => sub {
78     my $key = $_[1]->keyval;
79 root 1.3 my $state = $_[1]->state;
80 root 1.2
81     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
82     if ($key == $Gtk2::Gdk::Keysyms{m}) {
83     $self->move_pics (0);
84     } elsif ($key == $Gtk2::Gdk::Keysyms{t}) {
85     $self->cycle_move_dir_idx;
86     } else {
87     return 0;
88     }
89     return 1;
90     });
91 root 1.1
92     $self->{schnauzer}->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
93    
94     $self->{list}->get_column(0)->set_sort_column_id(0);
95     $self->{list}->get_column(1)->set_sort_column_id(1);
96    
97 root 1.2 $self->{list}->signal_connect (key_press_event => sub {
98     my $key = $_[1]->keyval;
99 root 1.3 my $state = $_[1]->state;
100 root 1.2
101     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
102    
103 root 1.3 if ($key == $Gtk2::Gdk::Keysyms{t}) {
104 root 1.2 $self->cycle_move_dir_idx;
105     } elsif ($key == $Gtk2::Gdk::Keysyms{m}) {
106     $self->move_pics ($ctrl);
107 root 1.3 } elsif ($key == $Gtk2::Gdk::Keysyms{Up}) {
108     return 0;
109     } elsif ($key == $Gtk2::Gdk::Keysyms{Down}) {
110     return 0;
111 root 1.2 } else {
112 root 1.3 $self->{schnauzer}->handle_key ($key, $state);
113 root 1.2 }
114     return 1;
115    
116     });
117    
118 root 1.1 $self->{list}->signal_connect (cursor_changed => sub {
119     my $row = scalar +($_[0]->get_selection->get_selected_rows)[0]->get_indices;
120    
121     my $k = $_[0]{data}[$row][1];
122     $k = $self->{cluster}{$k};
123    
124     $self->{schnauzer}->set_paths (
125     [map "$self->{path}/$_", @{$k->[1]}],
126     );
127    
128     1;
129    
130     });
131     }
132    
133     sub analyse {
134     my ($self, $path) = @_;
135    
136     opendir my $dir, $path
137     or die "$path: $!";
138    
139     $self->{path} = $path;
140    
141     my @files = map {
142     my $str = $_;
143     $str =~ s/[\-_ ]+/ /g;
144     $str =~ s/\.[^\.]+//g;
145     [$str, $_]
146     }
147     grep !/\.(sfv|crc|par|par2)$/, readdir $dir;
148    
149     my %cluster;
150    
151     my @regexps = (
152     [qr<\d+$>, qr<^(.+?)\ *(\d+)$>],
153     [qr<\ \d+$>, qr<^(.+?)(\d+)\ +(\d+)$>],
154     );
155    
156     for my $info (@regexps) {
157     my $re = $info->[0];
158     for (@files) {
159     if ($_->[0] =~ $re && $_->[0] =~ $info->[1]) {
160     push @{ ($cluster{$1} ||= [ $info, []])->[1] }, $_->[1];
161     }
162     }
163     }
164    
165     $self->{cluster} = \%cluster;
166    
167     while (my ($k, $v) = each %cluster) {
168     my $n = scalar @{$v->[1]};
169     push @{$self->{list}{data}}, [$n, $k] if $n > 2;
170     }
171     }
172    
173     package main;
174    
175     sub new_schnauzer {
176     my $w = new Gtk2::Window;
177     $w->add (my $s = new Gtk2::CV::Schnauzer);
178    
179     $s->signal_connect (activate => sub { $viewer->load_image ($_[1]) });
180     $s->signal_connect (key_press_event => \&std_keys);
181    
182     $s->set_dir (".");
183     $w->show_all;
184    
185     $w;
186     }
187    
188     sub std_keys {
189     my $key = $_[1]->keyval;
190    
191     my $ctrl = grep $_ eq "control-mask", @{$_[1]->state};
192    
193     if ($key == $Gtk2::Gdk::Keysyms{q}) {
194     main_quit Gtk2;
195     } elsif ($ctrl && $key == $Gtk2::Gdk::Keysyms{v}) {
196     new_schnauzer;
197     } else {
198     return 0;
199     }
200    
201     1;
202     }
203    
204     $viewer = new Gtk2::CV::ImageWindow;
205     $viewer->signal_connect (key_press_event => \&std_keys);
206     $viewer->signal_connect (delete_event => sub { main_quit Gtk2 });
207     $viewer->show_all;
208    
209     my $cluster = new cluster;
210    
211 root 1.2 $cluster->analyse ($ARGV[0]);
212 root 1.1 $cluster->show_all;
213    
214     #$viewer->set (path => "/fs/samsung/store-anime-done/yuumi_kazuaki_-_love_to_hajieki_to_sayonara_to_-_150.jpg");
215     #$viewer->set (path => "/root/pix/kvvz.jpg");
216    
217     main Gtk2;
218    
219