in reply to Moving Goo::Canvas canvas item using keyboard keys.
Back to your problem:
$item->signal_connect ('event' => \&event_handler); probably should be
$canvas->signal_connect ('event' => \&event_handler);
I had trouble getting keyboard functionality with Goo myself in the past, and this is what I came up with. I had to resort to using a package to grab the keyboard first, it works, but gives "wide print" errors on the F* keys, but you should be able to fix that. Someone on the maillist may know how to do this without resorting to a package.
#!/usr/bin/perl -w use strict; package Goo::Graph; use Gtk2; use Glib qw/TRUE FALSE/; use base 'Goo::Canvas'; use Gtk2::Gdk::Keysyms; sub new { my $class = shift; my %params = ( @_ ); my $self = bless Goo::Canvas->new(), $class; # size settings $self->set_size_request($params{'width'},$params{'height'} ); $self->set_bounds(0, 0, $params{'xbound'},$params{'ybound'}); $self->{'root'} = $self->get_root_item(); $self->{'scale'} = 1; $self->set_color( %params ); $self->set_fonts( %params ); $self->signal_connect ('expose_event' => \&on_expose_event); # $window->signal_connect(event_after => \&event_after); return $self; } sub on_expose_event(){ my ($self,$event) = @_; $self->can_focus(TRUE); $self->grab_focus($self->{'root'}); $self->signal_connect('button-press-event', \&on_can_button_press); $self->signal_connect_after('key_press_event', \&on_key_press ); return FALSE; } sub set_color { my $self = shift; my %params = @_; $self->{'bg'} = Gtk2::Gdk::Color->new( @{$params{'bg'}} ); $self->modify_base('normal', $self->{'bg'}); $self->{'black'} = Gtk2::Gdk::Color->new (0x0000,0x0000,0x0000); $self->{'white'} = Gtk2::Gdk::Color->new (0xFFFF,0xFFFF,0xFFFF); } sub set_fonts { my $self = shift; my %params = @_; # get font size for height spacing my $font = $params{'font'}; my $font_desc = Gtk2::Pango::FontDescription->from_string($font); my $pangolayout = $self->create_pango_layout(""); $pangolayout->set_font_description($font_desc); my $markup = "<span font_family ='Arial' foreground = '#000000' size = '14000' weight = 'bold'> 'W' </span>"; $pangolayout->set_markup( $markup ); my ($lw,$lh) = $pangolayout->get_pixel_size(); $self->{'lwidth'} = $lw; $self->{'lheight'} = $lh; print $self->{'lheight'},"\n"; $markup = "<span font_family ='Arial ' foreground = '#000000' size = '14000' weight = 'bold'> Goo </span>"; my $text = Goo::Canvas::Text->new( $self->{'root'}, $markup, 100 , 100 , -1, 'center', 'use markup' => 1, ); my $y = 100 + $self->{'lheight'}; $text = Goo::Canvas::Text->new( $self->{'root'}, $markup, 100 , $y , -1, 'center', 'use markup' => 1, ); return 1; } sub on_can_button_press { # print "@_\n"; my ($widget, $event ) = @_; print $widget ,' ',$event->type, ' ','button',' ',$event->button +,"\n"; my ($x,$y) = ($event->x,$event->y); print "$x $y\n"; return 0; } sub on_key_press { # print "@_\n"; my ( $self, $event ) = @_; # print $event->type,"\n"; print "key was ", chr( $event->keyval ), "\n"; return 0; } 1; package main; use Gtk2 -init; my $window = Gtk2::Window->new; $window->set_title( 'GooGraph' ); $window->set_border_width( 6 ); $window->signal_connect( delete_event => sub { Gtk2->main_quit; 1 } ); $window->set_size_request(640, 600); my $vbox = Gtk2::VBox->new; $window->add( $vbox ); $vbox->show; my $swin = Gtk2::ScrolledWindow->new; $swin->set_shadow_type('in'); $swin->show; my $graph = Goo::Graph->new( width => 1000, height => 1000, xbound => 5000, ybound => 5000, bg => [0xee22, 0xee22, 0xff22], font => 'Arial Bold 14', ); $swin->add($graph); $vbox->pack_start( $swin, 1, 1, 0 ); $window->show_all; #$graph->can_focus(1); #$graph->grab_focus($graph->get_root_item()); Gtk2->main; __END__
and here is an example of how to control items
#!/usr/bin/perl -w use strict; use warnings; use Goo::Canvas; use Gtk2 '-init'; use Glib qw(TRUE FALSE); my $window = Gtk2::Window->new('toplevel'); $window->signal_connect('delete_event' => sub { Gtk2->main_quit; }); $window->set_default_size(680, 600); my $vbox = Gtk2::VBox->new; $vbox->set_border_width(4); $vbox->show; my $hbox = Gtk2::HBox->new(FALSE, 4); $vbox->pack_start($hbox, FALSE, FALSE, 0); $hbox->show; $window->add($vbox); my $swin = Gtk2::ScrolledWindow->new; $swin->set_shadow_type('in'); $vbox->pack_start($swin, 1, 1, 0); my $cwidth = 1000; my $cheight = 1000; my $canvas = Goo::Canvas->new(); $canvas->set_size_request(600, 450); # minimum size on screen $canvas->set_bounds(0, 0, $cwidth, $cheight); # scrollregion $swin->add($canvas); my $root = $canvas->get_root_item(); $canvas->signal_connect('button-press-event', \&on_can_button_press); $canvas->signal_connect (event => \&event_handler); my $g = Goo::Canvas::Group->new($root); $g->translate(310,300); my $button = Gtk2::Button->new ('Draw'); $button->signal_connect (clicked => \&clicked ); $hbox->pack_start($button, FALSE, FALSE, 10); $button->show(); $window->show_all(); Gtk2->main; sub clicked { my $cur_lab = $button->get_label(); #print "$cur_lab\n"; if($cur_lab eq 'Draw'){ $button->set_label('Clear'); print "Starting action\n"; &draw(); }elsif($cur_lab eq 'Clear'){ $button->set_label('Draw'); print "Stopping action\n"; &clear; } } sub draw{ my $markup = "<span font_family ='Arial ' foreground = '#000000' size = '18000' weight = 'bold'> Remove items with right click or clear button +</span>"; my $text = Goo::Canvas::Text->new( $root, $markup, 10 , 10 , -1, #-1 means a single line, no space constraint 'nw', 'use markup' => 1, ); # item = Goo::Canvas::Ellipse->new ($parent, $center_x, $center_y, + # $radius_x, $radius_y, ...) my $e0 = Goo::Canvas::Ellipse->new( $g, 0, 0,300, 225, 'stroke-color' => 'black', 'line-width' => 2, 'fill-color-rgba' => 0xffb3f111, 'title' => 'foo', ); my $e1 = Goo::Canvas::Ellipse->new( $g, 100, 100,300, 225, 'stroke-color' => 'black', 'line-width' => 2, 'fill-color-rgba' => 0x3cb3f111, ); print 'g ',$g->get_n_children,"\n"; print 'root ',$root->get_n_children,"\n"; print $g->find_child ($e0),"\n"; print $g->find_child ($e1),"\n"; return 1; } sub clear{ #dosn't work, the number seems to shift as you remove # $g->remove_child(0); # $g->remove_child(1); #works # $g->remove_child(1); # $g->remove_child(0); #works for(1..$g->get_n_children){ $g->remove_child(0); } # or you can remove the group from root # works #$root->remove_child(0); return 1; } sub on_can_button_press { my ( $widget, $event ) = @_; # print $widget ,' ',$event->type,"\n"; my ($x,$y) = ($event->x,$event->y); print "$x $y\n"; return TRUE; } $canvas->signal_connect (event => \&event_handler); sub event_handler{ my ( $widget, $event ) = @_; # print $widget ,' ',$event->type,"\n"; #remove items with right click if ($event->type eq "button-press" && $event->button == 3){ my ($x,$y) = ($event->x,$event->y); print "right click\n"; my $item = $canvas->get_item_at($x,$y,TRUE); # check for click on empty space if( ! defined $item ){return 1} my $parent = $item->get_parent; print "$parent\n"; my $num = $parent->find_child ($item); print "$num\n"; $parent->remove_child($num); return 0; } if ( $event->type eq "button-release" ) { return 0; } if ( $event->type eq "focus-change" ) { return 0; } if ( $event->type eq "expose" ) { return 0; } Gtk2->main_iteration while Gtk2->events_pending; return 0; }
|
|---|