… | |
… | |
3 | use KGS::Constants; |
3 | use KGS::Constants; |
4 | use KGS::Game::Board; |
4 | use KGS::Game::Board; |
5 | |
5 | |
6 | use base KGS::Listener::Game; |
6 | use base KGS::Listener::Game; |
7 | use base KGS::Game; |
7 | use base KGS::Game; |
|
|
8 | |
|
|
9 | use base gtk::widget; |
8 | |
10 | |
9 | sub new { |
11 | sub 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->{name}." ".$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... |
38 | # grrr... |
30 | { |
39 | { |
… | |
… | |
57 | #Gtk2::Widget->pop_visual; |
66 | #Gtk2::Widget->pop_visual; |
58 | |
67 | |
59 | $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); |
68 | $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); |
60 | $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); |
69 | $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); |
61 | |
70 | |
62 | $hpane->pack2((my $vpane = new Gtk2::VPaned), 0, 0); |
71 | $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0); |
63 | $hpane->set(position_set => 1); |
72 | $self->{hpane}->set(position_set => 1); |
64 | gtk::state $vpane, "game", $self->{name}, position => 80; |
73 | gtk::state $self->{vpane}, "game::vpane", $self->{name}, position => 80; |
65 | |
74 | |
66 | $vpane->add(my $sw = new Gtk2::ScrolledWindow); |
75 | $self->{vpane}->add(my $sw = new Gtk2::ScrolledWindow); |
67 | $sw->set_policy("automatic", "always"); |
76 | $sw->set_policy("automatic", "always"); |
68 | |
77 | |
69 | if (0) { |
78 | $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 | |
79 | |
75 | $vpane->add(my $vbox = new Gtk2::VBox); |
80 | $self->{vpane}->add(my $vbox = new Gtk2::VBox); |
76 | |
81 | |
77 | $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); |
82 | $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); |
78 | $sw->set_policy("automatic", "always"); |
83 | $sw->set_policy("automatic", "always"); |
79 | |
84 | |
80 | $sw->add(($self->{text} = new gtk::text)->widget); |
85 | $sw->add(($self->{text} = new gtk::text)->widget); |
… | |
… | |
90 | } |
95 | } |
91 | |
96 | |
92 | sub event_update_users { |
97 | sub event_update_users { |
93 | my ($self) = @_; |
98 | my ($self) = @_; |
94 | |
99 | |
95 | room::event_update_users $self; |
100 | $self->{userlist}->update($self->{users}); |
96 | } |
101 | } |
97 | |
102 | |
98 | sub join { |
103 | sub join { |
99 | my ($self) = @_; |
104 | my ($self) = @_; |
100 | $self->SUPER::join; |
105 | $self->SUPER::join; |
… | |
… | |
437 | } |
442 | } |
438 | |
443 | |
439 | sub event_part { |
444 | sub event_part { |
440 | my ($self) = @_; |
445 | my ($self) = @_; |
441 | $self->SUPER::event_part; |
446 | $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}}; |
447 | delete $appwin::gamelist->{game}{$self->{channel}}; |
|
|
448 | $self->destroy; |
444 | } |
449 | } |
445 | |
450 | |
446 | sub event_move { |
451 | sub event_move { |
447 | my ($self, $pass) = @_; |
452 | my ($self, $pass) = @_; |
448 | sound::play 1, $pass ? "pass" : "move"; |
453 | sound::play 1, $pass ? "pass" : "move"; |
449 | } |
454 | } |
450 | |
455 | |
451 | sub DESTROY {#d# |
|
|
452 | warn "DESTROY(@_)\n";#d# |
|
|
453 | } |
|
|
454 | |
|
|
455 | 1; |
456 | 1; |
456 | |
457 | |