#!/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 = " 'W' ";
$pangolayout->set_markup( $markup );
my ($lw,$lh) = $pangolayout->get_pixel_size();
$self->{'lwidth'} = $lw;
$self->{'lheight'} = $lh;
print $self->{'lheight'},"\n";
$markup = " Goo ";
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__
####
#!/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 = " Remove items with right click or clear button ";
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;
}