… | |
… | |
34 | class_closure => \&set, |
34 | class_closure => \&set, |
35 | }, |
35 | }, |
36 | }; |
36 | }; |
37 | |
37 | |
38 | use List::Util qw(min max); |
38 | use List::Util qw(min max); |
39 | |
|
|
40 | #my ($TILE_MINX, $TILE_MINY, $TILE_MAXX, $TILE_MAXY); |
|
|
41 | # |
|
|
42 | #for (values %TILE) { |
|
|
43 | # $TILE_MAXX = max $TILE_MAXX, $_->{w} - 1; |
|
|
44 | # $TILE_MAXY = max $TILE_MAXY, $_->{h} - 1; |
|
|
45 | #} |
|
|
46 | # |
|
|
47 | #for (values %ARCH) { |
|
|
48 | # for (; $_; $_ = $_->{more}) { |
|
|
49 | # $TILE_MINX = min $TILE_MINX, $_->{x}; |
|
|
50 | # $TILE_MINY = min $TILE_MINY, $_->{y}; |
|
|
51 | # $TILE_MAXX = max $TILE_MAXX, $_->{x}; |
|
|
52 | # $TILE_MAXY = max $TILE_MAXY, $_->{y}; |
|
|
53 | # } |
|
|
54 | #} |
|
|
55 | |
39 | |
56 | sub INIT_INSTANCE { |
40 | sub INIT_INSTANCE { |
57 | my ($self) = @_; |
41 | my ($self) = @_; |
58 | |
42 | |
59 | $self->signal_connect (destroy => sub { |
43 | $self->signal_connect (destroy => sub { |
… | |
… | |
248 | |
232 | |
249 | $self->{tip}->add (my $frame = new Gtk2::Frame "($x|$y)"); |
233 | $self->{tip}->add (my $frame = new Gtk2::Frame "($x|$y)"); |
250 | |
234 | |
251 | if ($x < 0 || $x >= $self->{map}{width} |
235 | if ($x < 0 || $x >= $self->{map}{width} |
252 | || $y < 0 || $y >= $self->{map}{height}) { |
236 | || $y < 0 || $y >= $self->{map}{height}) { |
253 | $frame->add (new Gtk2::Label "<off-map>"); |
237 | $frame->add (new Gtk2::Label "<off-map>"); |
254 | } else { |
238 | } else { |
255 | $frame->add (my $vbox = new Gtk2::VBox 1, 1); |
239 | $frame->add (my $vbox = new Gtk2::VBox 0, 1); |
256 | |
240 | |
257 | #TODO: fill tooltip via signal, defaulting to this: |
241 | #TODO: fill tooltip via signal, defaulting to this: |
258 | |
242 | |
259 | # fill tooltip with info about $x, $y |
243 | # fill tooltip with info about $x, $y |
260 | my $as = $self->{map}{map}[$x][$y] || []; |
244 | my $as = $self->{map}{map}[$x][$y] || []; |
261 | for (reverse @$as) { |
245 | for (reverse @$as) { |
262 | my $a = $_->{_virtual} || $_; |
|
|
263 | |
|
|
264 | $vbox->add (my $hbox = new Gtk2::HBox 0, 2); |
246 | $vbox->add (my $hbox = new Gtk2::HBox 0, 2); |
265 | |
247 | |
266 | # this is awful, is this really the best way? |
248 | # this is awful, is this really the best way? |
267 | my $pb = new Gtk2::Gdk::Pixbuf 'rgb', 1, 8, TILESIZE, TILESIZE; |
249 | my $pb = new Gtk2::Gdk::Pixbuf 'rgb', 1, 8, TILESIZE, TILESIZE; |
268 | $pb->fill (0x00000000); |
250 | $pb->fill (0x00000000); |
269 | |
251 | |
270 | $TILE->composite ($pb, |
252 | $TILE->composite ($pb, |
271 | 0, 0, |
253 | 0, 0, |
272 | TILESIZE, TILESIZE, |
254 | TILESIZE, TILESIZE, |
273 | - ($a->{_face} % 64) * TILESIZE, - TILESIZE * int $a->{_face} / 64, |
255 | - ($_->{_face} % 64) * TILESIZE, - TILESIZE * int $_->{_face} / 64, |
274 | 1, 1, 'nearest', 255 |
256 | 1, 1, 'nearest', 255 |
275 | ); |
257 | ); |
276 | |
258 | |
|
|
259 | my $a = $_->{_virtual} || $_; |
|
|
260 | |
277 | $hbox->add (my $img = new_from_pixbuf Gtk2::Image $pb); |
261 | $hbox->pack_start ((my $img = new_from_pixbuf Gtk2::Image $pb), 0, 1, 0); |
278 | $img->set_alignment (0, 0.5); |
262 | $img->set_alignment (0, 0.5); |
279 | |
263 | |
|
|
264 | my $text = "$a->{_name}"; |
|
|
265 | if (my $o = $ARCH{$a->{_name}}) { |
|
|
266 | $text .= "<small>"; |
|
|
267 | for my $k (grep /^[^_]/, sort keys %$a) { |
|
|
268 | if ($a->{$k} ne $o->{$k}) { |
|
|
269 | $text .= Glib::Markup::escape_text "\n$k\t$a->{$k}"; |
|
|
270 | } |
|
|
271 | } |
|
|
272 | $text .= "</small>"; |
|
|
273 | } else { |
|
|
274 | $text .= "\n<unknown archetype>"; |
|
|
275 | } |
|
|
276 | |
280 | $hbox->add (my $label = new Gtk2::Label $a->{_name}); |
277 | $hbox->pack_start (my $label = new Gtk2::Label, 1, 1, 0); |
|
|
278 | $label->set_markup ($text); |
281 | $label->set_alignment (0, 0.5); |
279 | $label->set_alignment (0, 0.5); |
282 | } |
280 | } |
283 | } |
281 | } |
284 | } |
282 | } |
285 | |
283 | |