The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use strict;
use Prima qw(Image::Animate VB::VBLoader);
sub animation_to_frames
{
my $a = Prima::Image::Animate::WebP->new(images => \@_);
my @ret;
for ( @_ ) {
$a->next;
my $n = (ref eq 'Prima::Icon') ? $a->icon : $a->image;
$n->{extras} = $_->{extras} if exists $_->{extras};
push @ret, $n;
}
return @ret;
}
sub cc($) { join '', map { ucfirst } split '_', shift }
sub fields { qw( compression quality method filter_strength) }
sub on_change
{
my ( $self, $codec, $image) = @_;
$self-> {image} = $image;
my $e = $image-> {extras} //= {};
$self-> bring(cc $_)-> text($e->{$_} // $codec->{saveInput}->{$_}) for fields;
}
sub OK_Click
{
my $self = $_[0]-> owner;
$self-> {image}-> {extras} ||= {};
my $e = $self-> {image}-> {extras};
$e->{$_} = $self->bring(cc $_)->text for fields;
delete $self-> {image};
}
sub Cancel_Click
{
my $self = $_[0]-> owner;
delete $self-> {image};
}
sub save_dialog
{
my $codec = $_[1];
my $dialog = Prima::VBLoad( 'Prima::Image::webp.fm',
Form1 => {
visible => 0,
onChange => \&on_change,
},
OK => { onClick => \&OK_Click },
Cancel => { onClick => \&Cancel_Click },
);
Prima::message($@) unless $dialog;
return $dialog;
}
1;