Acme-Curses-Marquee
view release on metacpan or search on metacpan
lib/Acme/Curses/Marquee.pm view on Meta::CPAN
=head1 SYNOPSIS
Acme::Curses::Marquee implements a scrolling messageboard widget,
using C<figlet> to render the text.
use Curses;
use Acme::Curses::Marquee;
initscr;
# curses halfdelay mode is what actually drives the display
# and its argument is what determines the rate of the crawl
halfdelay(1);
# spawn subwindow to hold marquee and create marquee object
my $mw = subwin(9,80,0,0);
my $m = Acme::Curses::Marquee->new( window => $mw,
height => 9,
width => 80,
font => larry3d,
text => 'hello, world' );
# then, in the event loop
while (1) {
my $ch = getch;
do_input_processing_and_other_crud();
$m->scroll;
}
=head1 METHODS
=head2 new
Creates a new A::C::M object. Three arguments are required:
* window
* height
* width
C<window> should be a curses window that the marquee can write
to. C<height> and C<width> should be the height and width of that
window, in characters.
There are also two optional arguments: C<font>, which sets the figlet
font of the marquee (defaults to the figlet default, 'standard'), and
C<text> which will set an initial string to be displayed and cause the
marquee to start display as soon as it is created.
=cut
sub new {
my ($class,%args) = @_;
die "Can't create marquee object without a host window\n"
unless( defined $args{window} );
die "Can't create marquee object without height value\n"
unless( defined $args{height} );
die "Can't create marquee object without width value\n"
unless( defined $args{width} );
my $self = bless { win => $args{window},
height => $args{height},
width => $args{width},
font => $args{font} || 'standard',
srctxt => $args{text} || undef,
figtxt => '',
txtlen => 0,
offset => 0,
active => 0,
}, $class;
$self->text($self->{srctext}) if (defined $self->{srctxt});
return $self;
}
=head2 scroll
Scroll the marquee one position to the right.
=cut
sub scroll {
my $self = shift;
my $w = $self->{win};
my $x = $self->{width};
my $y = $self->{height};
my $len = $self->{txtlen};
my $off = $self->{offset};
my $fig = $self->{figtxt};
for (0..$y) { addstr($w, $_, 0, (' ' x $x)) }
$self->{offset} = 0 if ($self->{offset} == $len);
foreach my $i (0..(@{$fig} - 1)) {
if ($off + $x > $len) {
my $end = $len - $off;
my $rem = $x - $end;
my $tmp = substr($fig->[$i],$off,$end);
$tmp .= substr($fig->[$i],0,$rem);
addstr($w, $i, 0, $tmp);
} else {
addstr($w, $i, 0, substr($fig->[$i],$off,$x));
}
}
$self->{offset}++;
refresh($w);
}
=head2 text
Take a new line of text for the marquee...
$m->text("New line of text");
...render it via figlet, split it into an array, and perform width
adjustments as neccessary. Store the new text, figleted text, length
of figleted text lines, and set marquee state to active.
=cut
( run in 1.041 second using v1.01-cache-2.11-cpan-ceb78f64989 )