App-Music-ChordPro

 view release on metacpan or  search on metacpan

lib/ChordPro/Wx/Preview.pm  view on Meta::CPAN

#! perl

use v5.26;
use Object::Pad;
use utf8;
use Carp;

class ChordPro::Wx::Preview;

use ChordPro;
use ChordPro::Files;
use ChordPro::Paths;
use ChordPro::Wx::Config;
use ChordPro::Utils qw( demarkup :xp );

use Wx ':everything';
use Wx::Locale gettext => '_T';
use File::Temp qw( tempfile tempdir );
use File::Basename qw(basename);
use Ref::Util qw( is_hashref );

field $panel			:param;
field $msgs;
field $fatal;
field $died;
field $tmpdir;
field $preview_cho		:accessor;
field $preview_file;
field $preview_tmp;
field $unsaved_preview		:mutator;

BUILD {
    $tmpdir = tempdir( CLEANUP => 1 );
    $preview_cho = fn_catfile( $tmpdir, "preview.cho" );
}

method _warn( @m ) {
    $self->log( 'W',  join("",@m) );
    $msgs++;
}

method _info( @m ) {
    $self->log( 'I',  join("",@m) );
}

method _die( @m ) {
    $self->log( 'E',  join("", @m) );
    $msgs++;
    $fatal++;
    $died++;
}

method log( $level, $msg ) {
    $panel->log( $level, $msg );
}

method preview( $args, %opts ) {

    unlink($preview_file) if $preview_file;

    my $annotate = eval { $panel->prepare_annotations };

    #### ChordPro

    @ARGV = ();			# just to make sure
    push( @ARGV, "--debug" ) if $state{debug};
    push( @ARGV, "--trace" ) if $state{trace};
    push( @ARGV, "--verbose" ) for 1..($state{verbose}//0);

    $msgs = $fatal = $died = 0;
    local $SIG{__WARN__} = sub {
	if ( $state{debuginfo} && $_[0] =~ /^ChordPro invoked/ ) {
	    $self->log( 'I', "@_" );
	}
	else {
	    $self->_warn(@_);
	    $panel->add_annotation( $1-1, $2 )
	      if $annotate && "@_" =~ /^Line (\d+),\s+(.*)/;
	}
    };



( run in 0.495 second using v1.01-cache-2.11-cpan-5735350b133 )