in reply to geoTiff Application Building

That's alot of stuff we need to get to just to try your script.... too lazy. But if I was to do it, I would put it on a Gnome2::Canvas ( or Goo::Canvas). Why? The canvas has persistence of objects, so you can put your tiff on the canvas, have easy access to canvas mouse coordinates, and can easily drop little icons on top of the tiff..... it would all be
my $image = Gnome2::Canvas::Item->new ($root, 'Gnome2::Canvas::Pixbuf', pixbuf => $im, x => 75.0, y => 75.0, width => $im->get_width, height => $im->get_height, anchor => 'center', );
Just keep dropping your images on the canvas, and the canvas will remember it.

With the event box and a drawing area, it is not-persistent..... and you will need to go thru a bunch of extra work to constantly rebuild on every expose event.

See Gtk2-annotate-draggable texts on image for an example which you can easily adapt.... I add text to an image on a canvas, but all you need to do is add images in a layer.


I'm not really a human, but I play one on earth. Cogito ergo sum a bum

Replies are listed 'Best First'.
Re^2: geoTiff Application Building
by deadpickle (Pilgrim) on May 30, 2008 at 23:20 UTC
    Thanks for the reply that works well and it also allows me to zoom and pan the image. Does Gnome2::Canvas capture mouse clicks or do I still have to add an event box to grab this?
      The cool thing about Gtk2 is it is designed properly.... most widgets have an eventbox built-in. A word of caution about pixel-zooming...... it will not save as zoomed, unless you grab a screenshot.
      #!/usr/bin/perl use warnings; use strict; use Gtk2 '-init'; use Gnome2::Canvas; my $window = Gtk2::Window->new; $window ->signal_connect( 'destroy' => \&delete_event ); my $canvas = Gnome2::Canvas->new(); $canvas->set_size_request(256,256); $canvas->set_scroll_region(0,0,256,256); my $root = $canvas->root(); my $item = Gnome2::Canvas::Item->new($root, "Gnome2::Canvas::Ellipse", x1 => 0, y1 => 0, x2 => 200, y2 => 180, fill_color=>"red", outline_color=>"black" ); $item->signal_connect(event=>sub {print "I got an event!\n"; }); $canvas->signal_connect (event => \&event_handler); $window->add ($canvas); $window->show_all; Gtk2->main; ###########################################################3 sub event_handler{ my ( $widget, $event ) = @_; print $widget ,' ',$event->type,"\n"; if ( $event->type eq "button-press" ) { print 'x->',$event->x,' ','y->',$event->y,"\n"; } } sub delete_event { Gtk2->main_quit; return 0; }

      I'm not really a human, but I play one on earth CandyGram for Mongo
        I have encountered a small problem when zooming. It seems that when you double click to drop a point it is not exactly where the mouse pointer is, it is off slightly. when you zoom in it gets worse. When you zoom closer it drops the point far to the right and vise versa when you zoom out. maybe someone can see why that is?
        #Draggability of window my $adj = Gtk2::Adjustment->new (1.00, 0.05, 5.00, 0.05, 0.50, 0.50); my $dragger = Gtk2::Ex::Dragger->new( widget => $scwin, hadjustment => $scwin->get_hadjustment, vadjustment => $scwin->get_vadjustment, #update_policy => 'continous', #cursor => 'hand1' ); #Setup zooming my $zoom = Gtk2::Label->new ("Zoom:"); $table->attach_defaults($zoom, 0, 1, 1, 2); $adj->signal_connect (value_changed => \&zoom_changed, $canvas); $zoom = Gtk2::SpinButton->new ($adj, 0.0, 2); $zoom->set_size_request (50, -1); $table->attach_defaults($zoom, 1, 2, 1, 2); #handle the events $canvas->signal_connect (event => \&event_handler); $window->show_all; Gtk2->main; #------------------------------------------------ sub event_handler { my ( $widget, $event ) = @_; # print $widget ,' ',$event->type,"\n"; #on 2 mouse presses, place waypoint if ( $event->type eq "2button-press" ) { print 'x->',$event->x,' ','y->',$event->y; #convert UTM to Lat and Long my $easting = $ps[0] * $event->x + 0.0 * $event->y + $mtp[3]; my $northing = (-$ps[1]) * $event->y + 0.0 * $event->x + $mtp[ +4]; my ($latitude,$longitude)=utm_to_latlon($ellipsoid,$zone,$east +ing,$northing); print " ($latitude, $longitude)\n"; #Drop icon my $tgroup = Gnome2::Canvas::Item->new ($root, 'Gnome2::Canvas +::Group', x => $event->x, y => $event->y); Gnome2::Canvas::Item->new($tgroup, 'Gnome2::Canvas::Ellipse', x1 => 0, y1 => 0, x2 => 10, y2 => 10, fill_color => 'purple', outline_color => 'black'); $tgroup->raise_to_top(); } #on mouse press, pan the window if ( $event->type eq "button-press" ) { $dragger->start ($event); } } #------------------------------------------------ sub zoom_changed { my ($adj, $canvas) = @_; $canvas->set_pixels_per_unit ($adj->value); }
        UPDATE: I am receiving this error:
        Gdk-CRITICAL **: gdk_property_change: assertion `type != GDK_TARGET_ST +RING' fail ed at C:/camelbox/site/lib/Gtk2/Ex/SyncCall.pm line 62.