App-financeta
view release on metacpan or search on metacpan
lib/App/financeta/gui/editor.pm view on Meta::CPAN
sub { $_[0]->editor_edit->redo },
],
[
'edit_select', 'Select All', 'Ctrl+A', '^A',
sub { $_[0]->editor_edit->select_all },
],
],
]],
onDestroy => sub {
if ($self->parent and $self->tab_name) {
$self->parent->close_editor($self->tab_name);
}
},
);
my $is_dark_mode = (cl::to_gray_byte($mw->map_color($mw->color)) > cl::to_gray_byte($mw->map_color($mw->backColor))) ? 1 : 0;
$log->debug("Editor window dark mode test: $is_dark_mode\n");
my @sz = $mw->size;
$sz[0] *= 0.98;
$sz[1] *= 0.98;
my $ed = $mw->insert(Edit => name => 'editor_edit',
text => '#This line is auto-generated',
pack => { expand => 1, fill => 'both' },
syntaxHilite => 1,
hScroll => 1,
growMode => gm::Client | gm::GrowHiX | gm::GrowHiY,
hiliteNumbers => cl::Red,
hiliteQStrings => cl::Red,
hiliteQQStrings => cl::Red,
hiliteChars => [ ';:?/,~`!@#$%^&*()-_+=\|]}{[./', $is_dark_mode ? cl::White : cl::Black],
# hiliteIDs => [$keywords, cl::Green],
tabIndent => 4,
size => \@sz,
visible => 1,
# check these
cursorWrap => 1,
persistentBlock => 1,
wantTabs => 1,
);
my $regexes = $self->compiler->get_grammar_regexes($is_dark_mode);
my @arr = ();
my %color_scheme = (
conditions => $is_dark_mode ? cl::LightCyan : cl::Blue,
keywords => $is_dark_mode ? cl::Yellow : cl::Green,
booleans => $is_dark_mode ? cl::LightGreen : cl::Brown,
variables => $is_dark_mode ? cl::Magenta : cl::Red,
plain => $is_dark_mode ? cl::White : cl::Black,
);
foreach my $k (keys %$regexes) {
if (ref $regexes->{$k} eq 'ARRAY') {
push @arr, '(?i:(' . join('|', @{$regexes->{$k}}) . '))';
} else {
push @arr, $regexes->{$k};
}
push @arr, $color_scheme{$k} // $color_scheme{plain},
}
my $hlres = $ed->hiliteREs;
$ed->hiliteREs([@arr, @$hlres]);
return $mw;
}
sub update_editor {
my ($self, $rules, $tabname, $vars, $hidden) = @_;
$self->tab_name($tabname) if defined $tabname;
$self->compiler->preset_vars($vars) if defined $vars;
$self->main->editor_edit->text($rules);
unless ($hidden) {
$self->main->show;
$self->main->bring_to_front;
}
1;
}
sub close {
my $self = shift;
#my $win = $self->main;
#my $txt = $win->editor_edit->text;
#$self->parent->save_editor($txt, $self->tab_name, 1);
if ($self->parent) {
$self->parent->close_editor($self->tab_name);
}
$self->main->close;
}
sub get_text {
my $self = shift;
return $self->main->editor_edit->text;
}
sub compile {
my ($self, $txt) = @_;
my $output;
try {
$output = $self->compiler->compile($txt);
} catch {
my $err = $_;
$log->error("Compiler error:\n$err");
#TODO: create a better window
message("Compiler Error\n$err");
};
return $output;
}
sub execute {
my ($self, $txt) = @_;
my $code = $self->compile($txt);
return unless $code;
try {
my $coderef = $self->compiler->generate_coderef($code);
if ($self->parent) {
$log->info("Executing rules for tab name: ", $self->tab_name);
$self->parent->execute_rules($self->tab_name, $coderef);
}
} catch {
my $err = $_;
$log->error("Error executing generated code:\n$err");
$log->debug("Erroneous code: $code");
#TODO: create a better window
message("Error executing generated code:\n$err");
};
}
( run in 1.064 second using v1.01-cache-2.11-cpan-39bf76dae61 )