RE: Multiple menu popups with a single Gtk2::SimpleList



________________________________________

>From: gtk-perl-list-bounces gnome org [mailto:gtk-perl-list-bounces gnome org] On Behalf Of MICHAEL MCGINN

>Sent: Monday, October 26, 2009 8:32 PM

>To: gtk-perl-list gnome org

>Subject: Multiple menu popups with a single Gtk2::SimpleList

> 

>Hi,

> 

>I'm trying to display a popup menu in a Gtk2::SimpleList which can have different menu choices depending on the data in the Gtk2::SimpleList.

> 

>The menu popup choices are driven by the value selected from a Gtk2::ComboBox. There is a signal on the combobox that runs the popup sub below when the value changes.

> 

>The first time the popup menu is invoked it displays correctly; displaying the appropriate popup menu. The next time I select a different value from the Gtk2::ComboBox and right click it a row in the Gtk2::SimpleList, it continues to show the old popup in addition to the new one.

> 

>It's seems the Gtk2::SimpleList won't let go of menus you associate.

> 

>Here is a sample code snippet of what's not working.

>sub popup {

> 

>my $menu;

> 

>if ($type eq 'type1') {

>   $menu = Gtk2::Menu->new();

>   my $menu_item = Gtk2::MenuItem->('Properties');

>   $menu_item->signal_connect(activate => sub {

>       # do something

>   });

>  

>   $menu->append($menu_item);

> 

>} elsif ($type eq 'type2') {

>   $menu = Gtk2::Menu->new();

>   my $menu_item = Gtk2::MenuItem->('View');

>   $menu_item->signal_connect(activate => sub {

>       # do something else

>   });

>  

>   $menu->append($menu_item);

>}

> 

>$simple_list =>signal_connect('button-press-event' => sub {

>   my ($widget, $event) = @_;

>   return FALSE unless $event->button eq 3;

> $menu->popup (

>   undef,

>   undef,

>   undef,

>   undef,

>   $event->button,

>   $event->time);

>}

> 

>$menu->show_all;

> 

>}

 

Correct, every time you call signal_connect, you are adding another callback to be executed when the event happens.

You could try creating two menus, the decide which one to show in the callback.

 

my $menu1 = ...

my $menu2 = ...

 

 

$simple_list =>signal_connect('button-press-event' => sub {

  my ($widget, $event) = @_;

  return FALSE unless $event->button eq 3;

 

  if ( some condition ... ) {

       $menu1->popup (

       undef,

       undef,

       undef,

       undef,

       $event->button,

       $event->time

     );

  }

  else {

       $menu2->popup (

       undef,

       undef,

       undef,

       undef,

       $event->button,

       $event->time

     ); 

  }

 

}

 

 

It's also worth noting you can disconnect signals.

 

my $handler_id = $simple_list =>signal_connect('button-press-event' => sub { ... });

$simple_list->signal_disconnect($handler_id);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]