#!/usr/bin/perl -w use strict; use warnings; use Goo::Canvas; use Gtk2 '-init'; use Glib qw(TRUE FALSE); use Gtk2::Gdk::Keysyms; # Z and z zoom in and out my $scale = 1; my $window = Gtk2::Window->new('toplevel'); $window->signal_connect('delete_event' => sub { Gtk2->main_quit; }); #$window->set_size_request(600, 400); my $swin = Gtk2::ScrolledWindow->new; $swin->set_shadow_type('in'); $window->add($swin); my ($cwidth,$cheight)= (2400,2400); my ($cx,$cy) = ($cwidth/2,$cheight/2); my $canvas = Goo::Canvas->new(); my ($cw,$ch) = (600,400); $canvas->set_size_request($cw, $ch); $canvas->set_bounds(0,0, $cwidth, $cheight); #$canvas->set_bounds( 0, 0,2*$cwidth,2* $cheight); my $black = Gtk2::Gdk::Color->new (0x0000,0x0000,0x0000); my $white = Gtk2::Gdk::Color->new (0xFFFF,0xFFFF,0xFFFF); $canvas->modify_base('normal',$white ); $swin->add($canvas); my $root = $canvas->get_root_item(); #my ($margin_x,$margin_y) = (100,100); #my $g = Goo::Canvas::Group->new($root); #$g->scale(1,-1); #reverse direction of y axis, so graphing will be normal cartesian #$g->translate( $margin_x, $margin_y); #notice translations are reversed my $ha1 = $swin->get_hadjustment; my $va1 = $swin->get_vadjustment; my $vupper = $va1->upper; my $hupper = $ha1->upper; my $hadjc = $ha1->value; my $vadjc = $va1->value; print "uppers $vupper $hupper\n"; $va1->signal_connect( value_changed => sub { my $adj = shift; #print 'vchanged ',$adj->get_value,"\n"; #$manual = 1; return 0; } ); $ha1->signal_connect( value_changed => sub { my $adj = shift; #print 'hchanged ',$adj->get_value,"\n"; #$manual = 1; return 0; } ); my $hbr = $swin->get_hscrollbar; my $vbr = $swin->get_vscrollbar; #print "$hbr $vbr\n"; $hbr->signal_connect(move_slider => sub{ #print "moving slider @_\n" }); $vbr->signal_connect(move_slider => sub{ #print "moving slider @_\n" }); $hbr->signal_connect(event_after => sub{ #print "after slider @_\n"; my($bar,$event) = @_; #print $bar,' ',$event->type,"\n"; }); $vbr->signal_connect(event_after => sub{ # print "after slider @_\n"; my($bar,$event) = @_; #print $bar,' ',$event->type,"\n"; }); $canvas->scroll_to( $cx - $cw/2 ,$cy - $ch/2 ); print $canvas->get_bounds,"\n"; my @points1 = (0,$cy,$cwidth,$cy); my $poly1 = Goo::Canvas::Polyline->new( $root, FALSE, \@points1, 'stroke-color' => 'black', 'line-width' => 1, ); my @points2 = ($cx,0,$cx,$cheight); my $poly2 = Goo::Canvas::Polyline->new( $root, FALSE, \@points2, 'stroke-color' => 'black', 'line-width' => 1, ); $canvas->signal_connect('button-press-event', \&on_can_button_press); $canvas->signal_connect_after('key_press_event', \&on_key_press); $canvas->can_focus(TRUE); $canvas->grab_focus($root); #&set_axis(); #&plot(); $window->signal_connect(event_after => \&event_after); $window->show_all(); Gtk2->main; 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 ( $canvas, $event ) = @_; # print $event->type,"\n"; if ( $event->keyval == $Gtk2::Gdk::Keysyms{Z} ) { $scale += .1; $canvas->set_scale($scale); print "$scale\n"; # $canvas->scroll_to($cx - $cw/2,$cy- $ch/2); # $canvas->scroll_to( $cx + $scale*$cx - $cw/2 ,$cy + $scale*$cy - $ch/2 ); #$canvas->scroll_to( 0 - $cw/2 ,0 - $ch/2 ); # $ha1->upper($hupper * $scale); # $hupper = $ha1->upper; # print "new hupper $hupper\n"; # $ha1->clamp_page(0,$hupper); $hadjc = $ha1->value; print "$hadjc\n"; # $va1->upper($vupper * $scale); # $vupper = $va1->upper; # print "new vupper $vupper\n"; # $va1->clamp_page(0,$vupper); $vadjc = $va1->value; print "$vadjc\n"; #$canvas->scroll_to( $cx + $scale*$cx - $cw/2 ,$cy + $scale*$cy - $ch/2 ); #$canvas->scroll_to( $hupper/2 , $vupper/2 ); } if ( $event->keyval == $Gtk2::Gdk::Keysyms{z} ) { $scale -= .1; $canvas->set_scale($scale); #canvas->scroll_to(0,$cheight); #$canvas->scroll_to( 0 - $cw/2 ,0 - $ch/2 ); #$canvas->scroll_to( $cx + $scale*$cx - $cw/2 ,$cy + $scale*$cy - $ch/2 ); } if ( $event->keyval == $Gtk2::Gdk::Keysyms{s} ) { write_pdf($canvas); } if ( $event->keyval == $Gtk2::Gdk::Keysyms{c} ) { #$canvas->scroll_to( 0 - $cw/2, 0 - $ch/2); # $canvas->scroll_to( $cx - $cw/2 ,$cy - $ch/2 ); # print $cx * $scale,' ',$cy * $scale,"\n"; # $canvas->scroll_to( $cx - $cw/2 , $cy - $ch/2 ); # $canvas->scroll_to( $cx , $cy ); $canvas->scroll_to( $cx - $cw/(2*$scale) , $cy - $ch/(2*$scale) ); # my $current = $ha1->get_value; # my $increment = $ha1->step_increment; # my $new = $current ;#+ $increment ; # $ha1->set_value( $new ); } # print "key was ", chr( $event->keyval ), "\n"; return 0; } sub write_pdf { #print "@_\n"; my $canvas = shift; print "Write PDF...\n"; my $scale = $canvas->get_scale; print "scale->$scale\n"; my $surface = Cairo::PdfSurface->create("$0-$scale.pdf", $scale*$cwidth, $scale*$cheight); my $cr = Cairo::Context->create($surface); # needed to save scaled version $cr->scale($scale, $scale); $canvas->render($cr, undef, 1); $cr->show_page; print "done\n"; return TRUE; } sub event_after { my ($mw, $event) = @_; # print "\t",'canvas ',$event->type,"\n"; # if( ($event->type eq 'configure') or ($event->type eq 'expose' ) ){ # $resize_flag = 1 # }else{ $resize_flag = 0 } # return FALSE if $resize_flag; # if ($manual){ $manual = 0; return FALSE} my $rect = $canvas->allocation; $cw = $rect->width; $ch = $rect->height; # print "$cw $ch\n"; # my ($x, $y) = $mw->get_size; # print "$x $y\n";; # $va1->set_value( ($vupper - $y)/2 + 5); # $ha1->set_value( ($hupper - $x)/2 + 5); #$canvas->scroll_to( 0 - $cw/2 ,0 - $ch/2 ); return FALSE; } __END__