Меnu:


En el articulo one hand menu vimos el archivo de configuración del menú, el cual permite construir el flujo de opciones de navegación. En este articulo plantearemos como mejorar y modificar con facilidad las opciones del menú. De ser posible usar el emacs como un editor gráfico del archivo de configuración del menú.

Mejora gráfica al archivo de configuración del menú

Ahora veamos y analicemos un extracto del archivo de configuración del one hand menu:

1|Bt Others|
2|Bluetooth|
3|switch|sh ~/bt-switch.sh

El carácter "|" sirve como separador de cada elemento o atributo. A continuación explicaremos la información que contiene una linea del archivo de configuración, una linea posee tres atributos, para explicar cada atributo nos fijaremos en la linea "3|switch|sh ~/bt-switch.sh".

Como ejemplo del menú. Podemos ver la imagen abajo.

En caso de desear ver el archivo de configuración que sirvió para configurar el one hand menu, se encuentra en el articulo anterior. También hay mas fotos de los diferentes frames del menú.

Plantear los requerimientos

Ahora nos gustaría poder modificar con rapidez el menú de opciones2 y de ser posible hacer las modificaciones ayudados por una vista jerárquica de las opciones del menú. Para esta meta nos puede ayudar el cogre(estamos usando cogre 1.2 con emacs 25.1).

Ejemplos de lo requerido

Un ejemplo podría ser eliminar el botón de "Bt Others" al inicio y ver directamente {"Bluetooth", "Others Conn Cell Net"} en el menú.

Otro ejemplo podría ser poner el botón "take Screenshot" sobre el botón de "Back"" en todas las opciones del menú.

Lo avanzado

Acá en kipuamutay hemos implementado una función en emacs lisp que nos permite convertir el archivo de configuración en un cogre-graph. Aun tiene algunos detalles que afinar como es la posición de cada uno de los nodos que componen el gráfico. Abajo mostraremos la salida de nuestra función3.

(cogre-base-graph "~/dev/elisp/shell_data" :file "shell_data.cgr" :name "~/dev/elisp/shell_data" :elements
                  (list
                   (cogre-node "Bt Others" :object-name "Bt Others" :position
                               [1 1])
                   (cogre-node "Bluetooth" :object-name "Bluetooth" :position
                               [13 5])
                   (cogre-link "Name" :object-name "Name" :start "Bt Others" :end "Bluetooth")
                   (cogre-node "switch" :object-name "switch" :position
                               [25 9])
                   (cogre-link "Name" :object-name "Name" :start "Bluetooth" :end "switch")
                   (cogre-node "connect to NAP1" :object-name "connect to NAP1" :position
                               [25 13])
                   (cogre-link "Name" :object-name "Name" :start "Bluetooth" :end "connect to NAP1")
                   (cogre-node "connect to headset1" :object-name "connect to headset1" :position
                               [25 17])
                   (cogre-link "Name" :object-name "Name" :start "Bluetooth" :end "connect to headset1")
                   (cogre-node "Others Conn Cell Net" :object-name "Others Conn Cell Net" :position
                               [13 21])
                   (cogre-link "Name" :object-name "Name" :start "Bt Others" :end "Others Conn Cell Net")
                   (cogre-node "Connections" :object-name "Connections" :position
                               [25 25])
                   (cogre-link "Name" :object-name "Name" :start "Others Conn Cell Net" :end "Connections")
                   (cogre-node "connect data plan" :object-name "connect data plan" :position
                               [37 29])
                   (cogre-link "Name" :object-name "Name" :start "Connections" :end "connect data plan")
                   (cogre-node "connect home network" :object-name "connect home network" :position
                               [37 33])
                   (cogre-link "Name" :object-name "Name" :start "Connections" :end "connect home network")
                   (cogre-node "Cell Connections" :object-name "Cell Connections" :position
                               [25 37])
                   (cogre-link "Name" :object-name "Name" :start "Others Conn Cell Net" :end "Cell Connections")
                   (cogre-node "disconn from cell net" :object-name "disconn from cell net" :position
                               [37 41])
                   (cogre-link "Name" :object-name "Name" :start "Cell Connections" :end "disconn from cell net")
                   (cogre-node "conn 2 cell net" :object-name "conn 2 cell net" :position
                               [37 45])
                   (cogre-link "Name" :object-name "Name" :start "Cell Connections" :end "conn 2 cell net")
                   (cogre-node "Network Setup" :object-name "Network Setup" :position
                               [25 49])
                   (cogre-link "Name" :object-name "Name" :start "Others Conn Cell Net" :end "Network Setup")
                   (cogre-node "myusbnet" :object-name "myusbnet" :position
                               [37 53])
                   (cogre-link "Name" :object-name "Name" :start "Network Setup" :end "myusbnet")
                   (cogre-node "take Screenshot" :object-name "take Screenshot" :position
                               [25 57])
                   (cogre-link "Name" :object-name "Name" :start "Others Conn Cell Net" :end "take Screenshot")))

Este es el gráfico conectado mostrado en un buffer de emacs. En este caso emacs funciona como un editor gráfico.

Lo que falta por Codificar

¿Que es lo que necesitamos para poder usar cogre como un editor gráfico de cada frame del one hand menu?(Recordaremos que cada nivel del gráfico conectado es decir los nodos que proviene de un mismo nodo padre van a crear un frame en el menú de navegación):

  1. Poder modificar los títulos de las opciones del menú, el titulo o etiqueta de los botones (esto ya lo permite el cogre).
  2. Cambiar el numero de botones por frame. Esto quiere decir agregar un nodo adicional (nodo-hijo), a un nodo padre.
  3. Cambiar el orden en que aparecen los botones, en los distintos frames que componen la navegación. Por ejemplo eliminar un nodo padre y hacer que sus nodos hijos se coloquen en el nivel donde se encontraba su nodo padre. Un ejemplo mas sencillo y diferente seria reordenar el orden en que aparecen los botones en un frame, es decir cambiar el orden de los hijos de un nodo-padre4.
  4. Las acciones que tenían originalmente el menú(cuando el gráfico fue generado del archivo de configuración), deben de permanecer asociadas a la acción del menú, aunque el titulo o el orden varié.

El plan de acción:

Conclusión

Explicados los requerimientos, solo queda empezar a codificar para poder cambiar las opciones de menú y el orden de manera gráfica.

Footnotes:

1. También conocido como ventana si no eres usuario de emacs.

2. Cambiar la distribución del menú con facilidad.

3. Tener en cuenta la versión del cogre en caso desearan cargar el archivo.

4. Véase ejemplos de lo requerido.

Last change: 12.06.2018 01:36

blog comments powered by Disqus