LPDS
view release on metacpan or search on metacpan
lib/LPDS/Renderer.pm view on Meta::CPAN
sub select_model {
my $self = shift;
my $iter = shift;
return undef if !defined $iter;
my $path = $self->data->get_path($iter);
foreach my $model (@{$self->models}) {
my $curr_path = $model->row->get_path;
if ($path->compare($curr_path)==0) {
$model->set_selected(1);
}
else {
$model->set_selected(0);
}
}
}
sub add_model {
my $self = shift;
my $iter = shift;
my $data = $self->data;
my $name = $data->get( $iter, COL_NAME );
# create model object
my $path = $self->data->get_path($iter);
my $row = Gtk2::TreeRowReference->new( $self->data, $path );
my $model = LPDS::RendererModel->new(
top_group => $self->top_group,
row => $row,
parent => $self,
);
my $h = $model->curve->signal_connect( 'button-release-event', $self->click_callback, $model );
$model->handler($h);
push @{ $self->models }, $model;
}
sub delete_model {
my $self = shift;
my $i = shift;
my $model = $self->models->[$i];
$model->curve->signal_handler_disconnect($model->handler);
splice @{ $self->models }, $i, 1;
say "after deletion: ";
foreach my $model (@{$self->models}) {
my $name = $self->data->get($model->get_iter,COL_NAME);
say "\t$name";
}
# update axis ticks
$self->update_all_axis;
}
sub update_axis {
my $self = shift;
my $name = shift;
confess "no axis named $name" if !exists $self->axes->{$name};
my $axis = $self->axes->{$name};
my %extreme; # mode => [min,max]
foreach my $mode ( @{ $axis->modes } ) {
my @values;
foreach my $model ( @{ $self->models } ) {
my $value = $model->get_data_by_axis( $name, $mode );
push @values, $value if defined $value;
}
@values = sort { $a <=> $b } @values;
if ( @values > 1 ) {
my ( $min, $max ) = @values[ 0, -1 ];
$extreme{$mode} = [ $min, $max ];
}
elsif ( @values == 1 ) {
$extreme{$mode} = [ $values[0], $values[0] ];
}
else {
$extreme{$mode} = [ undef, undef ];
}
}
$axis->try_modify_min_max(%extreme);
}
sub update_all_axis {
my $self = shift;
$self->update_axis($_) foreach keys %{ $self->axes };
}
sub request_model_render {
my $self = shift;
foreach my $model ( @{ $self->models } ) {
$model->need_render(1);
}
}
sub render_model_if_needed {
my $self = shift;
foreach my $model ( @{ $self->models } ) {
$model->render_if_needed;
}
}
sub render_axis_if_needed {
my $self = shift;
foreach my $name ( keys %{ $self->axes } ) {
$self->axes->{$name}->render_if_needed;
}
}
sub on_data_inserted {
say "# on_data_inserted #";
my ( $data, $path, $iter, $self ) = @_;
$self->add_model($iter);
$self->update_all_axis;
}
sub on_data_deleted {
say "# on_data_deleted #";
my ( $data, $path, $self ) = @_;
my $i = ( split /:/, $path->to_string )[0];
# do deletion
$self->delete_model($i);
$self->update_all_axis;
$self->render_axis_if_needed;
$self->render_model_if_needed;
}
sub on_data_changed {
say "# on_data_changed #";
my ( $data, $path, $iter, $self ) = @_;
foreach my $model ( @{ $self->models } ) {
my $curr_path = $model->row->get_path;
$model->need_render(1) if $curr_path->compare($path) == 0;
}
$self->update_all_axis;
$self->render_axis_if_needed;
$self->render_model_if_needed;
}
1;
( run in 1.654 second using v1.01-cache-2.11-cpan-39bf76dae61 )