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 )