App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Gtk2/Ex/MenuItem/EmptyInsensitive.pm view on Meta::CPAN
my @subitem_ids;
foreach my $subitem ($submenu->get_children) {
if (_is_ignored($subitem)) { next; }
push @subitem_ids, Glib::Ex::SignalIds->new
($subitem,
$subitem->signal_connect ('notify::visible' => \&_notify_visible,
$ref_weak_self))
}
\@subitem_ids
};
_update_sensitive ($item);
}
# 'notify' of subitem "visible" property
sub _notify_visible {
my ($subitem) = @_;
### SubmenuInsensitive _notify_visible
my $submenu = $subitem->get_parent || return;
my $item = $submenu->get_attach_widget || return;
_update_sensitive ($item);
}
sub _update_sensitive {
my ($item) = @_;
### SubmenuInsensitive _update_sensitive
$item->set_sensitive (_want_sensitive ($item));
}
sub _want_sensitive {
my ($item) = @_;
my $submenu = $item->get_submenu || return 0;
return List::Util::first { !_is_ignored($_)
&& $_->visible } $submenu->get_children;
}
sub _is_ignored {
my ($subitem) = @_;
return List::Util::first {$subitem->isa($_)} @ignored_menuitem_classes;
}
1;
__END__
=for stopwords submenu Gtk ie
=head1 NAME
App::Chart::Gtk2::Ex::MenuItem::EmptyInsensitive -- menu item insensitive when submenu empty
=head1 SYNOPSIS
use App::Chart::Gtk2::Ex::MenuItem::EmptyInsensitive;
my $item = Gtk2::MenuItem->new;
App::Chart::Gtk2::Ex::MenuItem::EmptyInsensitive->setup ($item);
=head1 DESCRIPTION
C<App::Chart::Gtk2::Ex::MenuItem::EmptyInsensitive> sets up a C<Gtk2::MenuItem> so that
it's insensitive if its submenu is empty, or all the items are hidden, or
there's no submenu set at all.
Sensitivity updates with items added or removed from the submenu, or made
hidden or visible. In Gtk 2.12 and the sensitivity is updated for a new
submenu, ie. C<set_submenu>, but in prior versions there's no signal when
that happens and you must call C<setup> below again.
=head1 FUNCTIONS
=over 4
=item C<< App::Chart::Gtk2::Ex::MenuItem::EmptyInsensitive->setup ($item) >>
Setup C<$item> to be insensitive if its submenu is empty.
=back
=head1 SEE ALSO
L<Gtk2::MenuItem>, L<Gtk2::Menu>
=cut
( run in 0.774 second using v1.01-cache-2.11-cpan-39bf76dae61 )