… | |
… | |
223 | |
223 | |
224 | $self = $self->Glib::Object::new; |
224 | $self = $self->Glib::Object::new; |
225 | $self->{$_} = delete $arg{$_} for keys %arg; |
225 | $self->{$_} = delete $arg{$_} for keys %arg; |
226 | |
226 | |
227 | gtk::state $self, "game::window", undef, window_size => [620, 460]; |
227 | gtk::state $self, "game::window", undef, window_size => [620, 460]; |
|
|
228 | $self->set (allow_shrink => 1); |
228 | |
229 | |
229 | $self->signal_connect (destroy => sub { |
230 | $self->signal_connect (destroy => sub { |
230 | $self->unlisten; |
231 | $self->unlisten; |
231 | delete $self->{app}{game}{$self->{channel}}; |
232 | delete $self->{app}{game}{$self->{channel}}; |
232 | %{$_[0]} = (); |
233 | %{$_[0]} = (); |
… | |
… | |
335 | return if $self->{joined}; |
336 | return if $self->{joined}; |
336 | |
337 | |
337 | $self->SUPER::join; |
338 | $self->SUPER::join; |
338 | } |
339 | } |
339 | |
340 | |
|
|
341 | sub part { |
|
|
342 | my ($self) = @_; |
|
|
343 | |
|
|
344 | $self->hide; |
|
|
345 | $self->SUPER::part; |
|
|
346 | } |
|
|
347 | |
340 | sub event_join { |
348 | sub event_join { |
341 | my ($self) = @_; |
349 | my ($self) = @_; |
342 | |
350 | |
343 | $self->SUPER::event_join (@_); |
351 | $self->SUPER::event_join (@_); |
344 | $self->init_tree; |
352 | $self->init_tree; |
… | |
… | |
383 | $important{$self->{black}{name}}++; |
391 | $important{$self->{black}{name}}++; |
384 | $important{$self->{white}{name}}++; |
392 | $important{$self->{white}{name}}++; |
385 | $important{$self->{owner}{name}}++; |
393 | $important{$self->{owner}{name}}++; |
386 | |
394 | |
387 | if (my @users = grep $important{$_->{name}}, @$add) { |
395 | if (my @users = grep $important{$_->{name}}, @$add) { |
388 | $self->{chat}->append_text ("\n<header>Joins:</header>"); |
396 | $self->{chat}->append_text ("\n<leader>Joins:</leader>"); |
389 | $self->{chat}->append_text (" <user>" . $_->as_string . "</user>") for @users; |
397 | $self->{chat}->append_text (" <user>" . $_->as_string . "</user>") for @users; |
390 | } |
398 | } |
391 | if (my @users = grep $important{$_->{name}}, @$remove) { |
399 | if (my @users = grep $important{$_->{name}}, @$remove) { |
392 | $self->{chat}->append_text ("\n<header>Parts:</header>"); |
400 | $self->{chat}->append_text ("\n<leader>Parts:</leader>"); |
393 | $self->{chat}->append_text (" <user>" . $_->as_string . "</user>") for @users; |
401 | $self->{chat}->append_text (" <user>" . $_->as_string . "</user>") for @users; |
394 | } |
402 | } |
395 | } |
403 | } |
396 | |
404 | |
397 | ### GAME INFO ############################################################### |
405 | ### GAME INFO ############################################################### |
… | |
… | |
560 | |
568 | |
561 | delete $self->{board_click}; |
569 | delete $self->{board_click}; |
562 | |
570 | |
563 | if ($self->{teacher} eq $self->{app}{conn}) { |
571 | if ($self->{teacher} eq $self->{app}{conn}) { |
564 | #TODO# # teaching mode not implemented |
572 | #TODO# # teaching mode not implemented |
565 | $self->{button_pass}->set (label => "Pass", visible => 1, sensitive => 1); |
573 | $self->{button_pass}->set (label => "Pass", sensitive => 1); |
|
|
574 | $self->{button_pass}->show; |
566 | $self->{button_undo}->hide; |
575 | $self->{button_undo}->hide; |
567 | $self->{button_resign}->hide; |
576 | $self->{button_resign}->hide; |
568 | $self->{board}->set (cursor => undef); |
577 | $self->{board}->set (cursor => undef); |
569 | |
578 | |
570 | } elsif ($running && $self->{colour} != COLOUR_NONE) { |
579 | } elsif ($running && $self->{colour} != COLOUR_NONE) { |
… | |
… | |
572 | $self->{button_undo}->show; |
581 | $self->{button_undo}->show; |
573 | $self->{button_resign}->show; |
582 | $self->{button_resign}->show; |
574 | |
583 | |
575 | if ($self->{cur_board}{score}) { |
584 | if ($self->{cur_board}{score}) { |
576 | # during scoring |
585 | # during scoring |
577 | $self->{button_pass}->set (label => "Done", visible => 1, sensitive => 1); |
586 | $self->{button_pass}->set (label => "Done", sensitive => 1); |
|
|
587 | $self->{button_pass}->show; |
578 | $self->{board}->set (cursor => sub { |
588 | $self->{board}->set (cursor => sub { |
579 | $_[0] & (MARK_B | MARK_W) |
589 | $_[0] & (MARK_B | MARK_W) |
580 | ? $_[0] ^ MARK_GRAYED |
590 | ? $_[0] ^ MARK_GRAYED |
581 | : $_[0]; |
591 | : $_[0]; |
582 | }); |
592 | }); |
… | |
… | |
594 | } |
604 | } |
595 | }; |
605 | }; |
596 | |
606 | |
597 | } elsif ($self->{colour} == $self->{whosemove}) { |
607 | } elsif ($self->{colour} == $self->{whosemove}) { |
598 | # normal move |
608 | # normal move |
599 | $self->{button_pass}->set (label => "Pass", visible => 1, sensitive => 1); |
609 | $self->{button_pass}->set (label => "Pass", sensitive => 1); |
|
|
610 | $self->{button_pass}->show; |
600 | $self->{board}->set (cursor => sub { |
611 | $self->{board}->set (cursor => sub { |
601 | $self->{cur_board} |
612 | $self->{cur_board} |
602 | && $self->{cur_board}->is_valid_move ($self->{colour}, $_[1], $_[2], |
613 | && $self->{cur_board}->is_valid_move ($self->{colour}, $_[1], $_[2], |
603 | $self->{rules}{ruleset} == RULESET_NEW_ZEALAND) |
614 | $self->{rules}{ruleset} == RULESET_NEW_ZEALAND) |
604 | ? $_[0] | MARK_GRAYED | ($self->{colour} == COLOUR_WHITE ? MARK_W : MARK_B) |
615 | ? $_[0] | MARK_GRAYED | ($self->{colour} == COLOUR_WHITE ? MARK_W : MARK_B) |
… | |
… | |
612 | $self->{board}->set (cursor => undef); |
623 | $self->{board}->set (cursor => undef); |
613 | delete $self->{board_click}; |
624 | delete $self->{board_click}; |
614 | $self->{button_pass}->sensitive (0); |
625 | $self->{button_pass}->sensitive (0); |
615 | }; |
626 | }; |
616 | } else { |
627 | } else { |
617 | $self->{button_pass}->set (label => "Pass", sensitive => 0, visible => 1); |
628 | $self->{button_pass}->set (label => "Pass", sensitive => 0); |
|
|
629 | $self->{button_pass}->show; |
618 | $self->{board}->set (cursor => undef); |
630 | $self->{board}->set (cursor => undef); |
619 | } |
631 | } |
620 | } else { |
632 | } else { |
621 | $self->{button_undo}->hide; |
633 | $self->{button_undo}->hide; |
622 | $self->{button_resign}->hide; |
634 | $self->{button_resign}->hide; |
… | |
… | |
878 | |
890 | |
879 | my ($size, $time, $interval, $count, $type); |
891 | my ($size, $time, $interval, $count, $type); |
880 | |
892 | |
881 | if (!$self->{channel}) { |
893 | if (!$self->{channel}) { |
882 | $inlay->append_text ("\nNotes: "); |
894 | $inlay->append_text ("\nNotes: "); |
883 | $inlay->append_entry (\$info->{notes}, 20, ""); |
895 | $inlay->append_widget (gtk::textentry \$info->{notes}, 20, ""); |
884 | $inlay->append_text ("\nGlobal Offer: "); |
896 | $inlay->append_text ("\nGlobal Offer: "); |
885 | $inlay->append_optionmenu (\$info->{flags}, |
897 | $inlay->append_optionmenu (\$info->{flags}, |
886 | 0 => "No", |
898 | 0 => "No", |
887 | 2 => "Yes", |
899 | 2 => "Yes", |
888 | ); |
900 | ); |
… | |
… | |
941 | if ($self->{channel}) { |
953 | if ($self->{channel}) { |
942 | $inlay->append_text ("\nHandicap: "); |
954 | $inlay->append_text ("\nHandicap: "); |
943 | $inlay->append_optionmenu (\$info->{rules}{handicap}, map +($_, $_), 0..9); |
955 | $inlay->append_optionmenu (\$info->{rules}{handicap}, map +($_, $_), 0..9); |
944 | |
956 | |
945 | $inlay->append_text ("\nKomi: "); |
957 | $inlay->append_text ("\nKomi: "); |
946 | $inlay->append_entry (\$info->{rules}{komi}, 5); |
958 | $inlay->append_widget (gtk::numentry \$info->{rules}{komi}, 5); |
947 | } |
959 | } |
948 | |
960 | |
949 | $inlay->append_text ("\nTimesys: "); |
961 | $inlay->append_text ("\nTimesys: "); |
950 | $inlay->append_optionmenu ( |
962 | $inlay->append_optionmenu ( |
951 | \$info->{rules}{timesys}, |
963 | \$info->{rules}{timesys}, |
… | |
… | |
980 | } |
992 | } |
981 | } |
993 | } |
982 | ); |
994 | ); |
983 | |
995 | |
984 | $inlay->append_text ("\nMain Time: "); |
996 | $inlay->append_text ("\nMain Time: "); |
985 | $time = $inlay->append_entry (\$info->{rules}{time}, 5); |
997 | $time = $inlay->append_widget (gtk::timeentry \$info->{rules}{time}, 5); |
986 | $inlay->append_text ("\nInterval: "); |
998 | $inlay->append_text ("\nInterval: "); |
987 | $interval = $inlay->append_entry (\$info->{rules}{interval}, 3); |
999 | $interval = $inlay->append_widget (gtk::timeentry \$info->{rules}{interval}, 5); |
988 | $inlay->append_text ("\nPeriods/Stones: "); |
1000 | $inlay->append_text ("\nPeriods/Stones: "); |
989 | $count = $inlay->append_entry (\$info->{rules}{count}, 2); |
1001 | $count = $inlay->append_widget (gtk::numentry \$info->{rules}{count}, 5); |
990 | |
1002 | |
991 | $inlay->append_text ("\n"); |
1003 | $inlay->append_text ("\n"); |
992 | |
1004 | |
993 | if (!$self->{channel}) { |
1005 | if (!$self->{channel}) { |
994 | $inlay->append_button ("Create Challenge", sub { |
1006 | $inlay->append_button ("Create Challenge", sub { |