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.3 by pcg, Sat May 31 11:12:22 2003 UTC vs.
Revision 1.10 by pcg, Sat May 31 17:08:11 2003 UTC

3use KGS::Constants; 3use KGS::Constants;
4use KGS::Game::Board; 4use KGS::Game::Board;
5 5
6use base KGS::Listener::Game; 6use base KGS::Listener::Game;
7use base KGS::Game; 7use base KGS::Game;
8
9use base gtk::widget;
8 10
9sub new { 11sub new {
10 my $self = shift; 12 my $self = shift;
11 $self = $self->SUPER::new(@_); 13 $self = $self->SUPER::new(@_);
12 14
13 $self->listen($self->{conn}); 15 $self->listen($self->{conn});
14 16
15 $self->{window} = new Gtk2::Window 'toplevel'; 17 $self->{window} = new Gtk2::Window 'toplevel';
16 my $title = $self->{channel} ? $self->user0." ".$self->user1 : "Game Window"; 18 my $title = $self->{channel} ? $self->owner->as_string." ".$self->opponent_string : "Game Window";
17 $self->{window}->set_title("KGS Game $title"); 19 $self->{window}->set_title("KGS Game $title");
18 gtk::state $self->{window}, "game::window", undef, window_size => [600, 500]; 20 gtk::state $self->{window}, "game::window", undef, window_size => [600, 500];
19 21
20 $self->{window}->signal_connect(delete_event => sub { $self->part; 1 }); 22 $self->{window}->signal_connect(delete_event => sub {
23 if ($self->{joined}) {
24 $self->part;
25 } else {
26 $self->event_part;
27 }
28 1;
29 });
21 30
22 $self->{window}->add(my $hpane = new Gtk2::HPaned); 31 $self->{window}->add($self->{hpane} = new Gtk2::HPaned);
23 gtk::state $hpane, "game::hpane", undef, position => 500; 32 gtk::state $self->{hpane}, "game::hpane", undef, position => 500;
24 33
25 $hpane->pack1((my $vbox = new Gtk2::VBox), 1, 1); 34 $self->{hpane}->pack1((my $vbox = new Gtk2::VBox), 1, 1);
26 35
27 $vbox->pack_start((my $frame = new Gtk2::Frame), 0, 1, 0); 36 $vbox->pack_start((my $frame = new Gtk2::Frame), 0, 1, 0);
28 37
29 # grrr...
30 { 38 {
39 # grrr...
31 $frame->add(my $vbox = new Gtk2::VBox); 40 $frame->add(my $vbox = new Gtk2::VBox);
32 $vbox->add($self->{title} = new Gtk2::Label $title); 41 $vbox->add($self->{title} = new Gtk2::Label $title);
33 42
34 $self->{moveadj} = new Gtk2::Adjustment 0, 0, 1, 0.01, 0.1, 0; 43 $self->{moveadj} = new Gtk2::Adjustment 1, 0, 1, 0.001, 0.05, 0;
35 44
36 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj}); 45 $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj});
37 $scale->set_draw_value (0); 46 $scale->set_draw_value (0);
38 47
39 $self->{moveadj}->signal_connect (value_changed => sub { 48 $self->{moveadj}->signal_connect (value_changed => sub {
48 57
49 $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment}); 58 $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment});
50 }); 59 });
51 } 60 }
52 61
53 #Gtk2::Widget->push_visual (Gtk2::Gdk::Rgb->get_visual); #d# gdk_rgb_* not yet implemented(?)
54 #Gtk2::Widget->push_colormap (Gtk2::Gdk::Rgb->get_cmap);
55 $vbox->pack_start(($self->{canvas} = new Gtk2::DrawingArea), 1, 1, 0); 62 $vbox->pack_start(($self->{canvas} = new Gtk2::DrawingArea), 1, 1, 0);
56 #Gtk2::Widget->pop_colormap;
57 #Gtk2::Widget->pop_visual;
58 63
59 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); 64 $self->{canvas}->signal_connect(configure_event => \&configure_event, $self);
60 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); 65 $self->{canvas}->signal_connect(expose_event => \&expose_event, $self);
61 66
62 $hpane->pack2((my $vpane = new Gtk2::VPaned), 0, 0); 67 $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0);
63 $hpane->set(position_set => 1); 68 $self->{hpane}->set(position_set => 1);
64 gtk::state $vpane, "game", $self->{name}, position => 80; 69 gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80;
65 70
66 $vpane->add(my $sw = new Gtk2::ScrolledWindow); 71 $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow);
67 $sw->set_policy("automatic", "always"); 72 $sw->set_policy("automatic", "always");
68 73
69 if (0) { 74 $sw->add(($self->{userlist} = new gtk::userlist)->widget);
70 $sw->add($self->{userlist} = new_with_titles Gtk2::ListStore "User", "Rank", "Flags");
71 ::clist_autosort $self->{userlist};
72 gtk::state $self->{userlist}, "room::userlist", $self->{name}, clist_column_widths => [120, 30];
73 }
74 75
75 $vpane->add(my $vbox = new Gtk2::VBox); 76 $self->{vpane}->add(my $vbox = new Gtk2::VBox);
76 77
77 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); 78 $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0);
78 $sw->set_policy("automatic", "always"); 79 $sw->set_policy("never", "always");
79 80
80 $sw->add(($self->{text} = new gtk::text)->widget); 81 $sw->add(($self->{text} = new gtk::text)->widget);
81 82
82 $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0); 83 $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0);
83 $self->{entry}->signal_connect(activate => sub { 84 $self->{entry}->signal_connect(activate => sub {
84 my $text = $self->{entry}->get_text; 85 my $text = $self->{entry}->get_text;
85 # add message 86 $self->say($text) if $text =~ /\S/;
86 $self->{entry}->set_text(""); 87 $self->{entry}->set_text("");
87 }); 88 });
88 89
89 $self; 90 $self;
90} 91}
91 92
92sub event_update_users { 93sub event_update_users {
93 my ($self) = @_; 94 my ($self) = @_;
94 95
95 room::event_update_users $self; 96 $self->{userlist}->update($self->{users});
96} 97}
97 98
98sub join { 99sub join {
99 my ($self) = @_; 100 my ($self) = @_;
100 $self->SUPER::join; 101 $self->SUPER::join;
114 delete $self->{stack}; 115 delete $self->{stack};
115 delete $self->{pixbuf}; 116 delete $self->{pixbuf};
116 delete $self->{board_shown}; 117 delete $self->{board_shown};
117 delete $self->{background}; 118 delete $self->{background};
118 $self->repaint_board; 119 $self->repaint_board;
119 1; 120 0;
121}
122
123sub expose_event {
124 my ($widget, $event, $self) = @_;
125
126 $self->{pixbuf} or return;
127
128 my $area = $event->area;
129 my ($ox, $oy, $s) = @{$self->{offsets}};
130
131 $self->redraw (
132 (new Gtk2::Gdk::Rectangle $area->x - $ox, $area->y - $oy, $area->width, $area->height)
133 ->intersect(new Gtk2::Gdk::Rectangle 0, 0, $s, $s)
134 );
135
136 0;
120} 137}
121 138
122# something Gtk2 fixed 139# something Gtk2 fixed
123sub INTERP_NEAREST (){ 'nearest' } 140sub INTERP_NEAREST (){ 'nearest' }
124sub INTERP_TILES (){ 'tiles' } 141sub INTERP_TILES (){ 'tiles' }
235 $y -= $height * 0.5; 252 $y -= $height * 0.5;
236 253
237 for (@c) { 254 for (@c) {
238 my $w = $_->get_width * $s; 255 my $w = $_->get_width * $s;
239 $_->composite ($pixbuf, 256 $_->composite ($pixbuf,
240 $x, $y, $w+0.999, $height+0.999, $x, $y, $s, $s, 257 $x, $y, $w+1, $height+1, $x, $y, $s, $s,
241 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255); 258 $::config->{speed} ? INTERP_NEAREST : INTERP_BILINEAR, 255);
242 259
243 $x += $w + $spacing; 260 $x += $w + $spacing;
244 } 261 }
245 } 262 }
261 return $expose_area unless $self->{board}; 278 return $expose_area unless $self->{board};
262 279
263 my ($w, $h) = ($canvas->allocation->values)[2,3]; 280 my ($w, $h) = ($canvas->allocation->values)[2,3];
264 281
265 my $s = $w > $h ? $h : $w; 282 my $s = $w > $h ? $h : $w;
283
284 return unless $s > 128;
266 285
267 $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s]; 286 $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s];
268 287
269 my $size = $self->{size}; 288 my $size = $self->{size};
270 289
271 my $border = int ($s / ($size + 3) * 0.5); 290 my $border = int ($s / ($size + 3) * 0.5);
272 my $s2 = $s - $border * 2; 291 my $s2 = $s - $border * 2;
273 my $edge = int ($s2 / ($size + 1) * 0.95) - ($::config->{randomize} ? 3 : 0); 292 my $edge = int ($s2 / ($size + 1) * 0.96) - ($::config->{randomize} ? 3 : 0);
274 my $ofs = int ($edge / 2); 293 my $ofs = int ($edge / 2);
275 294
276 my @k = map int ($s2 * $_ / ($size+1) + $border + 0.5), 0 .. $size; 295 my @k = map int ($s2 * $_ / ($size+1) + $border + 0.5), 0 .. $size;
277 296
278 my $pixbuf; 297 my $pixbuf;
282 if ($self->{background}) { 301 if ($self->{background}) {
283 if ($oldboard = $self->{board_shown}) { 302 if ($oldboard = $self->{board_shown}) {
284 $pixbuf = $self->{pixbuf}; 303 $pixbuf = $self->{pixbuf};
285 } else { 304 } else {
286 $pixbuf = $self->{background}->copy; 305 $pixbuf = $self->{background}->copy;
287 $expose_area = [0, 0, $s, $s]; 306 $expose_area = new Gtk2::Gdk::Rectangle 0, 0, $s, $s;
288 } 307 }
289 } else { 308 } else {
290 $expose_area = [0, 0, $s, $s]; 309 $expose_area = new Gtk2::Gdk::Rectangle 0, 0, $s, $s;
291 310
292 my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height); 311 my ($bw, $bh) = ($::board_img->get_width, $::board_img->get_height);
293 312
294 if ($s < $bw && $s < $bh) { 313 if ($s < $bw && $s < $bh) {
295 $pixbuf = new_pixbuf $s, $s, 0; 314 $pixbuf = new_pixbuf $s, $s, 0;
410 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0, 429 $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0,
411 $x + $ox - 1, $y + $oy - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE; 430 $x + $ox - 1, $y + $oy - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE;
412 } 431 }
413} 432}
414 433
415sub expose_event {
416 my ($widget, $event, $self) = @_;
417
418 $self->{pixbuf} or return;
419
420 my $area = $event->area;
421 my ($ox, $oy, $s) = @{$self->{offsets}};
422
423 $self->redraw (
424 (new Gtk2::Gdk::Rectangle $area->x - $ox, $area->y - $oy, $area->width, $area->height)
425 ->intersect(new Gtk2::Gdk::Rectangle 0, 0, $s, $s)
426 );
427
428 1;
429}
430
431sub event_update_tree { 434sub event_update_tree {
432 my ($self) = @_; 435 my ($self) = @_;
433 436
434 $self->{path} = $self->get_path; 437 $self->{path} = $self->get_path;
435
436 $self->{moveadj}->value_changed (); 438 $self->{moveadj}->value_changed if $self->{moveadj};
437} 439}
438 440
439sub event_part { 441sub event_part {
440 my ($self) = @_; 442 my ($self) = @_;
441 $self->SUPER::event_part; 443 $self->SUPER::event_part;
442 (delete $self->{window})->destroy; # hmm.. why does this keep the object alive? puzzling.. ahh.. the callbacks ;)
443 delete $self->{room}{game}{$self->{channel}}; 444 delete $appwin::gamelist->{game}{$self->{channel}};
445 $self->destroy;
444} 446}
445 447
446sub event_move { 448sub event_move {
447 my ($self, $pass) = @_; 449 my ($self, $pass) = @_;
448 sound::play 1, $pass ? "pass" : "move"; 450 sound::play 1, $pass ? "pass" : "move";
449} 451}
450 452
451sub DESTROY {#d#
452 warn "DESTROY(@_)\n";#d#
453}
454
4551; 4531;
456 454

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines