• Publicidad

Funciones para aplicaciones en consola

¿Estás desarrollando un proyecto, o piensas hacerlo? Pon aquí tu propuesta, lo más seguro es que alguien esté interesado en ayudarte.

Funciones para aplicaciones en consola

Notapor Gery-asgard » 2011-02-25 01:55 @121

Hola amigos les comparto unas funciones que hice para la creaciones de menús y otras funciones más, para facilitar la creación de pequeñas aplicaciones de consola.
Espero que les sea útil.
Saludos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3.  
  4.    require Term::Screen;
  5.    $scr = new Term::Screen;
  6.    unless ($scr) { die "Algo anda mal \n"; }
  7.    $scr->clrscr();
  8.    
  9.    sub marco {
  10.        my $x1 = $_[0];
  11.        my $x2 = $_[1];
  12.        my $y1 = $_[2];
  13.        my $y2 = $_[3];
  14.        my $forma = $_[4];
  15.        my $texto = $_[5];
  16.        
  17.        my $a;
  18.        my $b;
  19.        
  20.        $scr->at($y1, $x1)->puts($forma);
  21.        
  22.        my $esquina = substr ($forma, 0, 1);
  23.        $scr->at($y1, $x1)->puts($esquina);
  24.        
  25.        $esquina = substr ($forma, 1, 1);
  26.        for($a = $x1 + 1; $a<$x2; $a++) {
  27.            $scr->at($y1, $a)->puts($esquina);
  28.        }
  29.        
  30.        $esquina = substr ($forma, 2, 1);
  31.        $scr->at($y1, $x2)->puts($esquina);
  32.        
  33.        $esquina = substr ($forma, 3, 1);
  34.        for($a = $y1 + 1; $a<$y2; $a++) {
  35.            $scr->at($a, $x2)->puts($esquina);
  36.        }
  37.        
  38.        $esquina = substr ($forma, 4, 1);
  39.        $scr->at($y2, $x2)->puts($esquina);
  40.        
  41.        $esquina = substr ($forma, 5, 1);
  42.        for($a = $x1 + 1; $a<$x2; $a++) {
  43.            $scr->at($y2, $a)->puts($esquina);
  44.        }
  45.        
  46.        $esquina = substr ($forma, 6, 1);
  47.        $scr->at($y2, $x1)->puts($esquina);
  48.        
  49.        $esquina = substr ($forma, 7, 1);
  50.        for($a = $y1 + 1; $a<$y2; $a++) {
  51.            $scr->at($a, $x1)->puts($esquina);
  52.        }
  53.        
  54.        if (length($forma) > 7) {
  55.            my $b;
  56.            $esquina = substr ($forma, 8, 1);
  57.            for($a = $x1 + 1; $a < $x2; $a++) {
  58.                 for($b = $y1 + 1; $b < $y2; $b++) {
  59.                     $scr->at($b, $a)->normal()->puts($esquina);
  60.                 }
  61.            }
  62.        }
  63.        
  64.        if (length($texto) > 0) {
  65.            $scr->at($y1, $x1 + 2)->puts("[ " . $texto . " ]");
  66.        }  
  67.    }
  68.    
  69.    sub menu_h {
  70.        my @items = @_;
  71.        my $fila;
  72.        my $cantidad;
  73.        my $largo_max;
  74.        my $mas_largo;
  75.        my $a;
  76.        my $espacios;
  77.        my $separacion;
  78.        my $falta;
  79.        my $espacio1;
  80.        my $espacio2;
  81.        my $opcion = 0;
  82.        my $puntero = 0;
  83.        my $sombra;
  84.        my $c;
  85.        
  86.        $fila = pop @items;
  87.        
  88.        $scr->noecho();
  89.        
  90.        $cantidad = @items;
  91.        for( $a = 0; $a < $cantidad; $a++) {
  92.            if (length($items[$a]) > $mas_largo) {
  93.                 $mas_largo = length($items[$a]);
  94.            }
  95.        }
  96.        
  97.        for($a = 0; $a < $cantidad; $a++) {
  98.            $falta = $mas_largo - length($items[$a]);
  99.            if ($falta == 1) {
  100.                $espacio1 = " "x $falta;
  101.                $espacio2 = "";
  102.            } else {
  103.                $espacio1 = " "x ($falta / 2);
  104.                $espacio2 = " "x ($falta / 2);
  105.            }
  106.            $items[$a] = $espacio2 . $items[$a] . $espacio1;
  107.        }
  108.        
  109.        $espacios = $cantidad + 1;
  110.        
  111.        $separacion = (100 - ($mas_largo * $cantidad)) / $espacios;
  112.        $sombra = " " x $mas_largo;
  113.        
  114.        while ($opcion == 0) {
  115.            for($a = 0; $a < $cantidad; $a++) {
  116.                $scr->at($fila, ($a * $mas_largo) + ($separacion * ($a + 1)))->normal()->puts($sombra);
  117.                if ($a == $puntero) {
  118.                     $scr->at($fila, ($a * $mas_largo) + ($separacion * ($a + 1)))->reverse()->puts($items[$a])->normal();
  119.                } else {
  120.                     $scr->at($fila, ($a * $mas_largo) + ($separacion * ($a + 1)))->normal()->puts($items[$a]);
  121.                }
  122.            }
  123.            $scr->at(0,0);
  124.            $c = $scr->getch();
  125.            if ($c eq "kl") {
  126.                $puntero--;
  127.                if ($puntero < 0) {
  128.                    $puntero = $cantidad - 1;
  129.                }
  130.            }
  131.            
  132.            if ($c eq "kr") {
  133.                $puntero++;
  134.                if ($puntero > $cantidad - 1) {
  135.                    $puntero = 0;
  136.                }
  137.            }
  138.            
  139.            if (ord($c) == 13) {
  140.                $opcion = $puntero + 1;
  141.            }
  142.            
  143.            if ($c eq "-" || $c eq "+") {
  144.                $opcion = ord($c);
  145.            }
  146.        }
  147.        
  148.        $scr->echo();
  149.        return ($opcion);
  150.    }
  151.    
  152.    sub menu_v {
  153.        my @items = @_;
  154.        my $col;
  155.        my $fila;
  156.        my $cantidad;
  157.        my $largo_max;
  158.        my $mas_largo;
  159.        my $a;
  160.        my $espacios;
  161.        my $separacion;
  162.        my $falta;
  163.        my $espacio1;
  164.        my $espacio2;
  165.        my $opcion = 0;
  166.        my $puntero = 0;
  167.        my $sombra;
  168.        my $c;
  169.        
  170.        $col = pop @items;
  171.        $fila = pop @items;
  172.        
  173.        $scr->noecho();
  174.        
  175.        $cantidad = @items;
  176.        for( $a = 0; $a < $cantidad; $a++) {
  177.            if (length($items[$a]) > $mas_largo) {
  178.                 $mas_largo = length($items[$a]);
  179.            }
  180.        }
  181.        
  182.        for($a = 0; $a < $cantidad; $a++) {
  183.            $falta = $mas_largo - length($items[$a]);
  184.            if ($falta == 1) {
  185.                $espacio1 = " "x $falta;
  186.                $espacio2 = "";
  187.            } else {
  188.                $espacio1 = " "x ($falta / 2);
  189.                $espacio2 = " "x ($falta / 2);
  190.            }
  191.            $items[$a] = $espacio2 . $items[$a] . $espacio1;
  192.        }
  193.        
  194.        if ($col == 0) {
  195.            $col = (100 - $mas_largo) / 2;
  196.        }
  197.        
  198.        $sombra = " " x $mas_largo;
  199.        
  200.        while ($opcion == 0) {
  201.            for($a = 0; $a < $cantidad; $a++) {
  202.                $scr->at($fila + $a, $col)->normal()->puts($sombra);
  203.                if ($a == $puntero) {
  204.                     $scr->at($fila + $a, $col)->reverse()->puts($items[$a])->normal();
  205.                } else {
  206.                     $scr->at($fila + $a, $col)->normal()->puts($items[$a]);
  207.                }
  208.            }
  209.            $scr->at(35,0);
  210.            $c = $scr->getch();
  211.            if ($c eq "ku") {
  212.                $puntero--;
  213.                if ($puntero < 0) {
  214.                    $puntero = $cantidad - 1;
  215.                }
  216.            }
  217.            
  218.            if ($c eq "kd") {
  219.                $puntero++;
  220.                if ($puntero > $cantidad - 1) {
  221.                    $puntero = 0;
  222.                }
  223.            }
  224.            
  225.            if (ord($c) == 13) {
  226.                $opcion = $puntero + 1;
  227.            }
  228.            
  229.            if ($c eq "-" || $c eq "+") {
  230.                $opcion = ord($c);
  231.            }
  232.        }
  233.        
  234.        $scr->echo();
  235.        return ($opcion);
  236.    }  
  237.  
  238.    sub renglones {
  239.        my @matriz = @_;
  240.        my @datos;
  241.        my @etiquetas;
  242.        my @coor_x;
  243.        my @coor_y;
  244.        my @tipo;
  245.        my @tamano;
  246.        my $cantidad;
  247.        my $mas_largo = 0;
  248.        my $renglon = 0;
  249.        my @curso_pos;
  250.        my $resto;
  251.        my $valor;
  252.        my @conj;
  253.        my $salir = 0;
  254.        my $a;
  255.        my $c;
  256.        
  257.        $cantidad = @matriz;
  258.        
  259.        for ($a = 0; $a < $cantidad; $a++) {
  260.            @conj = @{$matriz[$a]};
  261.            push @datos, $conj[0];
  262.            push @etiquetas, $conj[1];
  263.            push @coor_y, $conj[2];
  264.            push @coor_x, $conj[3];
  265.            push @tipo, $conj[4];
  266.            push @tamano, $conj[5];
  267.            push @curso_pos, 0;
  268.            if ($mas_largo < length($etiquetas[$a])) {
  269.                $mas_largo = length($etiquetas[$a]);
  270.            }
  271.        }
  272.        
  273.        while ($salir == 0) {
  274.             for ($a = 0; $a < $cantidad; $a++) {
  275.                 $resto = " " x ($tamano[$a] - length($datos[$a]));
  276.                 $scr->at($coor_y[$a] + 0, $coor_x[$a] + 0)->normal()->puts($etiquetas[$a]);
  277.                 $scr->at($coor_y[$a] + 0, $coor_x[$a] + $mas_largo + 1)->reverse()->puts($datos[$a] . $resto)->normal();                    
  278.                 $scr->at($coor_y[$renglon], $coor_x[$renglon] + $mas_largo + 1 + $curso_pos[$renglon]);
  279.             }
  280.            
  281.             $c = $scr->getch();
  282.            
  283.             if ($c eq "ku") {
  284.                $renglon--;
  285.                if ($renglon < 0) {
  286.                    $renglon = $cantidad - 1;
  287.                }
  288.            }
  289.            
  290.            if ($c eq "kd") {
  291.                $renglon++;
  292.                if ($renglon > $cantidad - 1) {
  293.                    $renglon = 0;
  294.                }
  295.            }
  296.            
  297.            if ($c eq "kl") {
  298.                $curso_pos[$renglon]--;
  299.                if ($curso_pos[$renglon] < 0) {
  300.                    $curso_pos[$renglon] = $tamano[$renglon] - 1;
  301.                }
  302.            }
  303.            
  304.            if ($c eq "kr") {
  305.                $curso_pos[$renglon]++;
  306.                if ($curso_pos[$renglon] > $tamano[$renglon] - 1) {
  307.                    $curso_pos[$renglon] = 0;
  308.                }
  309.            }
  310.            
  311.            if (ord($c) == 13) {
  312.                $renglon++;
  313.                if ($renglon > $cantidad - 1) {
  314.                    $salir = 1;
  315.                }
  316.            }
  317.            
  318.            if ($c =~ m/\d/ && $tipo[$renglon] eq "n") {
  319.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  320.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  321.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  322.                    $curso_pos[$renglon]++;
  323.                }
  324.            }
  325.            
  326.            if ($c =~ m/\w/ && $tipo[$renglon] eq "c" && length($c) < 2) {
  327.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  328.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  329.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  330.                    $curso_pos[$renglon]++;
  331.                }
  332.            }
  333.            
  334.            if (ord($c) == 27) {
  335.                $salir = -1;
  336.            }
  337.            
  338.            if ($c eq "del" && $curso_pos[$renglon] < $tamano[$renglon]) {
  339.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . substr ($datos[$renglon], $curso_pos[$renglon] + 1, $tamano[$renglon]);
  340.            }
  341.            
  342.            if (ord($c) == 127 && $curso_pos[$renglon] > 0) {
  343.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon] - 1) . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  344.                $curso_pos[$renglon]--;
  345.            }
  346.            
  347.            if ($c eq " " && $tipo[$renglon] eq "c") {
  348.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  349.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  350.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  351.                    $curso_pos[$renglon]++;
  352.                }
  353.            }
  354.            
  355.            if ($c eq "-" && $curso_pos[$renglon] == 0 && $tipo[$renglon] eq "n") {
  356.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  357.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  358.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  359.                    $curso_pos[$renglon]++;
  360.                }  
  361.            }
  362.            
  363.            if ($c eq "." && $tipo[$renglon] eq "n" && $datos[$renglon] !~ m/\./) {
  364.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  365.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  366.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  367.                    $curso_pos[$renglon]++;
  368.                }  
  369.            }
  370.            if ($c eq "." && $tipo[$renglon] eq "c") {
  371.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  372.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  373.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  374.                    $curso_pos[$renglon]++;
  375.                }  
  376.            }
  377.            
  378.            if ($tipo[$renglon] eq "x" && length($c) < 2 && ord($c) != 127 && ord($c) != 13) {
  379.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  380.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  381.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  382.                    $curso_pos[$renglon]++;
  383.                }
  384.            }
  385.            
  386.            if ( ($c eq "s" || $c eq "S" ) && $tipo[$renglon] eq "b") {
  387.                $datos[$renglon] = "S";
  388.            }
  389.            
  390.            if ( ($c eq "n" || $c eq "N" ) && $tipo[$renglon] eq "b") {
  391.                $datos[$renglon] = "N";
  392.            }
  393.        }
  394.        
  395.        return @datos;
  396.    }
  397.    
  398.    sub tabs {
  399.        my @items = @_;
  400.        my $coor_y1;
  401.        my $coor_x1;
  402.        my $coor_y2;
  403.        my $coor_x2;
  404.        my $cantidad;
  405.        my $puntero;
  406.        my $a;
  407.        my $b;
  408.        my $desf;
  409.        my $espacio;
  410.        
  411.        $coor_x2 = pop @items;
  412.        $coor_y2 = pop @items;
  413.        $coor_x1 = pop @items;
  414.        $coor_y1 = pop @items;
  415.        $puntero = pop @items;
  416.        
  417.        $cantidad = @items;
  418.        
  419.        &marco($coor_x1, $coor_x2, $coor_y1, $coor_y2, "           ");
  420.        &marco($coor_x1, $coor_x2, $coor_y1+2, $coor_y2, "/-+|+-+|");
  421.        
  422.        for ($a = 0; $a < $cantidad; $a++) {
  423.             $desf = 0;
  424.             for ($b = 0; $b < $a; $b++) {
  425.                  $desf = $desf + length($items[$b]) + 2;
  426.             }
  427.            
  428.             $scr->at($coor_y1, $coor_x1  + $desf + 2 + $a)->puts("_" x length($items[$a]));
  429.             $scr->at($coor_y1 + 1, $coor_x1 + $desf + 1 + $a)->puts("/" . $items[$a] . "\\");                                              
  430.             if ($a == $puntero) {
  431.                 $espacio = " " x (length($items[$a]) + 2);
  432.                 $scr->at($coor_y1 + 2, $coor_x1 + $desf + $a)->puts("'" . $espacio . "'");
  433.                 $scr->at($coor_y1 + 2, $coor_x1)->puts("/");
  434.             }
  435.        }
  436.        $scr->at($coor_y2 + 1, 0);
  437.        
  438.    }
  439.  
  440.    
  441.    &marco(0, 99, 0, 20, "+-+|+-+| ", "Original:");
  442.    my $opcion1 = menu_v((" Cargar un nuevo archivo ", "Filtrar", " Exportar el archivo "), 2, 38);
  443.    my $opcion2 = menu_h((" Cargar un nuevo archivo ", "Filtrar", " Exportar el archivo "), 8);
  444.    my @items = (['23.3', 'Precio I:', 10, 5, 'n', 5],
  445.                 ['19.2', 'Precio II:', 11, 5, 'n', 5],
  446.                 ['Itaú', 'Nombre del Banco:', 12, 5, 'c', 15],
  447.                 ['18 de Julio 1123', 'Dirección del banco:', 13, 5, 'c', 25],
  448.                 );
  449.    @items = renglones(@items);
  450.    &tabs(("Tab I", "Tab II (largo para ver como ajusta el ancho)", "Tab III"), 1, 0, 0, 20, 100);
  451.    $scr->at(5, 10);
  452.    print "La opción del menu vertical elegida es: " . $opcion1;
  453.    $scr->at(6, 10);
  454.    print "La opción del menu horizontal elegida es: " . $opcion2;
  455.    $scr->at(7, 10);
  456.    print "Item 1: " . $items[0] . "\n";
  457.    $scr->at(8, 10);
  458.    print "Item 2: " . $items[1] . "\n";
  459.    $scr->at(9, 10);
  460.    print "Item 3: " . $items[2] . "\n";
  461.    $scr->at(10, 10);
  462.    print "Item 4: " . $items[3] . "\n";
  463.    $scr->at(22, 10);
  464.  
Coloreado en 0.013 segundos, usando GeSHi 1.0.8.4


P.D: el código no está comentado, pero se puede ejecutar y ver los ejemplos.
Gery-asgard
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-02-25 00:15 @052

Publicidad

Re: Ayuda del código

Notapor Gery-asgard » 2011-02-25 02:53 @162

NOTA: Estas funciones fueron creadas para facilitarme una aplicación que necesité. Deben de tener algún bug, y pueden ser mejoradas.

Funciones:
marco:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
   Parámetros:
               1) coordenada 'X' inicial
               2) coordenada 'Y' inicial
               3) coordenada 'X' final
               4) coordenada 'Y' final
               5) caracteres para formar el marco, "+-+|+-+|·"
                             
                  +------------+
                  |············|
                  |············|
                  +------------+

                el noveno carácter es el relleno
               6) Título
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


menu_v:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
   Parámetros:
               1) Lista de los ítem del menú ej: ("Ítem 1", "ítem 2", ..."ítem n")
               2) coordenada 'Y' donde comienza
               3) coordenada 'X' del centro del menú

   Retorno:    el número de ítem seleccionado
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


menu_h:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
   Parámetros:
               1) Lista de los ítem del menú ej: ("Ítem 1", "ítem 2", ..."ítem n")
               2) coordenada 'Y' donde se encuentra el menú

   Retorno:    el número de ítem seleccionado
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


renglones:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
   Parámetros:
   1) Lista de ítem

               Datos que tiene cada ítem:
                       1) El valor a editar , puede tener un valor inicial o no
                       2) La etiqueta de esa entrada
                       3) coordenada 'Y' del ítem
                       4) coordenada 'X' del ítem
                       5) tipo de valor 'n' numérico 'c' caracteres
                       6) número de dígitos del valor, o número de caracteres
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


tabs:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
   Parámetros:
                       1) Lista de las lengüetas: ("Ítem 1", "ítem 2", ..."ítem n")
                       2) lengüeta seleccionada
                       3) coordenada 'X' inicial
                       4) coordenada 'Y' inicial
                       5) coordenada 'X' final
                       6) coordenada 'Y' final
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Gery-asgard
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-02-25 00:15 @052


Volver a Proyectos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron