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;
package Layout;
use parent qw(Tickit::Async);

use Tickit::Widget::VBox;
use Tickit::Widget::Entry;
use Tickit::Widget::Static;
use Tickit::Widget::HBox;
use Tickit::Widget::Tree;

sub new {
	my $class = shift;
	my $self = $class->SUPER::new(@_);
	$self->{current_line} = 0;


# Set up a sub and widget to hold some basic log messages
	my $out;
	my $messages = Tickit::Widget::VBox->new;
	my $report = sub {
		my $msg = shift;
		$messages->remove(0) while $messages->children >= $self->rootwin->lines;
		$messages->add(Tickit::Widget::Static->new(text => $msg, align => 'left', valign => 'top'));
	};

# Top-level holder
	my $holder = $self->{holder} = Tickit::Widget::HBox->new;
	$holder->set_window($self->rootwin); # should really set_root_widget perhaps
	my $tree = Tickit::Widget::Tree->new(
		is_open => 1,
		last => 1,
		label => 'Root',
		line_style => 'single',
	);
	$tree->add(Tickit::Widget::Tree->new(
		parent => $tree,
		is_open => 1,
		last => 0,
		label => 'First',
	));
	$tree->add(Tickit::Widget::Tree->new(
		parent => $tree,
		is_open => 1,
		last => 0,
		label => 'Next entry',
	));
	$tree->add(Tickit::Widget::Tree->new(
		parent => $tree,
		is_open => 0,
		last => 1,
		label => 'First child',
	));

	$holder->add($tree, expand => 0.5);
	$holder->add($messages, expand => 0.5);
	$report->('Added widgets');
	$tree->resized;
	return $self;
}

package MenuLayout;
use utf8;
use IO::Async::Loop;

sub new { bless { }, shift }

sub run {
	my $self = shift;
	$self->{loop} = IO::Async::Loop->new;
	$self->{ui} = Layout->new;
	$self->loop->add($self->ui);
	$self->ui->run;
}

sub loop { shift->{loop} }
sub ui { shift->{ui} }

package main;
MenuLayout->new->run;