package CanvasFeatures; use strict; use Glib qw(TRUE FALSE); use Gnome2::Canvas; use constant GNOME_PAD_SMALL => 4; # # Event handler for the item to be reparented. When the user clicks on the # item, it will be reparented to another group. # sub item_event { my ($item, $event) = @_; return FALSE if ($event->type ne 'button-press') || ($event->button != 1); my $parent1 = $item->{parent1}; my $parent2 = $item->{parent2}; $item->reparent ($item->parent == $parent1 ? $parent2 : $parent1); return TRUE; } sub create { my $vbox = Gtk2::VBox->new (FALSE, GNOME_PAD_SMALL); $vbox->set_border_width (GNOME_PAD_SMALL); $vbox->show; # Instructions my $w = Gtk2::Label->new ("Reparent test: click on the items to switch them between parents"); $vbox->pack_start ($w, FALSE, FALSE, 0); $w->show; # Frame and canvas my $alignment = Gtk2::Alignment->new (0.5, 0.5, 0.0, 0.0); $vbox->pack_start ($alignment, FALSE, FALSE, 0); $alignment->show; my $frame = Gtk2::Frame->new; $frame->set_shadow_type ('in'); $alignment->add ($frame); $frame->show; my $canvas = Gnome2::Canvas->new; $canvas->set_size_request (400, 200); $canvas->set_scroll_region (0, 0, 400, 200); $frame->add ($canvas); $canvas->show; # First parent and box my $parent1 = Gnome2::Canvas::Item->new ($canvas->root, 'Gnome2::Canvas::Group', x => 0.0, y => 0.0); Gnome2::Canvas::Item->new ($parent1, 'Gnome2::Canvas::Rect', x1 => 0.0, y1 => 0.0, x2 => 200.0, y2 => 200.0, fill_color => 'tan'); # Second parent and box my $parent2 = Gnome2::Canvas::Item->new ($canvas->root, 'Gnome2::Canvas::Group', x => 200.0, y => 0.0); Gnome2::Canvas::Item->new ($parent2, 'Gnome2::Canvas::Rect', x1 => 0.0, y1 => 0.0, x2 => 200.0, y2 => 200.0, fill_color => "#204060"); # Big circle to be reparented my $item = Gnome2::Canvas::Item->new ($parent1, 'Gnome2::Canvas::Ellipse', x1 => 10.0, y1 => 10.0, x2 => 190.0, y2 => 190.0, outline_color => 'black', fill_color => 'mediumseagreen', width_units => 3.0); $item->{parent1} = $parent1; $item->{parent2} = $parent2; $item->signal_connect (event => \&item_event); # A group to be reparented my $group = Gnome2::Canvas::Item->new ($parent2, 'Gnome2::Canvas::Group', x => 100.0, y => 100.0); Gnome2::Canvas::Item->new ($group, 'Gnome2::Canvas::Ellipse', x1 => -50.0, y1 => -50.0, x2 => 50.0, y2 => 50.0, outline_color => 'black', fill_color => 'wheat', width_units => 3.0); Gnome2::Canvas::Item->new ($group, 'Gnome2::Canvas::Ellipse', x1 => -25.0, y1 => -25.0, x2 => 25.0, y2 => 25.0, fill_color => 'steelblue'); $group->{parent1} = $parent1; $group->{parent2} = $parent2; $group->signal_connect (event => \&item_event); # Done return $vbox; } 1;