The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;

use Tickit;

use Tickit::Widget::Static;
use Tickit::Widget::Tabbed;

my $tabbed = Tickit::Widget::Tabbed->new(
   tab_position => "bottom",
   ribbon_class => "CustomRibbon",
   style => {
           active_b => 1,
           active_u => 1,
   },
);

my $counter = 1;
sub add_tab
{
        $tabbed->add_tab(
                Tickit::Widget::Static->new( text => "Content for tab $counter" ),
                label => "tab$counter",
        );
        $counter++
}

add_tab for 1 .. 3;

my $tickit = Tickit->new();

$tickit->set_root_widget( $tabbed );

$tickit->bind_key(
        'C-a' => \&add_tab
);
$tickit->bind_key(
        'C-d' => sub {
                $tabbed->remove_tab( $tabbed->active_tab );
        },
);

$tickit->run;

package CustomRibbon;
use base qw( Tickit::Widget::Tabbed::Ribbon );

use Tickit::Style -copy;

BEGIN {
        style_definition base =>
                current_fg => 8;
}

package CustomRibbon::horizontal;
use base qw( CustomRibbon );

use Tickit::Utils qw( textwidth );

sub lines { 1 }
sub cols  { 1 }

sub render_to_rb
{
        my $self = shift;
        my ( $rb, $rect ) = @_;

        my @tabs = $self->tabs;

        $rb->goto( 0, 0 );
        $rb->text( sprintf "[%d tabs]: ", scalar @tabs );

        my $active = $self->active_tab;
        $rb->text( $active->label, $self->active_pen );

        $rb->text( " [also:" );

        foreach my $tab ( @tabs ) {
                $rb->erase( 1 );
                if( $tab == $active ) {
                        $rb->text( "x" x textwidth( $tab->label ), $self->get_style_pen( "current" ) );
                }
                else {
                        $rb->text( $tab->label );
                }
        }

        $rb->text( "]" );

        $rb->erase_to( $self->window->cols );
}

sub scroll_to_visible { }