App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Gtk2/Graph.pm view on Meta::CPAN
foreach my $series (@$series_list) {
$series->fill ($lo, $hi);
my $values = $series->values_array;
push @arrays, $values;
if (my $highs = $series->array('highs')) {
if ($highs != $values) { push @arrays, $highs; }
}
if (my $lows = $series->array('lows')) {
if ($lows != $values) { push @arrays, $lows; }
}
}
OUTER: for (my $i = $hi; $i >= $lo; $i--) {
foreach my $array (@arrays) {
$accumulate->($array->[$i])
or last OUTER;
}
}
if (! defined $l) { return; }
### decided: "$l to $h"
my $extra = $page - ($h - $l);
$l -= $extra / 2;
### expand to: "low $l on page $page"
$vadj->set_value ($l);
}
#------------------------------------------------------------------------------
# scrolling
# 'scroll-event' class closure
sub _do_scroll_event {
my ($self, $event) = @_;
### Graph _do_scroll_event(): "$self->{'hadjustment'}, $self->{'vadjustment'}"
my $direction = $event->direction;
if ($direction eq 'up') { $self->{'vadjustment'}->scroll_step(1); }
elsif ($direction eq 'down') { $self->{'vadjustment'}->scroll_step(-1); }
elsif ($direction eq 'left') { $self->{'hadjustment'}->scroll_step(1); }
elsif ($direction eq 'right') { $self->{'hadjustment'}->scroll_step(-1); }
return $self->signal_chain_from_overridden ($event);
}
#------------------------------------------------------------------------------
# action signal handlers
sub _do_start_drag {
my ($self, $button) = @_;
my $hadj = $self->{'hadjustment'} || return; # only when adj set
my $vadj = $self->{'vadjustment'} || return; # only when adj set
my $dragger = ($self->{'dragger'} ||= do {
require Gtk2::Ex::Dragger;
Gtk2::Ex::Dragger->new (widget => $self,
hadjustment => $hadj,
vadjustment => $vadj,
vinverted => 1,
confine => 1,
cursor => 'fleur')
});
$dragger->start (Gtk2->get_current_event);
}
sub _do_start_lasso {
my ($self, $button) = @_;
my $lasso = ($self->{'lasso'} ||= do {
require Gtk2::Ex::Lasso;
my $l = Gtk2::Ex::Lasso->new (widget => $self);
$l->signal_connect (ended => \&_do_lasso_ended);
$l
});
$lasso->start (Gtk2->get_current_event);
}
sub _do_lasso_ended {
my ($lasso, $x1,$y1, $x2,$y2) = @_;
my $self = $lasso->get('widget') || return;
my $hadj = $self->{'hadjustment'};
my $t1 = $self->x_to_date ($x1);
my $t2 = $self->x_to_date ($x2);
$hadj->set_value_range (min($t1,$t2), max($t1,$t2));
my $vadj = $self->{'vadjustment'};
my $p1 = $self->y_to_value ($y1);
my $p2 = $self->y_to_value ($y2);
$vadj->set_value_range (min($p1,$p2), max($p1,$p2));
}
sub _do_start_annotation_drag {
my ($self, $button) = @_;
require App::Chart::Gtk2::AnnDrag;
App::Chart::Gtk2::AnnDrag::start ($self, Gtk2->get_current_event);
}
1;
__END__
=head1 NAME
App::Chart::Gtk2::Graph -- graph widget
=for test_synopsis my ($series1, $series2)
=head1 SYNOPSIS
use App::Chart::Gtk2::Graph;
my $image = App::Chart::Gtk2::Graph->new();
$image->set('series_list', [ $series1, $series2 ]);
=head1 DESCRIPTION
A App::Chart::Gtk2::Graph widget displays a graph of a set of
L<App::Chart::Series> objects.
=head1 FUNCTIONS
=over 4
( run in 0.803 second using v1.01-cache-2.11-cpan-39bf76dae61 )