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 )