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 )