#!/usr/bin/perl
#TITLE: Gnome Canvas
#REQUIRES: Gtk Gnome GdkImlib
$NAME = 'Canvas';
use Gtk;
use Gtk::Gdk::ImlibImage;
use Gnome;
#init Gtk;
init Gnome "canvas.pl";
#DnD target data
@target_table = (
{target => 'STRING', flags => 0, info => 0}
);
my($window) = new Gtk::Widget "Gtk::Window",
-type => -toplevel,
-visible => 1,
-signal::destroy => sub {exit}
;
#Gtk::Gdk::Rgb->init();
#Gtk::Widget->push_visual(Gtk::Gdk::Rgb->get_visual ());
#Gtk::Widget->push_colormap (Gtk::Gdk::Rgb->get_cmap ());
#my($canvas) = Gnome::Canvas->new_aa() ;
my($canvas) = Gnome::Canvas->new() ;
#$canvas->set_scroll_region(0,0,300,300);
$window->add($canvas);
$canvas->show;
#$canvas->set_size(300,300);
# kill 19,$$;
$canvas->drag_dest_set('all', ['copy', 'move'], @target_table);
$canvas->signal_connect('drag_data_received', \&canvas_drag_data);
$canvas->style->bg('normal', $canvas->style->white);
my $croot = $canvas->root;
my $cgroup = $croot->new($croot, "Gnome::CanvasGroup");
my $r = Gnome::CanvasItem->new($cgroup, "Gnome::CanvasRect",
x1 => 0, x2 => 100, y1 => 0, y2 => 100,
outline_color => "black",
width_pixels => 2,
);
my $rect = Gnome::CanvasItem->new($cgroup, "Gnome::CanvasRect",
x1 => 5, x2 => 15, y1 => 5, y2 => 15,
fill_color => "black",
);
my $ell = $cgroup->new($cgroup, "Gnome::CanvasEllipse",
x1 => 20, x2 => 40, y1 => 20, y2 => 40,
fill_color => "red",
outline_color => "blue",
width_pixels => 3
);
my ($cx, $cy);
my ($bp, $bpx, $bpy);
$cgroup->signal_connect("event", sub {
# print "EV: @_ \n(",(join " ",%{$_[1]}),")\n";
my($item, $event) = @_;
if($event->{type} eq "button_press" and
$event->{button} == 1) {
$bp = 1; ($bpx, $bpy) = @{$event}{qw/x y/};
print "PRESSED\n";
$item->grab(['pointer-motion-mask', 'button-release-mask'], undef, $event->{'time'});
} elsif($event->{type} eq "button_release" and
$event->{button} == 1) {
$bp = 0;
print "RELEASED\n";
$item->ungrab($event->{'time'});
} elsif($event->{type} eq "motion_notify" and $bp) {
my $dx = $event->{x} - $bpx;
my $dy = $event->{y} - $bpy;
print "CX &c: $cx $cy $dx $dy\n";
#$cgroup->move($dx, $dy);
$cgroup->set(x => $cx += $dx,
y => $cy += $dy);
$bpx += $dx;
$bpy += $dy;
}
return 1;
});
# my $poly = $cgroup->new($cgroup, "Gnome::CanvasPolygon",
# points => [30,30, 40,30, 50,40, 30,60],
# fill_color => "pink",
# outline_color => "blue",
# width_pixels => 3
# );
my $cgroup2 = $croot->new($croot, "Gnome::CanvasGroup");
my $txt = $cgroup2->new($cgroup2, "Gnome::CanvasText",
x => 50,
y => 50,
text => "A string\nToinen rivi",
fill_color => 'red',
font => 'fixed',
anchor => 'sw',
);
my $txt2 = $cgroup2->new($cgroup2, "Gnome::CanvasText",
x => 80,
y => 80,
text => "A string\nToinen rivi",
fill_color => 'steelblue',
font_gdk => load Gtk::Gdk::Font('-*-helvetica-*'),
anchor => 'center',
);
my $line = $cgroup2->new($cgroup2,"Gnome::CanvasLine",
points => [10,10, 40,30, 50,40, 30,80, 80, 80],
fill_color => "green",
width_pixels => 8,
smooth => 1,
spline_steps => 50
);
my $img = Gtk::Gdk::ImlibImage->load_image("save.xpm") || die;
my $imgitem = $cgroup2->new($cgroup2, "Gnome::CanvasImage",
'image' => $img,
'x' => 50,
'y' => 50,
width => $img->rgb_width,
height => $img->rgb_height,
);
my ($points) = $line->get('points');
print "POINTS: ", join(' ', @$points), "\n";
$img = $imgitem->get('image');
print "IMAGE: ", ref($img), "\n";
main Gtk;
sub canvas_drag_data {
my ($canvas, $context, $x, $y, $data, $info, $time) = @_;
if ( ($data->length() >= 0) && ($data->format() == 8) ) {
print "creating text in canvas\n";
$croot->new($croot, 'Gnome::CanvasText', text => $data->data(),
'x' => $x, 'y' => $y, font => 'fixed');
$context->finish(1, 0, $time);
} else {
$context->finish(0, 0, $time);
}
}