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

Comparing kgsueme/bin/kgsueme (file contents):
Revision 1.1 by pcg, Wed May 28 21:30:54 2003 UTC vs.
Revision 1.6 by elmex, Thu May 29 03:11:56 2003 UTC

1#!/opt/bin/perl 1#!/usr/bin/perl -I../lib/
2 2
3use PApp::Util qw(dumpval); # debug only 3#use PApp::Util qw(dumpval); # debug only
4 4
5use Gtk; 5use Gtk;
6use Gtk::Gdk; 6use Gtk::Gdk;
7use Gtk;
8#use Gtk::Gdk::ImlibImage;
9use Gnome;
10init Gnome "kgsueme";
11
7 12
8use KGS::Protocol; 13use KGS::Protocol;
9use KGS::Listener::Debug; 14use KGS::Listener::Debug;
10 15
11use IO::Socket::INET; 16use IO::Socket::INET;
12 17
13use Errno; 18use Errno;
14 19
15init Gtk; 20init Gtk;
21
22$HACK = 1; # do NEVER enable. ;)
23
24our $config;
16 25
17{ 26{
18 use Storable (); 27 use Storable ();
19 use Scalar::Util (); 28 use Scalar::Util ();
20 29
21 my $staterc = "$ENV{HOME}/.kgsueme"; 30 my $staterc = "$ENV{HOME}/.kgsueme";
22 31
23 my $state = -r $staterc ? Storable::retrieve($staterc) : {}; 32 my $state = -r $staterc ? Storable::retrieve($staterc) : {};
24 my @widgets; 33 my @widgets;
34
35 $config = $state->{config} ||= {};
25 36
26 # grr... more gtk+ brokenness 37 # grr... more gtk+ brokenness
27 my %get = ( 38 my %get = (
28 hpane_position => sub { ($_[0]->children)[0]->allocation->[2] }, 39 hpane_position => sub { ($_[0]->children)[0]->allocation->[2] },
29 vpane_position => sub { ($_[0]->children)[0]->allocation->[3] }, 40 vpane_position => sub { ($_[0]->children)[0]->allocation->[3] },
127 my $self = shift; 138 my $self = shift;
128 $self = $self->SUPER::new(@_); 139 $self = $self->SUPER::new(@_);
129 140
130 $self->{conn} = new KGS::Protocol; 141 $self->{conn} = new KGS::Protocol;
131 142
132 $self->login;
133
134 KGS::Listener::Debug->new->listen($self->{conn}); #d# debug only :) 143 KGS::Listener::Debug->new->listen($self->{conn}); #d# debug only :)
135 144
136 $self->listen($self->{conn}); 145 $self->listen($self->{conn});
146
147 $self->{roomlist} = new roomlist conn => $self->{conn};
137 148
138 $self->{window} = new Gtk::Window 'toplevel'; 149 $self->{window} = new Gtk::Window 'toplevel';
139 $self->{window}->set_title('kgsueme'); 150 $self->{window}->set_title('kgsueme');
140 ::state $self->{window}, "main::window", undef, window_size => [400, 100]; 151 ::state $self->{window}, "main::window", undef, window_size => [400, 100];
141 $self->{window}->signal_connect(delete_event => sub { main_quit Gtk }); 152 $self->{window}->signal_connect(delete_event => sub { main_quit Gtk });
142 153
143 $self->{window}->add(my $vbox = new Gtk::VBox); 154 $self->{window}->add(my $vbox = new Gtk::VBox);
144 155
145 $vbox->pack_start(($self->{buttonbox} = new Gtk::HButtonBox), 0, 1, 0); 156 $vbox->pack_start(($buttonbox = new Gtk::HButtonBox), 0, 1, 0);
157 $buttonbox->set_spacing(0);
146 158
147 $self->{buttonbox}->add(my $button = new Gtk::Button "Save Layout"); 159 my $button = sub {
148 signal_connect $button clicked => sub { ::save_state };
149
150 $self->{buttonbox}->add(my $button = new Gtk::Button "Roomlist"); 160 $buttonbox->add(my $button = new Gtk::Button $_[0]);
151 signal_connect $button clicked => sub { 161 signal_connect $button clicked => $_[1];
152 $self->{roomlist} ||= new roomlist conn => $self->{conn};
153 $self->{roomlist}->show;
154 }; 162 };
155 163
164 $button->("Login", sub { $self->login; });
165 $button->("Roomlist", sub { $self->{roomlist}->show; });
166 $button->("Save Config & Layout", sub { ::save_state });
167 $button->("Quit", sub { main_quit Gtk });
168
156 $vbox->pack_start((my $hbox = new Gtk::HBox), 0, 1, 0); 169 $vbox->pack_start((my $hbox = new Gtk::HBox), 0, 1, 0);
157 170
158 $hbox->add(new Gtk::Label "Login"); 171 $hbox->add(new Gtk::Label "Login");
159 172
160 $hbox->add($self->{login} = new_with_max_length Gtk::Entry 12); 173 $hbox->add($self->{login} = new_with_max_length Gtk::Entry 12);
174 $self->{login}->set_text($::config->{login});
175
176 if ($::HACK) {
161 $self->{login}->signal_connect(activate => sub { 177 $self->{login}->signal_connect(activate => sub {
162 $self->{conn}{name} = $self->{login}->get_text; 178 $self->{conn}{name} = $self->{login}->get_text;
163 }); 179 });
180 }
164 181
165 $hbox->add(new Gtk::Label "Password"); 182 $hbox->add(new Gtk::Label "Password");
166 $hbox->add(my $pass = new Gtk::Entry); 183 $hbox->add($self->{password} = new Gtk::Entry);
167 $pass->set_visibility(0); 184 $self->{password}->set_visibility(0);
168 185
169 $vbox->pack_start(($self->{status} = new Gtk::Statusbar), 0, 1, 0); 186 $vbox->pack_start(($self->{status} = new Gtk::Statusbar), 0, 1, 0);
170 187
171 $self->{window}->show_all; 188 $self->{window}->show_all;
172 189
173 $self; 190 $self;
174} 191}
175 192
176sub login { 193sub login {
177 my ($self) = @_; 194 my ($self) = @_;
195
196 $self->{conn}->disconnect;
178 197
179 # initialize new socket and connection 198 # initialize new socket and connection
180 my $sock = new IO::Socket::INET PeerHost => "kgs.kiseido.com", PeerPort => "2379" 199 my $sock = new IO::Socket::INET PeerHost => "kgs.kiseido.com", PeerPort => "2379"
181 or die; 200 or die;
182 201
194 } 213 }
195 $self->{conn}->feed_data($buf); 214 $self->{conn}->feed_data($buf);
196 }; 215 };
197 216
198 # now login 217 # now login
199 $self->{conn}->login("dork", ""); 218 $self->{conn}->login($self->{login}->get_text, $self->{password}->get_text);
200} 219}
201 220
202sub inject_login { 221sub inject_login {
203 my ($self, $msg) = @_; 222 my ($self, $msg) = @_;
204 223
205 ::status("login", "logged in as '$self->{conn}{name}' with status '$msg->{result}'"); 224 ::status("login", "logged in as '$self->{conn}{name}' with status '$msg->{result}'");
206 #$self->{login}->set_text($self->{conn}{name}); 225 $::config->{login} = $self->{conn}{name};
207 226
208 $self->{window}->show_all; 227 if ($msg->{success}) {
228 warn "hiya\n";
229 for (keys %{$::config->{rooms}}) {
230 warn "hiya $_\n";
231 $self->{roomlist}->join_room($_);
232 }
233 }
234
235 warn PApp::Util::dumpval($::config);
209} 236}
210 237
211sub event_disconnect { } 238sub event_disconnect { }
212 239
213############################################################################# 240#############################################################################
224 251
225 $self->{window} = new Gtk::Window 'toplevel'; 252 $self->{window} = new Gtk::Window 'toplevel';
226 $self->{window}->set_title('KGS Rooms'); 253 $self->{window}->set_title('KGS Rooms');
227 ::state $self->{window}, "roomlist::window", undef, window_size => [400, 200]; 254 ::state $self->{window}, "roomlist::window", undef, window_size => [400, 200];
228 255
229 $self->{window}->signal_connect(delete_event => sub { hide $self->{window} }); 256 $self->{window}->signal_connect(delete_event => sub { $self->{window}->hide });
230 257
231 $self->{window}->add(my $vbox = new Gtk::VBox); 258 $self->{window}->add(my $vbox = new Gtk::VBox);
232 259
233 $vbox->pack_start((my $sw = new Gtk::ScrolledWindow), 1, 1, 0); 260 $vbox->pack_start((my $sw = new Gtk::ScrolledWindow), 1, 1, 0);
234 $sw->set_policy("automatic", "always"); 261 $sw->set_policy("automatic", "always");
239 ::state $self->{roomlist}, "roomlist::roomlist", undef, clist_column_widths => [20, 200]; 266 ::state $self->{roomlist}, "roomlist::roomlist", undef, clist_column_widths => [20, 200];
240 267
241 $self->{roomlist}->signal_connect(select_row => sub { 268 $self->{roomlist}->signal_connect(select_row => sub {
242 my $room = $self->{roomlist}->get_row_data($_[1]) 269 my $room = $self->{roomlist}->get_row_data($_[1])
243 or return; 270 or return;
244 $self->{room}{$room->{channel}} ||= new room %$room, conn => $self->{conn}, users => {};
245 $self->{room}{$room->{channel}}->join;
246 $self->{roomlist}->unselect_all; 271 $self->{roomlist}->unselect_all;
272 $self->join_room($room->{channel});
247 }); 273 });
248 274
249 $self; 275 $self;
276}
277
278sub join_room {
279 my ($self, $channel) = @_;
280
281 $self->{room}{$channel} ||= room->new(channel => $channel, conn => $self->{conn}, users => {});
282 $self->{room}{$channel}->join;
250} 283}
251 284
252sub show { 285sub show {
253 my ($self, $msg) = @_; 286 my ($self, $msg) = @_;
254 287
400 433
401sub part { 434sub part {
402 my ($self) = @_; 435 my ($self) = @_;
403 $self->SUPER::part; 436 $self->SUPER::part;
404 437
438 delete $::config->{rooms}{$self->{channel}};
405 $self->{window}->hide_all; 439 $self->{window}->hide_all;
406 $self->event_update; 440 $self->event_update;
407 $self->event_update_games; 441 $self->event_update_games;
408} 442}
409 443
444sub event_join {
445 my ($self) = @_;
446 $self->SUPER::event_join;
447
448 $::config->{rooms}{$self->{channel}} = 1;
449}
450
410sub event_update_roominfo { 451sub event_update_roominfo {
411 my ($self) = @_; 452 my ($self) = @_;
412 453
413 $self->{text}->insert(undef, undef, undef, "$self->{owner}: $self->{description}\n\n"); 454 $self->{text}->insert(undef, undef, undef, "$self->{owner}: $self->{description}\n\n");
414} 455}
440 $self->{window}->signal_connect(delete_event => sub { $self->part }); 481 $self->{window}->signal_connect(delete_event => sub { $self->part });
441 482
442 $self->{window}->add(my $hpane = new Gtk::HPaned); 483 $self->{window}->add(my $hpane = new Gtk::HPaned);
443 ::state $hpane, "game::hpane", undef, hpane_position => 500; 484 ::state $hpane, "game::hpane", undef, hpane_position => 500;
444 485
445 $hpane->add(my $board = new Gtk::Table $self->{size}, $self->{size}, 1); 486 $hpane->add(my $canvas = new Gnome::Canvas);
487 $self->{canvas} = $canvas;
488# $canvas->set_pixels_per_unit(300);
489 $canvas->set_scroll_region(0,0,400,400);
490 $self->{board} = [[]];
491# $canvas->style->bg('normal', $canvas->style->white);
492 {
493 my $croot = $canvas->root;
494 my $cgroup = $croot->new($croot, "Gnome::CanvasGroup");
495 my $w = 400;
496 my $pad = 26;
497 my $box = $cgroup->new($cgroup,"Gnome::CanvasRect",
498 x1 => 0, x2 => $w,
499 y1 => 0, y2 => $w,
500 outline_color => "green",
501 fill_color => "green",
502 width_pixels => 2,
503 );
504 my $box2 = $cgroup->new($cgroup,"Gnome::CanvasRect",
505 x1 => $pad, x2 => $w - $pad,
506 y1 => $pad, y2 => $w - $pad,
507 outline_color => "brown",
508 fill_color => "brown",
509 width_pixels => 2,
510 );
511 my @lines;
512 my $x1 = $pad * 2; # == my $y1 = 30;
513 my $x2 = $w - ($pad * 2); # == my $y2 = 270;
514 my $w = $x2 - $x1;
515 my $s = $self->{size} - 1;
446 516
447 for my $x (0 .. $self->{size} - 1) { 517 for (my $i = 0; $i <= $s; $i++) { # one more iteration for the finishing lines
448 for my $y (0 .. $self->{size} - 1) { 518 push @lines,
449 my $cell = new Gtk::Label; 519 $cgroup->new($cgroup,"Gnome::CanvasLine",
450 $board->attach_defaults($cell, $x, $x + 1, $y, $y + 1); 520 points => [ $x1, $x1 + ($w/$s)*$i, $x1 + $w, $x1 + ($w/$s)*$i ],
451 $self->{board}[$x][$y] = $cell; 521 fill_color => "darkbrown",
522 width_pixels => 1);
523 push @lines,
524 $cgroup->new($cgroup,"Gnome::CanvasLine",
525 points => [ $x1 + ($w/$s)*$i, $x1, $x1 + ($w/$s)*$i, $x1 + $w ],
526 fill_color => "darkbrown",
527 width_pixels => 1);
528 }
529 $self->{board_gfx}->{lines} = \@lines;
530 my $stones = [[]];
531 my $wf = ($w/$s);
532 for (my $x = 0; $x < $self->{size}; $x++) {
533 for (my $y = 0; $y < $self->{size}; $y++) {
534 $stones->[$x]->[$y]->[0] = # black stone
535 $cgroup->new($cgroup,"Gnome::CanvasEllipse",
536 x1 => $x1 + $wf*$x - ($wf/2.2), x2 => $x1 + $wf*$x + ($wf/2),
537 y1 => $x1 + $wf*$y - ($wf/2.2), y2 => $x1 + $wf*$y + ($wf/2),
538 fill_color => "black");
539 $stones->[$x]->[$y]->[0]->hide;
540 $stones->[$x]->[$y]->[1] = # black stone
541 $cgroup->new($cgroup,"Gnome::CanvasEllipse",
542 x1 => $x1 + $wf*$x - ($wf/2.2), x2 => $x1 + $wf*$x + ($wf/2),
543 y1 => $x1 + $wf*$y - ($wf/2.2), y2 => $x1 + $wf*$y + ($wf/2),
544 fill_color => "white");
545 $stones->[$x]->[$y]->[1]->hide;
452 } 546 }
453 } 547 }
548 $self->{board_gfx}->{stones} = $stones;
549
550 # smooth => 1,
551 # spline_steps => 50
552# $line->hide;
553 }
554$canvas->show();
555
454 556
455 $hpane->add(my $vpane = new Gtk::VPaned); 557 $hpane->add(my $vpane = new Gtk::VPaned);
456 ::state $vpane, "game", $self->{name}, vpane_position => 80; 558 ::state $vpane, "game", $self->{name}, vpane_position => 80;
457 559
458 $vpane->add(my $sw = new Gtk::ScrolledWindow); 560 $vpane->add(my $sw = new Gtk::ScrolledWindow);
519} 621}
520 622
521sub event_update_tree { 623sub event_update_tree {
522 my ($self) = @_; 624 my ($self) = @_;
523 625
626# if (not defined $self->{board_pm}) {
627# $self->{board_pm} = new Gtk::Gdk::Pixmap ($self->{board}->window, 100, 100, -1);
628# $self->{board_pm}->draw_rectangle($self->{board}->style->white_gc, 1, 0, 0, 100, 100);
629# }
630# my $red = $self->{board}->window->get_colormap->color_alloc( { red => 65000, green => 0, blue => 0 } );
631# my $red_gc = new Gtk::Gdk::GC ( $self->{board}->window );
632# $red_gc->set_foreground( $red );
633#
634# my $px = $self->{board_pm};
635
524 for my $x (0 .. $self->{size} - 1) { 636 for my $x (0 .. $self->{size} - 1) {
525 for my $y (0 .. $self->{size} - 1) { 637 for my $y (0 .. $self->{size} - 1) {
526 $self->{board}[$x][$y]->set_text(""); 638# $self->{board}[$x][$y] = 0;
639 $self->{board_gfx}->{stones}->[$x]->[$y]->[0]->hide;
640 $self->{board_gfx}->{stones}->[$x]->[$y]->[1]->hide;
527 } 641 }
528 } 642 }
529 643
530 for (0..$self->{node}) { 644 for (0..$self->{node}) {
531 while (my ($k, $v) = each %{$self->{tree}[$_]}) { 645 while (my ($k, $v) = each %{$self->{tree}[$_]}) {
532 if ($k eq "move7") { 646 if ($k eq "move7") {
533 if ($v->[1] < 255) { 647 if ($v->[1] < 255) {
534 $self->{board}[$v->[1]][$v->[2]]->set_text(("X", "O", "-")[$v->[0]]); 648# $self->{board_gfx}->{stones}[$x][$y]->[0]->show;
649 ($v->[0] == 0) &&
650 $self->{board_gfx}->{stones}->[$v->[1]]->[$v->[2]]->[0]->show;
651 ($v->[0] == 1) &&
652 $self->{board_gfx}->{stones}->[$v->[1]]->[$v->[2]]->[1]->show;
653 # $self->{board}[$v->[1]][$v->[2]] = ($v->[0] + 1); # ("X", "O", "-")
654 # 0 1 2 (+1)
535 } 655 }
536 } 656 }
537 } 657 }
538 } 658 }
539} 659}
540 660
661package KGS::Game::Board;
662package KGS::Game::Node;
663package KGS::Game::Tree;
664
5411; 6651;
542 666
543 667
544 668

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines