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 )