App-GUI-Cellgraph

 view release on metacpan or  search on metacpan

lib/App/GUI/Cellgraph/Frame/Tab/Action.pm  view on Meta::CPAN

            $row_sizer->Add( $self->{'arrow'}[$i], 0, $v_attr );
            $row_sizer->AddSpacer(0);
            $row_sizer->Add( $self->{'action_result'}[$i], 0, $v_attr );
            $row_sizer->Add( $self->{'action_spread'}[$i], 0, $v_attr );
            $row_sizer->Add( 0, 1, &Wx::wxEXPAND | &Wx::wxGROW);
            $self->{'plate_sizer'}->AddSpacer(10);
            $self->{'plate_sizer'}->Add( $row_sizer, 0, $std_attr, 0);
        }
        $self->Layout if $refresh;
    } elsif ($do_recolor) {
        my @rgb = map {[$_->values]} @colors;
        $self->{'rule_input'}[$_]->SetColors( @rgb ) for $self->{'subrules'}->index_iterator;
    }
}
sub set_callback {
    my ($self, $code) = @_;
    return unless ref $code eq 'CODE';
    $self->{'call_back'} = $code;
}

########################################################################
sub init {
    $_[0]->change_values_command( 'result', 'init', );
    $_[0]->change_values_command( 'spread', 'init', );
}

sub set_settings {
    my ($self, $settings) = @_;
    return unless ref $settings eq 'HASH' and exists $settings->{'result_summary'} and exists $settings->{'spread_summary'};
    $self->set_result_values( list_from_summary( $settings->{'result_summary'} ) );
    $self->set_spread_values( list_from_summary( $settings->{'spread_summary'} ) );
}
sub get_settings {
    my ($self) = @_;
    my $state = $self->get_state;
    delete $state->{'result_list'};
    delete $state->{'spread_list'};
    return $state;
}
sub get_state {
    my ($self) = @_;
    my @results = $self->get_result_values;
    my @spreads = $self->get_spread_values;
    {
        result_summary => summary_from_list(@results),
        spread_summary => summary_from_list(@spreads),
        result_list => [@results],
        spread_list => [@spreads],
    }
}

sub get_result_values { map { $_[0]->{'action_result'}[$_]->GetValue } $_[0]->{'subrules'}->index_iterator }
sub get_spread_values { map { $_[0]->{'action_spread'}[$_]->GetValue } $_[0]->{'subrules'}->index_iterator }

sub set_result_values {
    my ($self, @values) = @_;
    return unless @values == $self->{'subrules'}->independent_count;
    $self->{'action_result'}[$_]->SetValue( $values[$_], 'silent' ) for $self->{'subrules'}->index_iterator;
    $self->update_result_history( );
}
sub update_result_history {
    my ($self, $nr) = @_;
    return if defined $nr and not exists $self->{'action_result'}[$nr];
    $self->{'result_history'}->add_value( summary_from_list( $self->get_result_values ), (defined $nr) ? ($nr, time) : () );
    $self->update_button_state;
}

sub set_spread_values {
    my ($self, @values) = @_;
    return unless @values == $self->{'subrules'}->independent_count;
    $self->{'action_spread'}[$_]->SetValue( $values[$_], 'silent' ) for $self->{'subrules'}->index_iterator;
    $self->update_spread_history( );
}
sub update_spread_history {
    my ($self, $nr) = @_;
    return if defined $nr and not exists $self->{'action_spread'}[$nr];
    $self->{'spread_history'}->add_value( summary_from_list( $self->get_spread_values ), (defined $nr) ? ($nr, time) : () );
    $self->update_button_state
}
sub update_button_state {
    my ($self) = @_;
    $self->{'button'}{'result'}{'undo'}->Enable( $self->{'result_history'}->can_undo );
    $self->{'button'}{'result'}{'redo'}->Enable( $self->{'result_history'}->can_redo );
    $self->{'button'}{'spread'}{'undo'}->Enable( $self->{'spread_history'}->can_undo );
    $self->{'button'}{'spread'}{'redo'}->Enable( $self->{'spread_history'}->can_redo );
}



sub list_from_summary { split ',', $_[0] }
sub summary_from_list { join ',', @_ }

########################################################################
sub change_values_command {
    my ($self, $type, $command) = @_;
    my $sub_rule_count = $self->{'subrules'}->independent_count;
    if ($type eq 'result'){
        my @values = $self->get_result_values;
        if    ($command eq 'init'){ @values = map { 0.65      }  @values }
        elsif ($command eq 'copy'){ @values = map { $values[0]}  @values }
        elsif ($command eq 'add') { @values = map { $_ + 0.02 }  @values }
        elsif ($command eq 'sub') { @values = map { $_ - 0.02 }  @values }
        elsif ($command eq 'mul') { @values = map { $_ * 1.1  }  @values }
        elsif ($command eq 'div') { @values = map { $_ / 1.2  }  @values }
        elsif ($command eq 'wave'){ @values = map { ($_ % 2) ? ($values[$_] - 0.1) : ($values[$_] + 0.1) } 0 .. $#values }
        elsif ($command eq '+rnd'){ @values = map { $_ + ((rand 0.2)-0.1)} @values }
        elsif ($command eq 'rnd') { @values = map { (rand 2) - 1} @values }
        else { return; }
        $self->set_result_values( @values );
    } elsif ($type eq 'spread'){
        my @values = $self->get_spread_values;
        if    ($command eq 'init'){ @values = map { 0.2       }  @values }
        elsif ($command eq 'copy'){ @values = map { $values[0]}  @values }
        elsif ($command eq 'add') { @values = map { $_ + 0.02 }  @values }
        elsif ($command eq 'sub') { @values = map { $_ - 0.02 }  @values }
        elsif ($command eq 'mul') { @values = map { $_ * 1.05 }  @values }
        elsif ($command eq 'div') { @values = map { $_ / 1.1  }  @values }
        elsif ($command eq 'wave'){ @values = map { ($_ % 2) ? ($values[$_] - 0.1) : ($values[$_] + 0.1) } 0 .. $#values }
        elsif ($command eq '+rnd'){ @values = map { $_ + ((rand 0.2)-0.1)} @values }
        elsif ($command eq 'rnd') { @values = map { (rand 2) - 1} @values }
        else { return; }
        $self->set_spread_values( @values );
    }
}

1;



( run in 0.611 second using v1.01-cache-2.11-cpan-97f6503c9c8 )