LibUI

 view release on metacpan or  search on metacpan

eg/calculator.pl  view on Meta::CPAN

uiBoxSetPadded( $vbox, 1 );
uiWindowSetChild( $main_win, $vbox );
$lbl_display = uiNewLabel('0');
uiBoxAppend( $vbox, $lbl_display, 0 );
my $sep = uiNewHorizontalSeparator();
uiBoxAppend( $vbox, $sep, 0 );

# Button grid
my $grid = uiNewGrid();
uiGridSetPadded( $grid, 1 );
uiBoxAppend( $vbox, $grid, 1 );

# Button helper
sub make_btn( $label, $cb ) {
    my $btn = uiNewButton($label);
    uiButtonOnClicked( $btn, $cb, undef );
    return $btn;
}

# uiGridAppend(grid, control, left, top, xspan, yspan, hexpand, halign, vexpand, valign)
# halign/valign: 0=fill, 1=start, 2=center, 3=end
my @grid_btns;

# Row 0: C, ±, ⌫, ÷
push @grid_btns, [ make_btn( 'C', sub { handle_clear() } ),     0, 0 ];
push @grid_btns, [ make_btn( '±', sub { handle_negate() } ),    1, 0 ];
push @grid_btns, [ make_btn( '⌫', sub { handle_backspace() } ), 2, 0 ];
push @grid_btns, [ make_btn( '÷', sub { handle_operator('/') } ), 3, 0 ];

# Row 1: 7, 8, 9, ×
push @grid_btns, [ make_btn( '7', sub { handle_number(7) } ),     0, 1 ];
push @grid_btns, [ make_btn( '8', sub { handle_number(8) } ),     1, 1 ];
push @grid_btns, [ make_btn( '9', sub { handle_number(9) } ),     2, 1 ];
push @grid_btns, [ make_btn( '×', sub { handle_operator('*') } ), 3, 1 ];

# Row 2: 4, 5, 6, −
push @grid_btns, [ make_btn( '4', sub { handle_number(4) } ),     0, 2 ];
push @grid_btns, [ make_btn( '5', sub { handle_number(5) } ),     1, 2 ];
push @grid_btns, [ make_btn( '6', sub { handle_number(6) } ),     2, 2 ];
push @grid_btns, [ make_btn( '−', sub { handle_operator('-') } ), 3, 2 ];

# Row 3: 1, 2, 3, +
push @grid_btns, [ make_btn( '1', sub { handle_number(1) } ),     0, 3 ];
push @grid_btns, [ make_btn( '2', sub { handle_number(2) } ),     1, 3 ];
push @grid_btns, [ make_btn( '3', sub { handle_number(3) } ),     2, 3 ];
push @grid_btns, [ make_btn( '+', sub { handle_operator('+') } ), 3, 3 ];

# Row 4: 0 (span 2), ., =
push @grid_btns, [ make_btn( '0', sub { handle_number(0) } ), 0, 4, 2 ];
push @grid_btns, [ make_btn( '.', sub { $display_text .= '.'; update_display(); } ), 2, 4, 1 ];
push @grid_btns, [ make_btn( '=', sub { handle_equals() } ), 3, 4, 1 ];
for my $b (@grid_btns) {
    my ( $btn, $col, $row, $xspan ) = @$b;
    $xspan //= 1;
    uiGridAppend( $grid, $btn, $col, $row, $xspan, 1, 1, 0, 1, 0 );
}
#
uiMenuItemOnClicked(
    $mi_copy,
    sub {
        # Copy result to clipboard would go here
        uiMsgBox( $main_win, 'Copy', 'Result: ' . $display_text );
    },
    undef
);
uiMenuItemOnClicked( $mi_clear, sub { handle_clear() }, undef );
uiWindowOnClosing(
    $main_win,
    sub {
        uiQuit();
        return 1;
    },
    undef
);
#
uiControlShow($main_win);
uiMain();



( run in 1.381 second using v1.01-cache-2.11-cpan-84e82930d8c )