ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/kgsueme/game.pl
(Generate patch)

Comparing kgsueme/kgsueme/game.pl (file contents):
Revision 1.4 by pcg, Sat May 31 13:58:31 2003 UTC vs.
Revision 1.15 by pcg, Sun Jun 1 02:30:00 2003 UTC

5 5
6use base KGS::Listener::Game; 6use base KGS::Listener::Game;
7use base KGS::Game; 7use base KGS::Game;
8 8
9use base gtk::widget; 9use base gtk::widget;
10
11use POSIX qw(ceil);
10 12
11sub new { 13sub new {
12 my $self = shift; 14 my $self = shift;
13 $self = $self->SUPER::new(@_); 15 $self = $self->SUPER::new(@_);
14 16
15 $self->listen($self->{conn}); 17 $self->listen($self->{conn});
16 18
17 $self->{window} = new Gtk2::Window 'toplevel'; 19 $self->{window} = new Gtk2::Window 'toplevel';
18 my $title = $self->{channel} ? $self->owner->{name}." ".$self->opponent_string : "Game Window"; 20 my $title = $self->{channel} ? $self->owner->as_string." ".$self->opponent_string : "Game Window";
19 $self->{window}->set_title("KGS Game $title"); 21 $self->{window}->set_title("KGS Game $title");
20 gtk::state $self->{window}, "game::window", undef, window_size => [600, 500]; 22 gtk::state $self->{window}, "game::window", undef, window_size => [600, 500];
21 23
22 $self->{window}->signal_connect(delete_event => sub { 24 $self->{window}->signal_connect(delete_event => sub {
23 if ($self->{joined}) { 25 if ($self->{joined}) {
33 35
34 $self->{hpane}->pack1((my $vbox = new Gtk2::VBox), 1, 1); 36 $self->{hpane}->pack1((my $vbox = new Gtk2::VBox), 1, 1);
35 37
36 $vbox->pack_start((my $frame = new Gtk2::Frame), 0, 1, 0); 38 $vbox->pack_start((my $frame = new Gtk2::Frame), 0, 1, 0);
37 39
38 # grrr...
39 { 40 {
41 # grrr...
40 $frame->add(my $vbox = new Gtk2::VBox); 42 $frame->add(my $vbox = new Gtk2::VBox);
41 $vbox->add($self->{title} = new Gtk2::Label $title); 43 $vbox->add($self->{title} = new Gtk2::Label $title);
42 44
43 $self->{moveadj} = new Gtk2::Adjustment 0, 0, 1, 0.01, 0.1, 0; 45 $self->{moveadj} = new Gtk2::Adjustment 1, 0, 1, 0.001, 0.05, 0;
44 46
45 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj}); 47 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj});
46 $scale->set_draw_value (0); 48 $scale->set_draw_value (0);
47 49
48 $self->{moveadj}->signal_connect (value_changed => sub { 50 $self->{moveadj}->signal_connect (value_changed => sub {
57 59
58 $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment}); 60 $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment});
59 }); 61 });
60 } 62 }
61 63
62 #Gtk2::Widget->push_visual (Gtk2::Gdk::Rgb->get_visual); #d# gdk_rgb_* not yet implemented(?)
63 #Gtk2::Widget->push_colormap (Gtk2::Gdk::Rgb->get_cmap);
64 $vbox->pack_start(($self->{canvas} = new Gtk2::DrawingArea), 1, 1, 0); 64 $vbox->pack_start(($self->{canvas} = new Gtk2::DrawingArea), 1, 1, 0);
65 #Gtk2::Widget->pop_colormap;
66 #Gtk2::Widget->pop_visual;
67 65
68 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); 66 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self);
69 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); 67 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self);
70 68
71 $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0); 69 $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0);
78 $sw->add(($self->{userlist} = new gtk::userlist)->widget); 76 $sw->add(($self->{userlist} = new gtk::userlist)->widget);
79 77
80 $self->{vpane}->add(my $vbox = new Gtk2::VBox); 78 $self->{vpane}->add(my $vbox = new Gtk2::VBox);
81 79
82 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); 80 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0);
83 $sw->set_policy("automatic", "always"); 81 $sw->set_policy("never", "always");
84 82
85 $sw->add(($self->{text} = new gtk::text)->widget); 83 $sw->add(($self->{text} = new gtk::text)->widget);
86 84
87 $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0); 85 $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0);
88 $self->{entry}->signal_connect(activate => sub { 86 $self->{entry}->signal_connect(activate => sub {
89 my $text = $self->{entry}->get_text; 87 my $text = $self->{entry}->get_text;
90 # add message 88 $self->say($text) if $text =~ /\S/;
91 $self->{entry}->set_text(""); 89 $self->{entry}->set_text("");
92 }); 90 });
93 91
94 $self; 92 $self;
95} 93}
119 delete $self->{stack}; 117 delete $self->{stack};
120 delete $self->{pixbuf}; 118 delete $self->{pixbuf};
121 delete $self->{board_shown}; 119 delete $self->{board_shown};
122 delete $self->{background}; 120 delete $self->{background};
123 $self->repaint_board; 121 $self->repaint_board;
124 1; 122 0;
123}
124
125sub expose_event {
126 my ($widget, $event, $self) = @_;
127
128 $self->{pixbuf} or return;
129
130 my $area = $event->area;
131 my ($ox, $oy, $s) = @{$self->{offsets}};
132
133 $self->redraw (
134 (new Gtk2::Gdk::Rectangle $area->x - $ox, $area->y - $oy, $area->width, $area->height)
135 ->intersect(new Gtk2::Gdk::Rectangle 0, 0, $s, $s)
136 );
137
138 0;
125} 139}
126 140
127# something Gtk2 fixed 141# something Gtk2 fixed
128sub INTERP_NEAREST (){ 'nearest' } 142sub INTERP_NEAREST (){ 'nearest' }
129sub INTERP_TILES (){ 'tiles' } 143sub INTERP_TILES (){ 'tiles' }
164 for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) { 178 for my $stone ($mark & (MARK_W | MARK_GRAY_W) ? @::white_img : @::black_img) {
165 my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 0x00000000; 179 my $base = new_pixbuf $size + $shadow, $size + $shadow, 1, 0x00000000;
166 180
167 # zeroeth the shadow 181 # zeroeth the shadow
168 if ($mark & (MARK_B | MARK_W)) { 182 if ($mark & (MARK_B | MARK_W)) {
169 $::black_img[0]->composite ( 183 $::shadow_img->composite (
170 $base, $shadow, $shadow, $size, $size, $shadow-0.5, $shadow-0.5, 184 $base, $shadow, $shadow, $size, $size, $shadow - 0.5, $shadow - 0.5,
171 $size / $stone->get_width, $size / $stone->get_height, 185 $size / $stone->get_width, $size / $stone->get_height,
172 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 128 186 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192
173 ); 187 );
174 } 188 }
175 189
176 # first the big stones (handicap stones different for effect) 190 # first the big stones (handicap stones different for effect)
177 for ([MARK_B, $mark & MARK_MOVE ? 255 : 192], 191 for ([MARK_B, $mark & MARK_MOVE ? 255 : 192],
179 [MARK_GRAY_B, 128], 193 [MARK_GRAY_B, 128],
180 [MARK_GRAY_W, 128]) { 194 [MARK_GRAY_W, 128]) {
181 my ($mask, $alpha) = @$_; 195 my ($mask, $alpha) = @$_;
182 if ($mark & $mask) { 196 if ($mark & $mask) {
183 $stone->composite ( 197 $stone->composite (
184 $base, 0, 0, $size, $size, -0.5, -0.5, 198 $base, 0, 0, $size, $size, 0, 0,
185 $size / $stone->get_width, $size / $stone->get_height, 199 $size / $stone->get_width, $size / $stone->get_height,
186 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, $alpha 200 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, $alpha
187 ); 201 );
188 } 202 }
189 } 203 }
190 204
191 # then the samll stones 205 # then the small stones
192 for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]], 206 for ([MARK_SMALL_B, $::black_img[$rand % @::black_img]],
193 [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) { 207 [MARK_SMALL_W, $::white_img[$rand % @::white_img]]) {
194 my ($mask, $img) = @$_; 208 my ($mask, $img) = @$_;
195 if ($mark & $mask) { 209 if ($mark & $mask) {
196 $img->composite ( 210 $img->composite (
197 $base, ($size / 4) x2, (int ($size / 2 + 0.5)) x2, ($size / 4 - 0.5) x 2, 211 $base, (ceil ($size / 4)) x2, (ceil ($size / 2)) x2, (ceil ($size / 4)) x2,
198 $size / $img->get_width / 2, $size / $img->get_height / 2, 212 $size / $img->get_width / 2, $size / $img->get_height / 2,
199 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 192 213 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 224
200 ); 214 );
201 } 215 }
202 } 216 }
203 217
204 # and lastly any markers 218 # and lastly any markers
240 $y -= $height * 0.5; 254 $y -= $height * 0.5;
241 255
242 for (@c) { 256 for (@c) {
243 my $w = $_->get_width * $s; 257 my $w = $_->get_width * $s;
244 $_->composite ($pixbuf, 258 $_->composite ($pixbuf,
245 $x, $y, $w+0.999, $height+0.999, $x, $y, $s, $s, 259 $x, $y, $w+1, $height+1, $x, $y, $s, $s,
246 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255); 260 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255);
247 261
248 $x += $w + $spacing; 262 $x += $w + $spacing;
249 } 263 }
250 } 264 }
266 return $expose_area unless $self->{board}; 280 return $expose_area unless $self->{board};
267 281
268 my ($w, $h) = ($canvas->allocation->values)[2,3]; 282 my ($w, $h) = ($canvas->allocation->values)[2,3];
269 283
270 my $s = $w > $h ? $h : $w; 284 my $s = $w > $h ? $h : $w;
285
286 return unless $s > 128;
271 287
272 $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s]; 288 $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s];
273 289
274 my $size = $self->{size}; 290 my $size = $self->{size};
275 291
276 my $border = int ($s / ($size + 3) * 0.5); 292 my $border = int ($s / ($size + 3) * 0.5);
277 my $s2 = $s - $border * 2; 293 my $s2 = $s - $border * 2;
278 my $edge = int ($s2 / ($size + 1) * 0.95) - ($::config->{randomize} ? 3 : 0); 294 my $edge = int ($s2 / ($size + 1) * 0.96) - ($::config->{randomize} ? 3 : 0);
279 my $ofs = int ($edge / 2); 295 my $ofs = int ($edge / 2);
280 296
281 my @k = map int ($s2 * $_ / ($size+1) + $border + 0.5), 0 .. $size; 297 my @k = map int ($s2 * $_ / ($size+1) + $border + 0.5), 0 .. $size;
282 298
283 my $pixbuf; 299 my $pixbuf;
287 if ($self->{background}) { 303 if ($self->{background}) {
288 if ($oldboard = $self->{board_shown}) { 304 if ($oldboard = $self->{board_shown}) {
289 $pixbuf = $self->{pixbuf}; 305 $pixbuf = $self->{pixbuf};
290 } else { 306 } else {
291 $pixbuf = $self->{background}->copy; 307 $pixbuf = $self->{background}->copy;
292 $expose_area = [0, 0, $s, $s]; 308 $expose_area = new Gtk2::Gdk::Rectangle 0, 0, $s, $s;
293 } 309 }
294 } else { 310 } else {
295 $expose_area = [0, 0, $s, $s]; 311 $expose_area = new Gtk2::Gdk::Rectangle 0, 0, $s, $s;
296 312
297 my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height); 313 my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height);
298 314
299 if ($s < $bw && $s < $bh) { 315 if ($s < $bw && $s < $bh) {
300 $pixbuf = new_pixbuf $s, $s, 0; 316 $pixbuf = new_pixbuf $s, $s, 0;
415 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0, 431 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0,
416 $x + $ox - 1, $y + $oy - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE; 432 $x + $ox - 1, $y + $oy - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE;
417 } 433 }
418} 434}
419 435
420sub expose_event {
421 my ($widget, $event, $self) = @_;
422
423 $self->{pixbuf} or return;
424
425 my $area = $event->area;
426 my ($ox, $oy, $s) = @{$self->{offsets}};
427
428 $self->redraw (
429 (new Gtk2::Gdk::Rectangle $area->x - $ox, $area->y - $oy, $area->width, $area->height)
430 ->intersect(new Gtk2::Gdk::Rectangle 0, 0, $s, $s)
431 );
432
433 1;
434}
435
436sub event_update_tree { 436sub event_update_tree {
437 my ($self) = @_; 437 my ($self) = @_;
438 438
439 $self->{path} = $self->get_path; 439 $self->{path} = $self->get_path;
440
441 $self->{moveadj}->value_changed (); 440 $self->{moveadj}->value_changed if $self->{moveadj};
442} 441}
443 442
444sub event_part { 443sub event_part {
445 my ($self) = @_; 444 my ($self) = @_;
446 $self->SUPER::event_part; 445 $self->SUPER::event_part;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines