App-Chart

 view release on metacpan or  search on metacpan

lib/App/Chart/Gtk2/Graph.pm  view on Meta::CPAN

# 'changed' and 'value-changed' signals on vadjustment
sub _do_vadj_changed {
  my ($adj, $ref_weak_self) = @_;
  my $self = $$ref_weak_self || return;
  ### Graph vadj changed, redraw: "value=@{[$adj->value]} upper=@{[$adj->upper]} lower=@{[$adj->lower]}"
  #                if ($adj->value < 0) {
  #                  require Devel::StackTrace;
  #                  my $trace = Devel::StackTrace->new;
  #                  print $trace->as_string; # like carp
  #                }

  $self->queue_draw;
}

# Expand $adj so its lower/upper covers all of @values.
#
# If lower==upper==page_size==0 in the existing $adj settings it's treated
# as uninitialized and that 0 lower/upper is ignored, just @values is used.
#
# undefs in @values are ignored, and if all are undef then $adj is not
# changed.
#
sub adjustment_expand {
  my ($adj, @values) = @_;
  @values = grep {defined} @values;
  ### Graph adjustment_expand(): join(' ',@values)
  if (! @values) { return; }

  my ($new_lower, $new_upper) = List::MoreUtils::minmax (@values);
  ### base: "   new_lower $new_lower  new_upper $new_upper"
  ($new_lower, $new_upper) = stretch_range ($new_lower, $new_upper);
  ### stretch: "new_lower $new_lower  new_upper $new_upper"

  my $old_lower = $adj->lower;
  my $old_upper = $adj->upper;
  ### old: "    old_lower $old_lower  old_upper $old_upper  old_page ".$adj->page_size
  if (! ($old_lower == 0 && $old_upper == 0 && $adj->page_size == 0)) {
    ($new_lower, $new_upper) = List::MoreUtils::minmax
      ($new_lower, $new_upper, $old_lower, $old_upper);
  }

  ### new: "    new_lower $new_lower  new_upper $new_upper"
  Gtk2::Ex::AdjustmentBits::set_maybe
      ($adj,
       lower => $new_lower,
       upper => $new_upper);
}

sub stretch_range {
  my ($lo, $hi) = @_;
  my $extra = ($hi - $lo) * 0.1;
  if ($lo < 0) {
    $lo -= $extra;
  } else {
    $lo = max ($lo - $extra, $lo * 0.5);
  }
  $hi += $extra;
  return ($lo, $hi);
}

sub update_v_range {
  my ($self) = @_;
  my $vadj = $self->{'vadjustment'} || return;

  my ($lo, $hi) = $self->draw_t_range;
  my $vrange_span = ($self->{'vrange_span'} ||= do {
    require Set::IntSpan::Fast;
    Set::IntSpan::Fast->new
    });
  if ($vrange_span->contains_all_range ($lo, $hi)) { return; }

  ### Graph update_v_range for: "$lo to $hi"
  my $series_list = $self->{'series_list'};
  adjustment_expand ($vadj,
                     (map {
                       $_->vrange ($self, $series_list);
                     } @plugins),
                     (map {
                       _series_v_range($_, $lo, $hi)
                     } @$series_list));
  $vrange_span->add_range ($lo, $hi);
}
sub _series_v_range {
  my ($series, $lo, $hi) = @_;
  my @ret;
  my $min = $series->minimum;  push @ret, $min;
  my $max = $series->maximum;  push @ret, $max;
  $series->fill ($lo, $hi);

  foreach my $p ($series->filled_low, $series->filled_high) {
    $p // next;
    push @ret, $p;
#     foreach my $w ($p * 1.1, $p / 1.1) {
#       if (defined $min) { $w = max ($w, $min); }
#       if (defined $max) { $w = min ($w, $max); }
#       push @ret, $w;
#     }
  }
  return @ret;
}

# 'value-changed' signal on hadjustment
sub _do_hadj_value_changed {
  my ($adj, $ref_weak_self) = @_;
  my $self = $$ref_weak_self || return;
  ### Graph hadj changed, v_range and redraw: "value=@{[$adj->value]} upper=@{[$adj->upper]} lower=@{[$adj->lower]}"

  update_v_range ($self);
  $self->queue_draw;
}

# 'changed' signal on hadjustment
*_do_hadj_other_changed = \&_do_hadj_value_changed;
#   my ($adj, $ref_weak_self) = @_;
#   my $self = $$ref_weak_self || return;
#   update_v_range ($self);
#   $self->queue_draw;
# }

# 'button-press-event' class closure
sub _do_button_press {



( run in 0.612 second using v1.01-cache-2.11-cpan-39bf76dae61 )