… | |
… | |
50 | $self->{moveadj}->signal_connect (value_changed => sub { |
50 | $self->{moveadj}->signal_connect (value_changed => sub { |
51 | return unless $self->{path}; |
51 | return unless $self->{path}; |
52 | |
52 | |
53 | my $move = int (@{$self->{path}} * $_[0]->get_value); |
53 | my $move = int (@{$self->{path}} * $_[0]->get_value); |
54 | |
54 | |
|
|
55 | $self->{board_label}->set_text ("Move $move"); |
|
|
56 | |
55 | $self->{board} = new KGS::Game::Board $self->{size}; |
57 | $self->{board} = new KGS::Game::Board $self->{size}; |
56 | $self->{board}->interpret_path ([@{$self->{path}}[0 .. $move - 1]]); |
58 | $self->{board}->interpret_path ([@{$self->{path}}[0 .. $move - 1]]); |
57 | |
59 | |
58 | $self->redraw ($self->repaint_board); |
60 | $self->redraw ($self->repaint_board); |
59 | |
61 | |
60 | $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment}); |
62 | $self->{text}->set_text(KGS::Listener::Debug::dumpval([$self->{board}{time},$self->{board}{captures}]). $self->{board}{comment}); |
61 | }); |
63 | }); |
62 | } |
64 | } |
63 | |
65 | |
64 | $vbox->pack_start(($self->{canvas} = new Gtk2::DrawingArea), 1, 1, 0); |
66 | #d#TYPOE |
|
|
67 | $vbox->pack_start((my $aspect_frame = gtk_aspect_frame_new Gtk2::AspectFrame "", 0.5, 0.5, 1, 0), 1, 1, 0); |
|
|
68 | $aspect_frame->set (border_width => 0); |
|
|
69 | $aspect_frame->set (shadow_type => 'none'); |
|
|
70 | $self->{board_label} = $aspect_frame->get_label_widget; |
|
|
71 | |
|
|
72 | $aspect_frame->add($self->{canvas} = new Gtk2::DrawingArea); |
|
|
73 | $self->{canvas}->double_buffered (0); |
65 | |
74 | |
66 | $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); |
75 | $self->{canvas}->signal_connect(configure_event => \&configure_event, $self); |
67 | $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); |
76 | $self->{canvas}->signal_connect(expose_event => \&expose_event, $self); |
68 | |
77 | |
69 | $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0); |
78 | $self->{hpane}->pack2(($self->{vpane} = new Gtk2::VPaned), 0, 0); |
… | |
… | |
126 | my ($widget, $event, $self) = @_; |
135 | my ($widget, $event, $self) = @_; |
127 | |
136 | |
128 | $self->{pixbuf} or return; |
137 | $self->{pixbuf} or return; |
129 | |
138 | |
130 | my $area = $event->area; |
139 | my $area = $event->area; |
131 | my ($ox, $oy, $s) = @{$self->{offsets}}; |
|
|
132 | |
140 | |
133 | $self->redraw ( |
141 | $self->redraw ($area); |
134 | (new Gtk2::Gdk::Rectangle $area->x - $ox, $area->y - $oy, $area->width, $area->height) |
|
|
135 | ->intersect(new Gtk2::Gdk::Rectangle 0, 0, $s, $s) |
|
|
136 | ); |
|
|
137 | |
142 | |
138 | 0; |
143 | 0; |
139 | } |
144 | } |
140 | |
145 | |
141 | # something Gtk2 fixed |
146 | # something Gtk2 fixed |
… | |
… | |
279 | my $expose_area = undef; |
284 | my $expose_area = undef; |
280 | |
285 | |
281 | return $expose_area unless $self->{board}; |
286 | return $expose_area unless $self->{board}; |
282 | |
287 | |
283 | my ($w, $h) = ($canvas->allocation->values)[2,3]; |
288 | my ($w, $h) = ($canvas->allocation->values)[2,3]; |
|
|
289 | |
|
|
290 | die "FATAL: board aspect ratio != 1" unless $w == $h; |
284 | |
291 | |
285 | my $s = $w > $h ? $h : $w; |
292 | my $s = $w; |
286 | |
293 | |
287 | return unless $s > 128; |
294 | return unless $s >= 200; |
288 | |
295 | |
289 | $self->{offsets} = [int (($w - $s) / 2), int (($h - $s) / 2), $s]; |
|
|
290 | |
|
|
291 | my $size = $self->{size}; |
296 | my $size = $self->{size}; |
292 | |
297 | |
293 | # we leave enough space for the shadows.. I like smaller stones, and we |
298 | # we leave enough space for the shadows.. I like smaller stones, and we |
294 | # do no need to do the nifty recursive screen updates that goban2 does |
299 | # do no need to do the nifty recursive screen updates that goban2 does |
295 | my $border = int ($s / ($size + 3) * 0.5); |
300 | my $border = int ($s / ($size + 3) * 0.5); |
… | |
… | |
424 | sub redraw { |
429 | sub redraw { |
425 | my ($self, $area) = @_; |
430 | my ($self, $area) = @_; |
426 | |
431 | |
427 | if ($area && $self->{pixbuf}) { |
432 | if ($area && $self->{pixbuf}) { |
428 | my ($x, $y, $w, $h) = $area->values; |
433 | my ($x, $y, $w, $h) = $area->values; |
429 | my ($ox, $oy, $s) = @{$self->{offsets}}; |
|
|
430 | |
434 | |
431 | $self->{canvas}->window->draw_pixbuf ($self->{canvas}->style->white_gc, $self->{pixbuf}, |
435 | $self->{canvas}->window->draw_pixbuf ($self->{canvas}->style->white_gc, $self->{pixbuf}, |
432 | $x, $y, $x + $ox, $y + $oy, $w, $h, |
436 | $x, $y, $x, $y, $w, $h, |
433 | "normal", 0, 0); |
437 | "normal", 0, 0); |
434 | $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0, |
438 | $self->{canvas}->window->draw_rectangle ($self->{canvas}->style->black_gc, 0, |
435 | $x + $ox - 1, $y + $oy - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE; |
439 | $x - 1, $y - 1, $w + 2, $h + 2) if $::DEBUG_EXPOSE; |
436 | } |
440 | } |
437 | } |
441 | } |
438 | |
442 | |
439 | sub event_update_tree { |
443 | sub event_update_tree { |
440 | my ($self) = @_; |
444 | my ($self) = @_; |