App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Gtk2/Graph.pm view on Meta::CPAN
my $new_l = min ($l, $value);
my $new_h = max ($h, $value);
my $new_page = $new_h - $new_l;
if ($new_page <= $page) {
$l = $new_l;
$h = $new_h;
return 1;
}
if ($new_l < $l) {
$l = $h - $page;
} else {
$h = $l + $page;
}
return 0;
};
if (my $series = $series_list->[0]) {
if (defined (my $symbol = $series->symbol)) {
my ($latest_lo,$latest_hi)
= App::Chart::Gtk2::Graph::Plugin::Latest->hrange ($self, $series_list);
### latest hrange: $latest_lo,$latest_hi
if (defined $lo
&& App::Chart::overlap_inclusive_p ($lo,$hi,
$latest_lo,$latest_hi)) {
my $latest = App::Chart::Latest->get($symbol);
if ($series->isa('App::Chart::Series::Derived::Volume')) {
$accumulate->($latest->{'volume'});
} else {
$accumulate->($latest->{'last'})
and $accumulate->($latest->{'bid'})
and $accumulate->($latest->{'offer'})
and $accumulate->($latest->{'high'})
and $accumulate->($latest->{'low'});
}
}
}
}
my @arrays;
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'};
( run in 1.163 second using v1.01-cache-2.11-cpan-39bf76dae61 )