App-Devel-MAT-Explorer-GTK
view release on metacpan or search on metacpan
bin/pmat-explore-gtk view on Meta::CPAN
my %mode_tooltip = (
All => "Display and count every kind of inref and outref",
Direct => "Display and count only direct inrefs and outrefs",
Strong => "Display and count only strong direct inrefs and outrefs",
);
Devel::MAT::UI->provides_radiobutton_set(
map {
my $filter = $_ eq "All" ? "" : "_\L$_";
Devel::MAT::UI->register_icon(
name => "refs-$_",
svg => "icons/refs-$_.svg"
);
{
text => $_,
icon => "refs-$_",
tooltip => $mode_tooltip{$_},
code => sub {
$outrefs_mth = "outrefs$filter";
$inrefs_mth = "inrefs$filter";
reset_svlist_refs() if $svs_loaded;
redisplay_sv();
},
}
} qw( All Direct Strong )
);
Devel::MAT::UI->provides_sv_detail(
order => 1E6,
type => "widget",
title => "Outrefs",
render => sub {
my ( $sv ) = @_;
my $outrefs = Gtk2::SimpleList->new(
" " => "pixbuf",
"Ref" => "text",
"Addr" => "text",
"Desc" => "text",
);
foreach my $ref ( sort_by { $_->name } $sv->$outrefs_mth ) {
my $strength = $ref->strength;
push @{ $outrefs->{data} }, [ get_icon( "strength-$strength" ), $ref->name, sprintf( "%#x", $ref->sv->addr ), $ref->sv->desc ];
}
$outrefs->signal_connect( row_activated => sub {
my( $self, $path, $column ) = @_;
my $data = $self->get_row_data_from_path( $path );
my $addr = do {
no warnings 'portable';
hex $data->[2];
};
my $sv = $df->sv_at( $addr );
history_nav( $sv );
});
return vscrollable( $outrefs );
},
expand => TRUE,
);
Devel::MAT::UI->provides_sv_detail(
order => 1E6 + 1,
type => "widget",
title => "Inrefs",
render => sub {
my ( $sv ) = @_;
my $inrefs = Gtk2::SimpleList->new(
" " => "pixbuf",
"Ref" => "text",
"Addr" => "text",
"Desc" => "text",
);
foreach my $ref ( sort_by { $_->name } $sv->$inrefs_mth ) {
my $strength = $ref->strength;
if( $ref->sv ) {
push @{ $inrefs->{data} }, [ get_icon( "strength-$strength" ), $ref->name, sprintf( "%#x", $ref->sv->addr ), $ref->sv->desc ];
}
else {
push @{ $inrefs->{data} }, [ get_icon( "strength-$strength" ), $ref->name, "-", "ROOT" ];
}
}
$inrefs->signal_connect( row_activated => sub {
my( $self, $path, $column ) = @_;
my $data = $self->get_row_data_from_path( $path );
my $addr = hex $data->[2];
my $sv = $df->sv_at( $addr );
history_nav( $sv ) if $sv;
});
return vscrollable( $inrefs );
},
expand => TRUE,
);
}
### History management
{
my @back_sv;
my @forward_sv;
my $current_sv;
$backbtn->set_sensitive( FALSE );
$forwardbtn->set_sensitive( FALSE );
sub history_back
{
return unless @back_sv;
unshift @forward_sv, $current_sv if $current_sv;
$current_sv = pop @back_sv;
$backbtn->set_sensitive( scalar @back_sv );
$forwardbtn->set_sensitive( scalar @forward_sv );
display_sv( $current_sv );
}
sub history_forward
{
return unless @forward_sv;
push @back_sv, $current_sv if $current_sv;
$current_sv = shift @forward_sv;
$backbtn->set_sensitive( scalar @back_sv );
$forwardbtn->set_sensitive( scalar @forward_sv );
display_sv( $current_sv );
}
sub history_nav
{
my ( $sv ) = @_;
push @back_sv, $current_sv if $current_sv;
$current_sv = $sv;
if( @forward_sv and $sv == $forward_sv[0] ) {
shift @forward_sv;
}
else {
@forward_sv = ();
}
$backbtn->set_sensitive( scalar @back_sv );
$forwardbtn->set_sensitive( scalar @forward_sv );
display_sv( $current_sv );
}
sub redisplay_sv
{
( run in 0.518 second using v1.01-cache-2.11-cpan-5b529ec07f3 )