GUIOOD Toolbox (Graphical User Interface with Object-Oriented Design) es un conjunto de clases implementadas en MATLAB cuyo objetivo es desarrollar interfaces gráficas de usuario utilizando una sintaxis similar a la de Java, es decir, con el paradigma de la programación orientada a objetos.
Básicamente, GUIOOD se está desarrollando para funcionar como un wrapper de las GUIs ordinarias en MATLAB. Se pretende que la programación de GUIs sea más rápida y sencilla. Desde luego que habrá de considerarse el hecho de que "debajo" hay una interfaz gráfica ordinaria, por lo cual la cantidad de controles gráficos disponibles serán los mismos, con algunos añadidos utilizando la librería swing de Java.
¿Qué es lo nuevo?
Desde luego, la forma de programar. Todos los elementos gráficos serán objetos de una determinada clase y tendrán métodos para modificar sus atributos. Por ejemplo para crear una ventana el código correspondiente sería algo como esto:
app = Frame('Ventana 1', [300 200]);
app.SetColor('r');
Ha de mencionarse que el nombre de algunos controles gráficos han sido sustituidos por su equivalente en Java, además que muchos métodos guardan similitud con dicho lenguaje y en otros casos con la librería wxPython. La siguiente es una tabla que muestra la equivalencia de notación entre las GUIs MATLAB ordinarias y el GUIOOD Toolbox:
Como puede verse en la tabla, GUIOOD añade algunos controles gráficos no disponibles en MATLAB. El Canvas es un axes "modificado" que se espera utilizar para dibujos 2D como circulos, rectangulos, elipses y otras figuras de geometría simple, en principio. El PasswordField es similar a una entrada de texto editable, con la diferencia que permite "esconder" los caracteres que en el se introducen, es decir, un campo de contraseñas, que se ha extendido del componente JPasswordField de Java. El Spinner de manera similar se ha extendido del componente JSpinner de Java. Y el AboutDialog es un cuadro de diálogo que contiene información acerca de la GUI, la idea y notación se ha tomado del componente del mismo nombre de la librería wxPython. Es muy probable que se añadan otros controles que puedan resultar útiles, desde luego "tomándolos prestados" de Java.
Otra parte interesante de GUIOOD Toolbox es que dispone de manejadores de posiciones o de distribución de componentes (layouts), los cuales ahorran tiempo significativo, dado que no hay necesidad de indicar las posiciones de los objetos gráficos de forma explícita. Los algoritmos de posicionamiento están en fase de desarrollo, siendo funcionales, pero con algunos detalles en cuanto al orden en que habrán de agregarse los componentes. Se dispone de 3 layouts: grid, vertical y horizontal. El primero distribuye los objetos utilizando filas y columnas como referencia, y el vertical y horizontal los distribuyen como se esperaría, dado el nombre.
Utilidades añadidas
GUIOOD permite exportar el contenido de una Table MATLAB a una tabla en HTML, y también a una hoja de cálculo Microsoft Excel.
El contenido de un Axes puede exportarse como imagen PNG, como un PDF, o incrustarla en un archivo HTML.
Estado del proyecto
El proyecto GUIOOD Toolbox comenzó a desarrollarse a principios de Noviembre de 2014, encontrándose ahora en una etapa muy temprana. Existen muchos detalles por agregar, como dar un mayor soporte al manejo de los eventos, un manejo de errores/excepciones un poco más personalizado, refinar los algoritmos de posicionamiento, escribir la documentación, y sobre todo mucho "testeo" del código.
El plan inicial contempla un desarrollo durante seis meses. Por lo cual, se esperaría que para Mayo de 2015 pueda estar disponible una versión preliminar. ¿Por qué seis meses?, bueno, el calendario incluye muchos días festivos en este lapso.
Un ejemplo preeliminar (funcional)
A continuación se expone un fragmento de código totalmente funcional, y que deja ver más o menos la idea que se sigue y lo que se espera obtener:
function MiniCalc
% MiniCalc / Demo for GUIOOD Toolbox
%
% Author: Jorge De Los Santos
% Version: 0.1.0
% E-mail: delossantosmfq@gmail.com
% License: MIT License
app = Frame('Mini Calculadora',[220 100]);
app.SetLayout('grid',5,3,1); % Set main layout: grid. 5 rows and 3 columns
p1 = Panel();
p2 = Panel();
p3 = Panel();
app.AddMany(p1,p2,p3); % Add many panels to Frame (main app)
% Labels and TextFields
lb1 = Label('# 1');
lb2 = Label('# 2');
num1 = TextField();
num2 = TextField();
p1.AddMany(num1,lb1); % Add controls to Panel p1
p2.AddMany(num2,lb2); % Add controls to Panel p2
% Buttons
bt1 = Button('+');
bt2 = Button('-');
bt3 = Button('*');
bt4 = Button('/');
p3.AddMany(bt1,bt2,bt3,bt4); % Add buttons to panel p3
p3.SetLayout('horizontal',2); % Set layout for p3, horizontal and two controls
bt1.SetCallback(@calcular_fcn); % Set callback for buttons
bt2.SetCallback(@calcular_fcn);
bt3.SetCallback(@calcular_fcn);
bt4.SetCallback(@calcular_fcn);
function calcular_fcn(~,~,obj)
a = num1.GetText(); % Get value of "num1" Label
b = num2.GetText(); % Get value of "num2" Label
oper = obj.GetText(); % Get the operator of current Button clicked
MessageBox(['Resultado = ',num2str(eval([a,oper,b]))],'GUIOOD');
end
end
Si la GUI le parece "rara", no os preocupéis, cuestiones de temas del SO en que se ejecutó esta prueba.
Cualquier comentario o sugerencia es siempre bienvenida. Y si desea colaborar con el proyecto no dude en contactar a los correos del blog (matlabtyp@gmail.com).