Deliantra
view release on metacpan or search on metacpan
Deliantra/MapWidget.pm view on Meta::CPAN
$self->set_viewport (
$di->[0] + $di->[2] - $x,
$di->[1] + $di->[3] - $y,
);
return 1;
}
0
});
$self->signal_connect (button_release_event => sub {
my ($self) = @_;
$self->enable_tooltip
if delete $self->{in_drag};
0
});
# gtk+ supports no motion compression, a major lacking feature. we have to pay for the
# workaround with incorrect behaviour and extra server-turnarounds.
$self->add_events ([qw(button_press_mask button_release_mask button-motion-mask
pointer-motion-mask pointer-motion-hint-mask
enter-notify-mask leave-notify-mask)]);
$self->can_focus (1);
# $self->signal_connect (key_press_event => sub { $self->handle_key ($_[1]->keyval, $_[1]->state) });
}
sub enable_tooltip {
my ($self) = @_;
$self->{tooltip}++;
$self->update_tooltip;
}
sub disable_tooltip {
my ($self) = @_;
$self->{tooltip}--;
$self->update_tooltip;
}
sub overlay {
my ($self, $name, $x, $y, $w, $h, $cb) = @_;
if (my $ov = delete $self->{overlay}{$name}) {
my ($x, $y, $w, $h) = @$ov;
$self->queue_draw_area ($x - $self->{x}, $y - $self->{y}, $w, $h);
}
if ($w && $h) {
$self->{overlay}{$name} = [$x, $y, $w, $h, $cb];
$self->queue_draw_area ($x - $self->{x}, $y - $self->{y}, $w, $h);
}
}
sub update_tooltip {
my ($self) = @_;
if ($self->{tooltip} >= 0
&& $self->mapped
&& $self->get_toplevel->has_toplevel_focus) {
my $screen = $self->{window}->get_screen;
if ($self->{window} == ($screen->get_display->get_window_at_pointer)[0]) {
my ($pscreen, $x, $y) = $screen->get_display->get_pointer;
if ($pscreen == $screen) {
if (!$self->{tip}) {
$self->{tip} = new Gtk2::Window "popup";
$self->{tip}->can_focus (0);
$self->{tip}->set_name ("gtk-tooltips");
$self->{tip}->set_decorated (0);
$self->{tip}->set_border_width (4);
$self->{tip}->set_has_frame (0);
$self->{tip}->set_resizable (0);
$self->{tip}->set_transient_for ($self->get_toplevel);
}
my ($mx, $my) = $self->coord ($self->get_pointer);
if ($self->{tipinfo}[0] != $mx || $self->{tipinfo}[1] != $my) {
$self->fill_tooltip ($mx, $my);
$self->{tipinfo} = [$mx, $my];
$self->overlay (_tooltip => $mx * TILESIZE, $my * TILESIZE, TILESIZE, TILESIZE, sub {
my ($self, $x, $y) = @_;
$self->{window}->draw_rectangle ($_ & 1 ? $self->style->black_gc : $self->style->white_gc, 0,
$x + $_, $y + $_,
TILESIZE - 1 - $_ * 2, TILESIZE - 1 - $_ * 2)
for 0..3;
});
my $req = $self->{tip}->size_request;
$self->{tip}->resize ($req->width, $req->height);
}
$self->{tip}->move ($x + TILESIZE, $y);
$self->{tip}->show_all;
return;
}
}
}
$self->overlay ("_tooltip");
delete $self->{tipinfo};
(delete $self->{tip})->destroy if $self->{tip};
}
sub fill_tooltip {
my ($self, $x, $y) = @_;
$self->{tip}->remove ($self->{tip}->get_children)
if $self->{tip}->get_children;
( run in 1.059 second using v1.01-cache-2.11-cpan-39bf76dae61 )