… | |
… | |
209 | $self->{hpane}->pack1((my $vbox = new Gtk2::VBox), 1, 1); |
209 | $self->{hpane}->pack1((my $vbox = new Gtk2::VBox), 1, 1); |
210 | |
210 | |
211 | $vbox->pack_start((my $frame = new Gtk2::Frame), 0, 1, 0); |
211 | $vbox->pack_start((my $frame = new Gtk2::Frame), 0, 1, 0); |
212 | |
212 | |
213 | { |
213 | { |
214 | # grrr... |
|
|
215 | $frame->add(my $vbox = new Gtk2::VBox); |
214 | $frame->add(my $vbox = new Gtk2::VBox); |
216 | $vbox->add($self->{title} = new Gtk2::Label $title); |
215 | $vbox->add($self->{title} = new Gtk2::Label $title); |
217 | |
216 | |
218 | $self->{moveadj} = new Gtk2::Adjustment 1, 0, 1, 0.001, 0.05, 0; |
217 | $self->{moveadj} = new Gtk2::Adjustment 0, 0, 0, 1, 1, 0; |
219 | |
218 | |
220 | $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj}); |
219 | $vbox->add(my $scale = new Gtk2::HScale $self->{moveadj}); |
221 | $scale->set_draw_value (0); |
220 | $scale->set_draw_value (0); |
|
|
221 | $scale->set_digits (0); |
222 | |
222 | |
223 | $self->{moveadj}->signal_connect (value_changed => sub { $self->update_board }); |
223 | $self->{moveadj}->signal_connect (value_changed => sub { $self->update_board }); |
224 | } |
224 | } |
225 | |
225 | |
226 | $vbox->pack_start((my $aspect_frame = new Gtk2::AspectFrame "", 0.5, 0.5, 1, 0), 1, 1, 0); |
226 | $vbox->pack_start((my $aspect_frame = new Gtk2::AspectFrame "", 0.5, 0.5, 1, 0), 1, 1, 0); |
… | |
… | |
248 | |
248 | |
249 | $vbox->pack_start((my $hbox = new Gtk2::HBox 1), 0, 1, 0); |
249 | $vbox->pack_start((my $hbox = new Gtk2::HBox 1), 0, 1, 0); |
250 | $hbox->add (($self->{userpanel}[WHITE] = new game::userpanel colour => WHITE)->widget); |
250 | $hbox->add (($self->{userpanel}[WHITE] = new game::userpanel colour => WHITE)->widget); |
251 | $hbox->add (($self->{userpanel}[BLACK] = new game::userpanel colour => BLACK)->widget); |
251 | $hbox->add (($self->{userpanel}[BLACK] = new game::userpanel colour => BLACK)->widget); |
252 | |
252 | |
253 | $vbox->pack_start((my $sw = new Gtk2::ScrolledWindow), 1, 1, 0); |
|
|
254 | $sw->set_policy("never", "always"); |
|
|
255 | |
|
|
256 | $sw->add(($self->{text} = new gtk::text)->widget); |
253 | $vbox->pack_start(($self->{text} = new gtk::text)->widget, 1, 1, 0); |
257 | |
254 | |
258 | $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0); |
255 | $vbox->pack_start(($self->{entry} = new Gtk2::Entry), 0, 1, 0); |
259 | $self->{entry}->signal_connect(activate => sub { |
256 | $self->{entry}->signal_connect(activate => sub { |
260 | my $text = $self->{entry}->get_text; |
257 | my $text = $self->{entry}->get_text; |
261 | $self->say($text) if $text =~ /\S/; |
258 | $self->say($text) if $text =~ /\S/; |
… | |
… | |
633 | |
630 | |
634 | sub update_board { |
631 | sub update_board { |
635 | my ($self) = @_; |
632 | my ($self) = @_; |
636 | return unless $self->{path}; |
633 | return unless $self->{path}; |
637 | |
634 | |
638 | my $move = int (@{$self->{path}} * $self->{moveadj}->get_value); |
635 | my $move = int $self->{moveadj}->get_value; |
639 | |
636 | |
640 | my $running = $move == @{$self->{path}}; |
637 | my $running = $move == @{$self->{path}}; |
641 | |
638 | |
642 | $self->{board_label}->set_text ("Move $move"); |
639 | $self->{board_label}->set_text ("Move $move"); |
643 | |
640 | |
… | |
… | |
656 | |
653 | |
657 | sub event_update_tree { |
654 | sub event_update_tree { |
658 | my ($self) = @_; |
655 | my ($self) = @_; |
659 | |
656 | |
660 | $self->{path} = $self->get_path; |
657 | $self->{path} = $self->get_path; |
|
|
658 | |
661 | $self->{userpanel}[WHITE]->set_rules ($self->{path}[0]); # should be onload only |
659 | $self->{userpanel}[WHITE]->set_rules ($self->{path}[0]); # should be onload only |
662 | $self->{userpanel}[BLACK]->set_rules ($self->{path}[0]); # should be onload only |
660 | $self->{userpanel}[BLACK]->set_rules ($self->{path}[0]); # should be onload only |
663 | |
661 | |
664 | $self->{moveadj}->value_changed if $self->{moveadj}; |
662 | if ($self->{moveadj}) { |
|
|
663 | my $upper = $self->{moveadj}->upper; |
|
|
664 | my $pos = $self->{moveadj}->get_value; |
|
|
665 | |
|
|
666 | $self->{moveadj}->upper (scalar @{$self->{path}}); |
|
|
667 | |
|
|
668 | $self->{moveadj}->changed; |
|
|
669 | if ($pos == $upper) { |
|
|
670 | $self->{moveadj}->set_value (scalar @{$self->{path}}); |
|
|
671 | } else { |
|
|
672 | $self->{moveadj}->value_changed; |
|
|
673 | } |
|
|
674 | } |
665 | } |
675 | } |
666 | |
676 | |
667 | sub event_update_comments { |
677 | sub event_update_comments { |
668 | my ($self, $node, $comment, $newnode) = @_; |
678 | my ($self, $node, $comment, $newnode) = @_; |
669 | $self->SUPER::event_update_comments($node, $comment, $newnode); |
679 | $self->SUPER::event_update_comments($node, $comment, $newnode); |
670 | |
680 | |
|
|
681 | my $text; |
|
|
682 | |
671 | $self->{text}->append_text ("\nMove <move>$node->{move}</move>, <header>Node <node>$node->{id}</node></header>") |
683 | $text .= "\n<header>Move <move>$node->{move}</move>, <header>Node <node>$node->{id}</node></header>" |
672 | if $newnode; |
684 | if $newnode; |
673 | |
685 | |
674 | $self->{text}->append_text ("\n" . util::toxml $comment); |
686 | for (split /\n/, $comment) { |
|
|
687 | $text .= "\n"; |
|
|
688 | if ($_ =~ s/^([0-9a-zA-Z]+ \[[0-9dkp\?\-]+\])://) { |
|
|
689 | $text .= "<user>" . (util::toxml $1) . "</user>:"; |
|
|
690 | } |
|
|
691 | $text .= $_; |
|
|
692 | } |
|
|
693 | |
|
|
694 | $self->{text}->append_text ($text); |
675 | } |
695 | } |
676 | |
696 | |
677 | sub event_part { |
697 | sub event_part { |
678 | my ($self) = @_; |
698 | my ($self) = @_; |
679 | $self->SUPER::event_part; |
699 | $self->SUPER::event_part; |