#!/usr/bin/perl
require Term::Screen;
$scr = new Term::Screen;
unless ($scr) { die "Algo anda mal \n"; }
$scr->clrscr();
sub marco {
my $x1 = $_[0];
my $x2 = $_[1];
my $y1 = $_[2];
my $y2 = $_[3];
my $forma = $_[4];
my $texto = $_[5];
my $a;
my $b;
$scr->at($y1, $x1)->puts($forma);
my $esquina = substr ($forma, 0, 1);
$scr->at($y1, $x1)->puts($esquina);
$esquina = substr ($forma, 1, 1);
for($a = $x1 + 1; $a<$x2; $a++) {
$scr->at($y1, $a)->puts($esquina);
}
$esquina = substr ($forma, 2, 1);
$scr->at($y1, $x2)->puts($esquina);
$esquina = substr ($forma, 3, 1);
for($a = $y1 + 1; $a<$y2; $a++) {
$scr->at($a, $x2)->puts($esquina);
}
$esquina = substr ($forma, 4, 1);
$scr->at($y2, $x2)->puts($esquina);
$esquina = substr ($forma, 5, 1);
for($a = $x1 + 1; $a<$x2; $a++) {
$scr->at($y2, $a)->puts($esquina);
}
$esquina = substr ($forma, 6, 1);
$scr->at($y2, $x1)->puts($esquina);
$esquina = substr ($forma, 7, 1);
for($a = $y1 + 1; $a<$y2; $a++) {
$scr->at($a, $x1)->puts($esquina);
}
if (length($forma) > 7) {
my $b;
$esquina = substr ($forma, 8, 1);
for($a = $x1 + 1; $a < $x2; $a++) {
for($b = $y1 + 1; $b < $y2; $b++) {
$scr->at($b, $a)->normal()->puts($esquina);
}
}
}
if (length($texto) > 0) {
$scr->at($y1, $x1 + 2)->puts("[ " . $texto . " ]");
}
}
sub menu_h {
my @items = @_;
my $fila;
my $cantidad;
my $largo_max;
my $mas_largo;
my $a;
my $espacios;
my $separacion;
my $falta;
my $espacio1;
my $espacio2;
my $opcion = 0;
my $puntero = 0;
my $sombra;
my $c;
$fila = pop @items;
$scr->noecho();
$cantidad = @items;
for( $a = 0; $a < $cantidad; $a++) {
if (length($items[$a]) > $mas_largo) {
$mas_largo = length($items[$a]);
}
}
for($a = 0; $a < $cantidad; $a++) {
$falta = $mas_largo - length($items[$a]);
if ($falta == 1) {
$espacio1 = " "x $falta;
$espacio2 = "";
} else {
$espacio1 = " "x ($falta / 2);
$espacio2 = " "x ($falta / 2);
}
$items[$a] = $espacio2 . $items[$a] . $espacio1;
}
$espacios = $cantidad + 1;
$separacion = (100 - ($mas_largo * $cantidad)) / $espacios;
$sombra = " " x $mas_largo;
while ($opcion == 0) {
for($a = 0; $a < $cantidad; $a++) {
$scr->at($fila, ($a * $mas_largo) + ($separacion * ($a + 1)))->normal()->puts($sombra);
if ($a == $puntero) {
$scr->at($fila, ($a * $mas_largo) + ($separacion * ($a + 1)))->reverse()->puts($items[$a])->normal();
} else {
$scr->at($fila, ($a * $mas_largo) + ($separacion * ($a + 1)))->normal()->puts($items[$a]);
}
}
$scr->at(0,0);
$c = $scr->getch();
if ($c eq "kl") {
$puntero--;
if ($puntero < 0) {
$puntero = $cantidad - 1;
}
}
if ($c eq "kr") {
$puntero++;
if ($puntero > $cantidad - 1) {
$puntero = 0;
}
}
if (ord($c) == 13) {
$opcion = $puntero + 1;
}
if ($c eq "-" || $c eq "+") {
$opcion = ord($c);
}
}
$scr->echo();
return ($opcion);
}
sub menu_v {
my @items = @_;
my $col;
my $fila;
my $cantidad;
my $largo_max;
my $mas_largo;
my $a;
my $espacios;
my $separacion;
my $falta;
my $espacio1;
my $espacio2;
my $opcion = 0;
my $puntero = 0;
my $sombra;
my $c;
$col = pop @items;
$fila = pop @items;
$scr->noecho();
$cantidad = @items;
for( $a = 0; $a < $cantidad; $a++) {
if (length($items[$a]) > $mas_largo) {
$mas_largo = length($items[$a]);
}
}
for($a = 0; $a < $cantidad; $a++) {
$falta = $mas_largo - length($items[$a]);
if ($falta == 1) {
$espacio1 = " "x $falta;
$espacio2 = "";
} else {
$espacio1 = " "x ($falta / 2);
$espacio2 = " "x ($falta / 2);
}
$items[$a] = $espacio2 . $items[$a] . $espacio1;
}
if ($col == 0) {
$col = (100 - $mas_largo) / 2;
}
$sombra = " " x $mas_largo;
while ($opcion == 0) {
for($a = 0; $a < $cantidad; $a++) {
$scr->at($fila + $a, $col)->normal()->puts($sombra);
if ($a == $puntero) {
$scr->at($fila + $a, $col)->reverse()->puts($items[$a])->normal();
} else {
$scr->at($fila + $a, $col)->normal()->puts($items[$a]);
}
}
$scr->at(35,0);
$c = $scr->getch();
if ($c eq "ku") {
$puntero--;
if ($puntero < 0) {
$puntero = $cantidad - 1;
}
}
if ($c eq "kd") {
$puntero++;
if ($puntero > $cantidad - 1) {
$puntero = 0;
}
}
if (ord($c) == 13) {
$opcion = $puntero + 1;
}
if ($c eq "-" || $c eq "+") {
$opcion = ord($c);
}
}
$scr->echo();
return ($opcion);
}
sub renglones {
my @matriz = @_;
my @datos;
my @etiquetas;
my @coor_x;
my @coor_y;
my @tipo;
my @tamano;
my $cantidad;
my $mas_largo = 0;
my $renglon = 0;
my @curso_pos;
my $resto;
my $valor;
my @conj;
my $salir = 0;
my $a;
my $c;
$cantidad = @matriz;
for ($a = 0; $a < $cantidad; $a++) {
@conj = @{$matriz[$a]};
push @datos, $conj[0];
push @etiquetas, $conj[1];
push @coor_y, $conj[2];
push @coor_x, $conj[3];
push @tipo, $conj[4];
push @tamano, $conj[5];
push @curso_pos, 0;
if ($mas_largo < length($etiquetas[$a])) {
$mas_largo = length($etiquetas[$a]);
}
}
while ($salir == 0) {
for ($a = 0; $a < $cantidad; $a++) {
$resto = " " x ($tamano[$a] - length($datos[$a]));
$scr->at($coor_y[$a] + 0, $coor_x[$a] + 0)->normal()->puts($etiquetas[$a]);
$scr->at($coor_y[$a] + 0, $coor_x[$a] + $mas_largo + 1)->reverse()->puts($datos[$a] . $resto)->normal();
$scr->at($coor_y[$renglon], $coor_x[$renglon] + $mas_largo + 1 + $curso_pos[$renglon]);
}
$c = $scr->getch();
if ($c eq "ku") {
$renglon--;
if ($renglon < 0) {
$renglon = $cantidad - 1;
}
}
if ($c eq "kd") {
$renglon++;
if ($renglon > $cantidad - 1) {
$renglon = 0;
}
}
if ($c eq "kl") {
$curso_pos[$renglon]--;
if ($curso_pos[$renglon] < 0) {
$curso_pos[$renglon] = $tamano[$renglon] - 1;
}
}
if ($c eq "kr") {
$curso_pos[$renglon]++;
if ($curso_pos[$renglon] > $tamano[$renglon] - 1) {
$curso_pos[$renglon] = 0;
}
}
if (ord($c) == 13) {
$renglon++;
if ($renglon > $cantidad - 1) {
$salir = 1;
}
}
if ($c =~ m/\d/ && $tipo[$renglon] eq "n") {
$datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
$datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
$curso_pos[$renglon]++;
}
}
if ($c =~ m/\w/ && $tipo[$renglon] eq "c" && length($c) < 2) {
$datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
$datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
$curso_pos[$renglon]++;
}
}
if (ord($c) == 27) {
$salir = -1;
}
if ($c eq "del" && $curso_pos[$renglon] < $tamano[$renglon]) {
$datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . substr ($datos[$renglon], $curso_pos[$renglon] + 1, $tamano[$renglon]);
}
if (ord($c) == 127 && $curso_pos[$renglon] > 0) {
$datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon] - 1) . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
$curso_pos[$renglon]--;
}
if ($c eq " " && $tipo[$renglon] eq "c") {
$datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
$datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
$curso_pos[$renglon]++;
}
}
if ($c eq "-" && $curso_pos[$renglon] == 0 && $tipo[$renglon] eq "n") {
$datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
$datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
$curso_pos[$renglon]++;
}
}
if ($c eq "." && $tipo[$renglon] eq "n" && $datos[$renglon] !~ m/\./) {
$datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
$datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
$curso_pos[$renglon]++;
}
}
if ($c eq "." && $tipo[$renglon] eq "c") {
$datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
$datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
$curso_pos[$renglon]++;
}
}
if ($tipo[$renglon] eq "x" && length($c) < 2 && ord($c) != 127 && ord($c) != 13) {
$datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
$datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
$curso_pos[$renglon]++;
}
}
if ( ($c eq "s" || $c eq "S" ) && $tipo[$renglon] eq "b") {
$datos[$renglon] = "S";
}
if ( ($c eq "n" || $c eq "N" ) && $tipo[$renglon] eq "b") {
$datos[$renglon] = "N";
}
}
return @datos;
}
sub tabs {
my @items = @_;
my $coor_y1;
my $coor_x1;
my $coor_y2;
my $coor_x2;
my $cantidad;
my $puntero;
my $a;
my $b;
my $desf;
my $espacio;
$coor_x2 = pop @items;
$coor_y2 = pop @items;
$coor_x1 = pop @items;
$coor_y1 = pop @items;
$puntero = pop @items;
$cantidad = @items;
&marco($coor_x1, $coor_x2, $coor_y1, $coor_y2, " ");
&marco($coor_x1, $coor_x2, $coor_y1+2, $coor_y2, "/-+|+-+|");
for ($a = 0; $a < $cantidad; $a++) {
$desf = 0;
for ($b = 0; $b < $a; $b++) {
$desf = $desf + length($items[$b]) + 2;
}
$scr->at($coor_y1, $coor_x1 + $desf + 2 + $a)->puts("_" x length($items[$a]));
$scr->at($coor_y1 + 1, $coor_x1 + $desf + 1 + $a)->puts("/" . $items[$a] . "\\");
if ($a == $puntero) {
$espacio = " " x (length($items[$a]) + 2);
$scr->at($coor_y1 + 2, $coor_x1 + $desf + $a)->puts("'" . $espacio . "'");
$scr->at($coor_y1 + 2, $coor_x1)->puts("/");
}
}
$scr->at($coor_y2 + 1, 0);
}
&marco(0, 99, 0, 20, "+-+|+-+| ", "Original:");
my $opcion1 = menu_v((" Cargar un nuevo archivo ", "Filtrar", " Exportar el archivo "), 2, 38);
my $opcion2 = menu_h((" Cargar un nuevo archivo ", "Filtrar", " Exportar el archivo "), 8);
my @items = (['23.3', 'Precio I:', 10, 5, 'n', 5],
['19.2', 'Precio II:', 11, 5, 'n', 5],
['Itaú', 'Nombre del Banco:', 12, 5, 'c', 15],
['18 de Julio 1123', 'Dirección del banco:', 13, 5, 'c', 25],
);
@items = renglones(@items);
&tabs(("Tab I", "Tab II (largo para ver como ajusta el ancho)", "Tab III"), 1, 0, 0, 20, 100);
$scr->at(5, 10);
print "La opción del menu vertical elegida es: " . $opcion1;
$scr->at(6, 10);
print "La opción del menu horizontal elegida es: " . $opcion2;
$scr->at(7, 10);
print "Item 1: " . $items[0] . "\n";
$scr->at(8, 10);
print "Item 2: " . $items[1] . "\n";
$scr->at(9, 10);
print "Item 3: " . $items[2] . "\n";
$scr->at(10, 10);
print "Item 4: " . $items[3] . "\n";
$scr->at(22, 10);