App-GUI-Juliagraph
view release on metacpan or search on metacpan
lib/App/GUI/Juliagraph/Widget/SliderStep.pm view on Meta::CPAN
use v5.12;
use warnings;
use Wx;
# combined widget with a slider that dials in a value between 0 and 1
# and 2 butons that trigger and event to add or subtract this value
package App::GUI::Juliagraph::Widget::SliderStep;
use base qw/Wx::Panel/;
my $resolution = 100;
sub new {
my ( $class, $parent, $slider_length, $slider_pos, $init_value, $max_value, $exponent, $minus_label, $plus_label ) = @_;
$slider_length //= 50;
$slider_pos //= 2;
$slider_pos = int $slider_pos;
$slider_pos = 2 if $slider_pos < 1 and $slider_pos > 3;
$minus_label //= '-';
$plus_label //= '+';
$init_value //= 0.5;
$max_value //= 1;
return if $init_value > $max_value;
my $self = $class->SUPER::new( $parent, -1);
$self->{'init_value'} = $init_value;
$self->{'max_value'} = $max_value;
$self->{'exponent'} = $exponent;
$self->{'callback'} = sub {};
$self->{'btn'}{'-'} = Wx::Button->new( $self, -1, $minus_label, [-1,-1],[40, 30] );
$self->{'btn'}{'+'} = Wx::Button->new( $self, -1, $plus_label, [-1,-1],[40, 30] );
$self->{'slider'} = Wx::Slider->new( $self, -1, $self->{'init_value'} * $resolution,
0, $self->{'max_value'} * $resolution,
[-1,-1], [$slider_length, -1], &Wx::wxSL_HORIZONTAL | &Wx::wxSL_BOTTOM );
$self->{'btn'}{'-'}->SetToolTip( "decrease value by a step" );
$self->{'btn'}{'+'}->SetToolTip( "increase value by a step");
$self->{'slider'}->SetToolTip( 'step size' );
my $std = &Wx::wxALIGN_LEFT | &Wx::wxALIGN_CENTER_VERTICAL | &Wx::wxGROW;
my $box = $std | &Wx::wxTOP | &Wx::wxBOTTOM;
my $sizer = Wx::BoxSizer->new(&Wx::wxHORIZONTAL);
$sizer->Add( $self->{'btn'}{'-'}, 0, $box, 0);
$sizer->Add( $self->{'btn'}{'+'}, 0, $box, 0);
$sizer->AddSpacer( 10 );
$sizer->Insert( $slider_pos, $self->{'slider'}, 0, $box, 3);
$sizer->Add( 0, 1, &Wx::wxEXPAND|&Wx::wxGROW);
$self->SetSizer($sizer);
Wx::Event::EVT_BUTTON( $self, $self->{'btn'}{'-'}, sub { $self->{'callback'}->( -$self->GetValue ) });
Wx::Event::EVT_BUTTON( $self, $self->{'btn'}{'+'}, sub { $self->{'callback'}->( $self->GetValue ) });
Wx::Event::EVT_SLIDER( $self, $self->{'slider'}, sub { $self->{'slider'}->SetToolTip( 'step size: '. $self->GetValue ); });
return $self;
}
sub GetValue { ($_[0]->{'slider'}->GetValue / $resolution) ** $_[0]->{'exponent'} }
sub SetValue {
my ( $self, $value) = @_;
return if not efined $value or $value > $self->{'max_value'};
$self->{'slider'}->SetValue(($value * $resolution) ** (1/$self->{'exponent'}));
}
sub Reset { $_[0]->SetValue( $_[0]->{'init_value'} ) }
sub SetCallBack {
my ( $self, $code) = @_;
return unless ref $code eq 'CODE';
$self->{'callback'} = $code;
}
1;
( run in 0.523 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )