Audio-Nama
view release on metacpan or search on metacpan
lib/Audio/Nama/Terminal.pm view on Meta::CPAN
use Audio::Nama::Globals qw(:singletons $this_bus $this_track $text);
use Audio::Nama::Log qw(logpkg logsub);
use Data::Dumper::Concise;
use List::MoreUtils qw(first_index);
use File::Basename qw(fileparse);
#use DDP;
=comment
widget tree:
tickit
term
vbox (root)
scroller
item
item
entry
=cut
{
my ($root, $tickit, $term, $scroller, $entry);
$text->{loop} = IO::Async::Loop->new;
sub initialize_terminal {
$root = Tickit::Widget::VBox->new;
$scroller = Tickit::Widget::Scroller->new;
$tickit = Tickit::Async->new( root => $root);
$text->{tickit} = $tickit;
$text->{term} = $term = $tickit->term;
my $lines = $term->lines;
create_entry_widget();
setup_key_bindings();
$root->add($scroller, valign => 'top', force_size => $lines - 2);
$root->add($entry, valign => 'top');
}
sub create_entry_widget {
my $do_command = sub { my ( $self, $line ) = @_;
print_to_terminal($line);
$line =~ s/^.+?>\s*//;
process_line($line);
show_prompt();
};
$entry = Tickit::Widget::Entry->new(
text => prompt(),
on_enter => $do_command,
);
show_prompt();
}
sub setup_key_bindings {
Tickit::Widget::Entry::Plugin::Completion->apply($entry,
gen_words => \&gen_words,
use_popup => 0,
ignore_case => 1);
my $backspace = sub {
my $stop_pos = length prompt();
$entry->text_delete( $entry->position - 1, 1 )
unless $entry->position <= $stop_pos
};
my $left = sub {
my $stop_pos = length prompt();
$entry->set_position( $entry->position - 1 )
unless $entry->position <= $stop_pos
};
my $spacebar = sub {
if ( $config->{press_space_to_start}
and $entry->position == length prompt()
and ! ($mode->song or $mode->live) )
{ toggle_transport() }
else { $entry->on_text(' ') }
};
$entry->bind_keys(
'Up' => sub { previous_command() },
'Down' => sub { next_command() },
'Left' => $left,
'C-a' => sub { $entry->set_position( length prompt() ) },
'Home' => sub { $entry->set_position( length prompt() ) },
'C-k' => sub { $entry->text_delete( $entry->position, 999) },
'C-u' => sub { $entry->text_delete(
length prompt(),
$entry->position - length prompt() ) },
'C-h' => $backspace,
'Backspace' => $backspace,
' ' => $spacebar,
'C-z' => \&suspend,
);
}
sub suspend
{
$term->pause;
kill STOP => $$;
$term->resume;
}
sub show_prompt {
$entry->set_text(prompt());
$entry->set_position(99);
}
sub print_to_terminal (@text) {
return unless defined $scroller;
chomp for @text;
$scroller->push( Tickit::Widget::Scroller::Item::Text->new( join ' ', @text ));
$scroller->scroll_to_bottom;
}
sub prompt {
logsub((caller(0))[3]);
( run in 1.131 second using v1.01-cache-2.11-cpan-364913b4093 )