App-Tarotplane

 view release on metacpan or  search on metacpan

lib/App/Tarotplane/UI.pm  view on Meta::CPAN

    First => [ KEY_NPAGE, KEY_END, ],
    Last  => [ KEY_PPAGE, KEY_HOME, ],
    Quit  => [ 'q', ],
    Help  => [ '?', ],
);

my $CONTROLS_HELP = <<END;
Next:      right, l
Previous:  left, h
Flip:      up/down, j/k, space
First      card: page up, home
Last card: page down, end
Quit:      q
Help:      ?
END

sub init {

    my $class = shift;
    my $self = {
        MainWin => undef,
        CardWin => undef,
        InfoWin => undef,
        CardStr => '',
        InfoStr => '',
    };

    if ($Cursed) {
        die "Curses is already running";
    }

    bless $self, $class;

    initscr();

    curs_set(0);
    cbreak();
    noecho();
    keypad(1);

    $self->{MainWin} = $stdscr;

    $self->{InfoWin} = newwin(1, $COLS, $LINES - 1, 0);
    $self->{CardWin} = newwin($LINES - 3, $COLS - 2, 1, 1);

    $Cursed = 1;

    return $self;

}

sub wipe {

    my $self = shift;

    erase($self->{MainWin});
    noutrefresh($self->{MainWin});

}

sub update {

    my $self = shift;

    doupdate();

}

sub draw_card {

    my $self = shift;
    my $str  = shift;
    my $bold = shift;

    # Make room for the box borders and a single whitespace on each side.
    my $linemax = getmaxx($self->{CardWin}) - 4;

    $self->{CardStr} = $str if defined $str;

    $columns = $linemax;
    my $text = wrap('', '', $self->{CardStr});

    if (defined $bold) {
        attrset($self->{CardWin}, $bold ? A_BOLD : A_NORMAL);
    }

    erase($self->{CardWin});
    box($self->{CardWin}, 0, 0);

    my $ypos = (getmaxy($self->{CardWin}) / 2) - (($text =~ tr/\n//) / 2);

    foreach my $l (split /\n/, $text) {
        $l =~ s/^\s+|\s+$//; # Trim leading/trailing whitespace.
        $l =~ s/\s+/ /g;     # Truncate space.
        addstr($self->{CardWin}, $ypos++, (($linemax + 4) - length($l)) / 2, $l);
    }

    noutrefresh($self->{CardWin});

}

sub draw_info {

    my $self = shift;
    my $info = shift;

    $self->{InfoStr} = $info if defined $info;

    erase($self->{InfoWin});

    addstr($self->{InfoWin}, $self->{InfoStr});

    noutrefresh($self->{InfoWin});

}

sub draw_help {

    my $self = shift;

    my $y = 0;
    foreach my $l (split /\n/, $CONTROLS_HELP) {
        addstr($self->{MainWin}, $y++, 0, $l);
    }

    noutrefresh($self->{MainWin});

}

sub update_size {

    my $self = shift;

    $self->wipe();

    resize($self->{InfoWin}, 1, $COLS);
    mvwin($self->{InfoWin}, $LINES - 1, 0);

    resize($self->{CardWin}, $LINES - 3, $COLS - 2);
    mvwin($self->{CardWin}, 1, 1);

    $self->draw_card();
    $self->draw_info();

    $self->update();

}

sub poll {

    my $self = shift;

    while (my $in = getch()) {

        if ($in eq KEY_RESIZE) {
            $self->update_size();
            next;
        }

        foreach my $k (keys %KEY_BINDINGS) {
            return $k if grep { $in eq $_ } @{$KEY_BINDINGS{$k}};
        }

        return undef;

    }

}

sub end {

    my $self = shift;

    endwin();

    foreach my $win (grep { /Win$/ } keys %{$self}) {
        $self->{$win} = undef;
    }

    $Cursed = 0;

}

DESTROY {

    my $self = shift;

    $self->end();

}



( run in 2.249 seconds using v1.01-cache-2.11-cpan-a49fcb8fa48 )