… | |
… | |
27 | # new_from_file Gtk::Gdk::Pixbuf "$IMGDIR/$_[0]" |
27 | # new_from_file Gtk::Gdk::Pixbuf "$IMGDIR/$_[0]" |
28 | load_image Gtk::Gdk::ImlibImage "$IMGDIR/$_[0]" |
28 | load_image Gtk::Gdk::ImlibImage "$IMGDIR/$_[0]" |
29 | or die "$IMGDIR/$_[0]: $!"; |
29 | or die "$IMGDIR/$_[0]: $!"; |
30 | } |
30 | } |
31 | |
31 | |
32 | our @black_img = load_img "b01-100x102.png"; |
32 | our @black_img = load_img "b-01.png"; |
33 | our @white_img = map +(load_img "w0$_-100x102_retouched.png"), 1,2,3; |
33 | our @white_img = map +(load_img "w-0$_.png"), 1,2,3,4,5; |
34 | our $board_img = load_img "woodgrain-01.jpg"; |
34 | our $board_img = load_img "woodgrain-01.jpg"; |
35 | |
35 | |
36 | { |
36 | { |
37 | use Storable (); |
37 | use Storable (); |
38 | use Scalar::Util (); |
38 | use Scalar::Util (); |
… | |
… | |
44 | |
44 | |
45 | $config = $state->{config} ||= {}; |
45 | $config = $state->{config} ||= {}; |
46 | |
46 | |
47 | # grr... more gtk+ brokenness |
47 | # grr... more gtk+ brokenness |
48 | my %get = ( |
48 | my %get = ( |
|
|
49 | hpane_position => sub { ($_[0]->children)[0]->allocation->[2] }, |
|
|
50 | vpane_position => sub { ($_[0]->children)[0]->allocation->[3] }, |
49 | window_size => sub { [ @{$_[0]->allocation}[2,3] ] }, |
51 | window_size => sub { [ @{$_[0]->allocation}[2,3] ] }, |
50 | #window_pos => sub { die PApp::Util::dumpval [ $_[0]->get_root_origin ] }, |
52 | #window_pos => sub { die PApp::Util::dumpval [ $_[0]->get_root_origin ] }, |
51 | clist_column_widths => sub { |
53 | clist_column_widths => sub { |
52 | $_[0]{column_widths}; |
54 | $_[0]{column_widths}; |
53 | }, |
55 | }, |
… | |
… | |
296 | |
298 | |
297 | $self->msg(list_rooms => group => $_) for 0..5; # fetch all room names (should not!) |
299 | $self->msg(list_rooms => group => $_) for 0..5; # fetch all room names (should not!) |
298 | $self->{window}->show_all; |
300 | $self->{window}->show_all; |
299 | } |
301 | } |
300 | |
302 | |
301 | sub event_update { |
303 | sub event_update_rooms { |
302 | my ($self) = @_; |
304 | my ($self) = @_; |
303 | |
305 | |
304 | $self->{event_update} ||= Gtk->timeout_add(200, sub { |
306 | $self->{event_update} ||= Gtk->timeout_add(200, sub { |
305 | my $l = $self->{roomlist}; |
307 | my $l = $self->{roomlist}; |
306 | |
308 | |
… | |
… | |
383 | ::state $self->{userlist}, "room::userlist", $self->{name}, clist_column_widths => [120, 30]; |
385 | ::state $self->{userlist}, "room::userlist", $self->{name}, clist_column_widths => [120, 30]; |
384 | |
386 | |
385 | $self; |
387 | $self; |
386 | } |
388 | } |
387 | |
389 | |
388 | sub event_update { |
390 | sub event_update_users { |
389 | my ($self) = @_; |
391 | my ($self) = @_; |
390 | |
392 | |
391 | $self->{event_update} ||= Gtk->timeout_add(200, sub { |
393 | $self->{event_update} ||= Gtk->timeout_add(200, sub { |
392 | my $l = $self->{userlist}; |
394 | my $l = $self->{userlist}; |
393 | |
395 | |
… | |
… | |
473 | ############################################################################# |
475 | ############################################################################# |
474 | |
476 | |
475 | package game; |
477 | package game; |
476 | |
478 | |
477 | use KGS::Constants; |
479 | use KGS::Constants; |
|
|
480 | use KGS::Game::Board; |
478 | |
481 | |
479 | use base KGS::Listener::Game; |
482 | use base KGS::Listener::Game; |
480 | use base KGS::Game; |
483 | use base KGS::Game; |
481 | |
484 | |
482 | sub new { |
485 | sub new { |
… | |
… | |
492 | $self->{window}->signal_connect(delete_event => sub { $self->part; 1 }); |
495 | $self->{window}->signal_connect(delete_event => sub { $self->part; 1 }); |
493 | |
496 | |
494 | $self->{window}->add(my $hpane = new Gtk::HPaned); |
497 | $self->{window}->add(my $hpane = new Gtk::HPaned); |
495 | ::state $hpane, "game::hpane", undef, hpane_position => 500; |
498 | ::state $hpane, "game::hpane", undef, hpane_position => 500; |
496 | |
499 | |
497 | $::config{aa}++; |
500 | $::config{aa} = 0; |
498 | $self->{canvas} = $::config{aa} ? new_aa Gnome::Canvas : new Gnome::Canvas; |
501 | $self->{canvas} = $::config{aa} ? new_aa Gnome::Canvas : new Gnome::Canvas; |
499 | $hpane->add($self->{canvas}); |
502 | $hpane->add($self->{canvas}); |
500 | |
503 | |
501 | $self->{canvas}->signal_connect(size_allocate => sub { |
504 | { |
502 | warn "@_ @{$_[1]}"; |
|
|
503 | #$self->{canvas}->set_pixels_per_unit( |
|
|
504 | }); |
|
|
505 | |
|
|
506 | my $line_colour = $::config{line_colour} || "darkbrown"; |
505 | my $line_colour = $::config{line_colour} || "darkbrown"; |
507 | my $border = 0.1; |
506 | my $border = 0.1; |
508 | |
507 | my $ofs = 0.5 / $self->{size}; |
509 | $self->{canvas}->set_pixels_per_unit(300); |
|
|
510 | $self->{canvas}->set_scroll_region(-$border,-$border,1+$border,1+$border); |
|
|
511 | |
508 | |
512 | { |
509 | $self->{canvas}->set_pixels_per_unit(1000); |
|
|
510 | $self->{canvas}->set_scroll_region(-$border,-$border,1+$border,1+$border); |
|
|
511 | |
|
|
512 | $self->{canvas}->signal_connect(size_allocate => sub { |
|
|
513 | my ($w, $h) = @{$_[1]}[2,3]; |
|
|
514 | |
|
|
515 | $self->{canvas}->set_pixels_per_unit(($w > $h ? $h : $w)/(1+$border*2)); |
|
|
516 | |
|
|
517 | 1; |
|
|
518 | }); |
|
|
519 | |
513 | my $croot = $self->{canvas}->root; |
520 | my $croot = $self->{canvas}->root; |
514 | my $cgroup = $croot; #->new($croot, "Gnome::CanvasGroup"); |
521 | my $cgroup = $croot; #->new($croot, "Gnome::CanvasGroup"); |
515 | |
522 | |
516 | if ($::board_img) { |
523 | if ($::board_img) { |
517 | $cgroup->new($cgroup, "Gnome::CanvasImage", |
524 | $cgroup->new($cgroup, "Gnome::CanvasImage", |
… | |
… | |
519 | width => 1+$border*2, height => 1+$border*2, |
526 | width => 1+$border*2, height => 1+$border*2, |
520 | image => $::board_img, |
527 | image => $::board_img, |
521 | anchor => "nw" |
528 | anchor => "nw" |
522 | ); |
529 | ); |
523 | } else { |
530 | } else { |
524 | die; |
|
|
525 | $cgroup->new($cgroup, "Gnome::CanvasRect", |
531 | $cgroup->new($cgroup, "Gnome::CanvasRect", |
526 | x1 => -$border, x2 => 1+$border, |
532 | x1 => -$border, x2 => 1+$border, |
527 | y1 => -$border, y2 => 1+$border, |
533 | y1 => -$border, y2 => 1+$border, |
528 | outline_color => "black", |
534 | outline_color => "black", |
529 | fill_color => "brown", |
535 | fill_color => "brown", |
530 | width_pixels => 2, |
536 | width_pixels => 2, |
531 | ); |
537 | ); |
532 | } |
538 | } |
533 | |
539 | |
534 | my $x1 = $pad * 2; # == my $y1 = 30; |
|
|
535 | my $x2 = $w - ($pad * 2); # == my $y2 = 270; |
|
|
536 | my $w = $x2 - $x1; |
|
|
537 | my $s = $self->{size} - 1; |
|
|
538 | my $ofs = 0.5 / $self->{size}; |
|
|
539 | |
|
|
540 | my $a = "A"; |
540 | my $a = "A"; |
541 | for my $i (1 .. $self->{size}) { # one more iteration for the last lines |
541 | for my $i (1 .. $self->{size}) { # one more iteration for the last lines |
542 | my $k = $i / $self->{size} - $ofs; |
542 | my $k = $i / $self->{size} - $ofs; |
543 | |
543 | |
544 | $cgroup->new($cgroup, "Gnome::CanvasLine", |
544 | $cgroup->new($cgroup, "Gnome::CanvasLine", |
… | |
… | |
556 | |
556 | |
557 | my $text = $cgroup->new($cgroup, "Gnome::CanvasText", |
557 | my $text = $cgroup->new($cgroup, "Gnome::CanvasText", |
558 | x => 0, y => 0, text => $text, |
558 | x => 0, y => 0, text => $text, |
559 | justification => "center", |
559 | justification => "center", |
560 | anchor => "center", |
560 | anchor => "center", |
561 | font => "-*-helvetica-medium-r-*--34-*", |
561 | font => $::config{aa} ? "-*-helvetica-medium-r-*--34-*" : "-*-helvetica-bold-r-*--17-*", |
562 | fill_color => $line_colour); |
562 | fill_color => $line_colour); |
563 | |
563 | |
564 | $text->affine_relative($border*0.015,0, 0,$border*0.015, $x,$y); |
564 | $text->affine_relative($border*0.015,0, 0,$border*0.015, $x,$y); |
565 | } |
565 | } |
566 | |
566 | |
… | |
… | |
588 | x => $xk, y => $yk, |
588 | x => $xk, y => $yk, |
589 | width => $ofs*2, height => $ofs*2, |
589 | width => $ofs*2, height => $ofs*2, |
590 | image => $::white_img[int rand @::white_img], |
590 | image => $::white_img[int rand @::white_img], |
591 | anchor => "center"); |
591 | anchor => "center"); |
592 | } else { |
592 | } else { |
|
|
593 | die "need pixmaps\n"; |
593 | # too large, scale has NO effect |
594 | # too large, scale has NO effect |
594 | $col->[0] = |
595 | $col->[0] = |
595 | $cgroup->new($cgroup, "Gnome::CanvasEllipse", |
596 | $cgroup->new($cgroup, "Gnome::CanvasEllipse", |
596 | x1 => $xk, x2 => $xk + 0.001, |
597 | x1 => $xk, x2 => $xk + 0.001, |
597 | y1 => $yk, y2 => $yk + 0.001, |
598 | y1 => $yk, y2 => $yk + 0.001, |
… | |
… | |
605 | fill_color => "white"); |
606 | fill_color => "white"); |
606 | } |
607 | } |
607 | } |
608 | } |
608 | } |
609 | } |
609 | |
610 | |
610 | $self->{board_gfx}->{stones} = $stones; |
611 | $self->{board_gfx}{stones} = $stones; |
611 | } |
612 | } |
612 | |
613 | |
613 | $hpane->add(my $vpane = new Gtk::VPaned); |
614 | $hpane->add(my $vpane = new Gtk::VPaned); |
614 | ::state $vpane, "game", $self->{name}, vpane_position => 80; |
615 | ::state $vpane, "game", $self->{name}, vpane_position => 80; |
615 | |
616 | |
… | |
… | |
635 | }); |
636 | }); |
636 | |
637 | |
637 | $self; |
638 | $self; |
638 | } |
639 | } |
639 | |
640 | |
640 | sub event_update { |
641 | sub event_update_users { |
641 | my ($self) = @_; |
642 | my ($self) = @_; |
642 | |
643 | |
643 | $self->{event_update} ||= Gtk->timeout_add(200, sub { |
644 | room::event_update_users $self; |
644 | my $l = $self->{userlist}; |
|
|
645 | |
|
|
646 | $l->freeze; |
|
|
647 | my $pos = $l->get_vadjustment->get_value; |
|
|
648 | $l->clear; |
|
|
649 | |
|
|
650 | my $row = 0; |
|
|
651 | for (values %{$self->{users}}) { |
|
|
652 | $l->append($_->{name}); |
|
|
653 | $l->set_row_data($row++, $_); |
|
|
654 | } |
|
|
655 | $l->sort; |
|
|
656 | $l->get_vadjustment->set_value($pos); |
|
|
657 | $l->thaw; |
|
|
658 | |
|
|
659 | delete $self->{event_update}; |
|
|
660 | 0; |
|
|
661 | }); |
|
|
662 | } |
645 | } |
663 | |
646 | |
664 | sub join { |
647 | sub join { |
665 | my ($self) = @_; |
648 | my ($self) = @_; |
666 | $self->SUPER::join; |
649 | $self->SUPER::join; |
… | |
… | |
670 | |
653 | |
671 | sub part { |
654 | sub part { |
672 | my ($self) = @_; |
655 | my ($self) = @_; |
673 | $self->SUPER::part; |
656 | $self->SUPER::part; |
674 | |
657 | |
675 | $self->{window}->hide_all; |
658 | $self->{window}->hide; |
676 | $self->event_update; |
|
|
677 | } |
659 | } |
678 | |
660 | |
679 | sub event_update_tree { |
661 | sub event_update_tree { |
680 | my ($self) = @_; |
662 | my ($self) = @_; |
681 | |
663 | |
682 | my $board = new KGS::Game::Board $self->{size}; |
664 | my $board = new KGS::Game::Board $self->{size}; |
683 | $board->interpret_path ($self->get_path); |
665 | $board->interpret_path ($self->get_path); |
684 | |
|
|
685 | # if (not defined $self->{board_pm}) { |
|
|
686 | # $self->{board_pm} = new Gtk::Gdk::Pixmap ($self->{board}->window, 100, 100, -1); |
|
|
687 | # $self->{board_pm}->draw_rectangle($self->{board}->style->white_gc, 1, 0, 0, 100, 100); |
|
|
688 | # } |
|
|
689 | # my $red = $self->{board}->window->get_colormap->color_alloc( { red => 65000, green => 0, blue => 0 } ); |
|
|
690 | # my $red_gc = new Gtk::Gdk::GC ( $self->{board}->window ); |
|
|
691 | # $red_gc->set_foreground( $red ); |
|
|
692 | # |
|
|
693 | # my $px = $self->{board_pm}; |
|
|
694 | |
666 | |
695 | for my $x (0 .. $self->{size} - 1) { |
667 | for my $x (0 .. $self->{size} - 1) { |
696 | for my $y (0 .. $self->{size} - 1) { |
668 | for my $y (0 .. $self->{size} - 1) { |
697 | my $v = $board->{board}[$x][$y]; |
669 | my $v = $board->{board}[$x][$y]; |
698 | |
670 | |
… | |
… | |
702 | $v & MARK_W |
674 | $v & MARK_W |
703 | ? $self->{board_gfx}->{stones}->[$x][$y][1]->show |
675 | ? $self->{board_gfx}->{stones}->[$x][$y][1]->show |
704 | : $self->{board_gfx}->{stones}->[$x][$y][1]->hide; |
676 | : $self->{board_gfx}->{stones}->[$x][$y][1]->hide; |
705 | } |
677 | } |
706 | } |
678 | } |
|
|
679 | |
|
|
680 | $self->{text}->backward_delete($self->{text}->get_length); |
|
|
681 | $self->{text}->insert(undef, undef, undef, $board->{comment}.PApp::Util::dumpval([$board->{time},$board->{captures}])); |
707 | } |
682 | } |
708 | |
683 | |
709 | 1; |
684 | 1; |
710 | |
685 | |
711 | |
686 | |