The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Tickit::Async;

use IO::Async::Timer::Periodic;

use Tickit::Widget::VBox;

use Tickit::Widget::MenuBar;
use Tickit::Widget::Menu;
use Tickit::Widget::Menu::Item;

use Tickit::Widget::Scroller;
use Tickit::Widget::Scroller::Item::RichText;

use String::Tagged;

my $loop = IO::Async::Loop->new;
my $tickit = Tickit::Async->new;
$loop->add( $tickit );

my $scroller;

my $counter = 51;
my $colour = "white";
$loop->add( my $timer = IO::Async::Timer::Periodic->new(
   interval => 0.5,
   on_tick => sub {
      my $str = String::Tagged->new( "Line of content number $counter for testing menu" );
      $str->apply_tag( 0, -1, fg => $colour );
      $scroller->push( Tickit::Widget::Scroller::Item::RichText->new( $str ) );
      $counter++;
   }
) );

my @colours = qw( white red green blue );

my $menubar = Tickit::Widget::MenuBar->new(
   items => [
      Tickit::Widget::Menu->new( name => "Demo",
         items => [
            Tickit::Widget::Menu::Item->new( name => "Start timer", on_activate => sub { $timer->start } ),
            Tickit::Widget::Menu::Item->new( name => "Stop timer",  on_activate => sub { $timer->stop  } ),
            Tickit::Widget::Menu->separator,
            Tickit::Widget::Menu::Item->new( name => "Exit", on_activate => sub { $tickit->stop } ),
         ],
      ),
      Tickit::Widget::Menu->new( name => "Scroller",
         items => [
            Tickit::Widget::Menu::Item->new( name => "Scroll to top",    on_activate => sub { $scroller->scroll_to_top } ),
            Tickit::Widget::Menu::Item->new( name => "Scroll to bottom", on_activate => sub { $scroller->scroll_to_bottom } ),
            Tickit::Widget::Menu->separator,
            Tickit::Widget::Menu->new(
               name => "Set colour...",
               items => [ map {
                  my $c = $_;
                  Tickit::Widget::Menu::Item->new( name => $c, on_activate => sub { $colour = $c } ),
               } @colours ] ),
         ],
      ),
      Tickit::Widget::Menu->separator,
      Tickit::Widget::Menu->new( name => "Help",
         items => [
            Tickit::Widget::Menu::Item->new( name => "About" ),
         ],
      ),
   ],
);

my $vbox = Tickit::Widget::VBox->new;

$vbox->add( $menubar );

$vbox->add( $scroller = Tickit::Widget::Scroller->new, expand => 1 );

$scroller->push( Tickit::Widget::Scroller::Item::Text->new( "Line of content number $_ for testing menu" ) ) for 1 .. 50;
$scroller->scroll_to_bottom;

$tickit->set_root_widget( $vbox );

$tickit->run;