close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 13 years ago

Last modified 13 years ago

#1443 accepted enhancement

Interfaz gráfica para editar configuraciones

Reported by: Pedro Gea Owned by: Jorge
Priority: high Milestone: Mantainance
Component: Interface Version: 3.1
Severity: critical Keywords:
Cc: Víctor de Buen Remiro

Description

Se solicita la implementación de una función que interacciones con Tcl/Tk (del modo similar a como hace TclTabulateSet por ejemplo) y que permita la edición visual de un conjunto de opciones o variables de configuración.

Un ejemplo claro de esta necesidad es el nameblock TolConfigManager, cuya estructura en forma de nameblock conteniendo variables u otros nameblocks podría implementarse en forma de árbol.

Se está pensando en algo parecido al editor de configuraciones de las estimaciones o previsiones de la GUI de MMS, que podría completarse con la mencionada estructura arbórea y que podría incorporar también de algún modo las descripciones de las variables de configuración.

Change History (7)

comment:1 Changed 13 years ago by Jorge

Cc: Víctor de Buen Remiro added
Status: newaccepted

Los campos de un NameBlock pueden editarse según el tipo de dato. Además se sugiere un campo _.autodoc.xxx que indique el método de validación del campo lo cual puede ayudar a construir un interfaz más específica.

comment:2 Changed 13 years ago by Víctor de Buen Remiro

El _.autodoc. es mejor dejarlo para lo que es: describir el dato miembro.
Pero sí podemos usar otro prefijo como _.autochec. que contendría una instancia de una clase específicamente diseñada para hacer el chequeo.

La idea sería disponer en la StdLib de una batería de clases para el chequeo de opciones en el entorno gráfico que definieran todas las características tanto gráficas como referentes al tipo de datos o restricciones que debe cumplir el valor de la opción. Todas estas clases partirían de una clase abstracta raíz que podría tener este aspecto:

//////////////////////////////////////////////////////////////////////////////
Class @OptCheck
//////////////////////////////////////////////////////////////////////////////
{
  Text _.desc;
  Text _.autodoc.graph.control = 
  "Returns the graphic control used in the interface: "
   "CheckBox, TextLine, TextBox, DropDown, Calendar, ...";
  Text graph.control(Real void);
  
  Text _.autodoc.help = 
  "Returns brief instructions about how to fill the field.";
  Text help(Real void);

  Text _.autodoc.isValid = 
  "Returns true if submitted field is valid for this field.";
  Real isValid(Text field)
};

Para chequear un valor booleano podríamos tener esta herencia:

//////////////////////////////////////////////////////////////////////////////
Class @OptCheck.Boolean : @OptCheck
//////////////////////////////////////////////////////////////////////////////
{
  Text graph.control(Real void) { "CheckBox" };
  Text help(Real void) 
  { 
    _.desc+"\n"+
    "Turn on/off the field."
  };
  Real isValid(Text field) 
  {
    Real x = TextToReal(field);
    If(IsUnknown(x),False,Or(x==0,x==1))
  }
};

Y para chequear una etiqueta de texto entre un conjunto de opciones esta otra:

//////////////////////////////////////////////////////////////////////////////
Class @OptCheck.Boolean : @OptCheck
//////////////////////////////////////////////////////////////////////////////
{
  Text graph.control(Real void) { "CheckBox" };
  Text help(Real void) 
  { 
    _.desc+"\n"+
    "Turn on/off the field."
  };
  Real isValid(Text field) 
  {
    Real x = TextToReal(field);
    If(IsUnknown(x),False,Or(x==0,x==1))
  }
};

Este sería un ejemplo sencillo de configuración

NameBlock config = 
[[
  Real useRemoteUrl = True;
  @OptCheck.Boolean _.autoCheck.useRemoteUrl = [[
  Text _.desc = "If true system will use remote URL´s" ]];
  Text downloadMethod = "tcl.uri";
  @OptCheck.Select.Simple _.autoCheck.downloadMethod = [[
  Text _.desc = "Method used to download remote URL´s",
  Set _.options = [[
  "tcl:uri","tcl:curl","sys:wget" ]] ]]
]];

Desde el interfaz habría que llamar a los diferentes métodos

Real ok.01 =     config::_.autoCheck.useRemoteUrl::isValid("0");
Real ok.02 =     config::_.autoCheck.useRemoteUrl::isValid("1");
Real ok.03 = Not(config::_.autoCheck.useRemoteUrl::isValid("0.5"));
Real ok.04 = Not(config::_.autoCheck.useRemoteUrl::isValid(""));
Real ok.05 = Not(config::_.autoCheck.useRemoteUrl::isValid("hello"));

Real ok.06 =     config::_.autoCheck.downloadMethod::isValid("tcl:uri");
Real ok.07 =     config::_.autoCheck.downloadMethod::isValid("tcl:curl");
Real ok.08 =     config::_.autoCheck.downloadMethod::isValid("sys:wget");
Real ok.09 = Not(config::_.autoCheck.downloadMethod::isValid("sys.wget"));
Real ok.10 = Not(config::_.autoCheck.downloadMethod::isValid(""));

comment:3 Changed 13 years ago by Jorge

(In [4320]) refs #1443, se implementa un widget que permite editar los miembros de un contenedor (Set o NameBlock).

comment:4 Changed 13 years ago by Jorge

Se pueden ver dos ejemplos de uso en: tolp/OfficialTolArchiveNetwork/GuiTools/test/ContainerEditor

comment:5 Changed 13 years ago by Jorge

(In [4322]) refs #1443, API TOL para editar Set y NameBlock

comment:6 Changed 13 years ago by Jorge

(In [4330]) refs #1443, metodo para forzar que se acepten/rechacen los cambios que se estan editando

comment:7 Changed 13 years ago by Jorge

(In [4331]) refs #1443, invoke AcceptEdit & CancelEdit

Note: See TracTickets for help on using tickets.