Reaccionar a una escritura del usuario
Módulo de ejemplo: helloedit.
Dos ajustes controlan lo que ocurre cuando un cliente escribe un valor en un elemento:
directedit(por elemento, por defectofalse): si esfalse, un envíoSV(escritura de un solo elemento) sobre ese elemento es rechazado — solo un envíoSA(escritura agrupada de toda la propiedad) puede modificarlo.autoupdate(por elemento y por propiedad, por defectotruea nivel de propiedad,falsea nivel de elemento): si el elemento o su propiedad tieneautoupdate:true, el framework aplica él mismo el valor escrito al datastore, antes incluso de que el módulo sea informado.
"hello": {
"permission": 2,
"devcat": "", "group": "",
"autoupdate": false,
"e": {
"autoname": {
"type": "string", "directedit": true, "autoupdate": true
},
"manualname": {
"type": "string", "directedit": true, "autoupdate": false
}
}
}Con esta declaración, escribir en autoname se refleja de inmediato, sin ningún código: el framework aplica el valor por sí mismo.
Si la propiedad misma no fija autoupdate (o lo fija a true), permanece en su valor por defecto true — y un elemento con autoupdate:false se aplicará automáticamente igual, porque elemento.autoupdate() || propiedad.autoupdate() vale true en cuanto uno de los dos lo es. Para que un elemento escape realmente a la aplicación automática, es necesario que su propiedad también tenga autoupdate:false explícitamente, como arriba.
Extraer un valor no auto-aplicado
Para manualname (elemento y propiedad ambos autoupdate:false), nada se aplica automáticamente: onExternalEvent() debe extraer él mismo el valor bruto escrito por el cliente, y luego aplicarlo (eventualmente después de transformarlo):
void HelloEdit::onExternalEvent(OST::ExtEvent event)
{
// autoname : rien à faire, déjà appliqué par le framework.
if (event.ev == OST::ExtEvType::SV && event.prpkey == "hello" && event.eltkey == "manualname")
{
QJsonObject o = event.data["m"].toObject()[getModuleName()].toObject();
QJsonObject e = o["p"].toObject()["hello"].toObject()["e"].toObject();
QString written = e["manualname"].toVariant().toString();
getEltString("hello", "manualname")->setValue(written.toUpper(), true);
}
}Modificar un valor desde el código del módulo (getEltXxx(...)->setValue(..., true)) nunca pasa por los controles de permiso/directedit: estos solo se aplican a las escrituras que vienen del cliente. Esto es lo que permite aquí transformar el valor (puesto en mayúsculas) antes de aplicarlo realmente.
Catálogo de accesores
Dos familias, según si se quiere el elemento mismo (para llamar a setValue(), disable()…) o solo su valor:
| Tipo | getElt...() | valor directo |
|---|---|---|
| string | getEltString() | getString() |
| int | getEltInt() | getInt() |
| float | getEltFloat() | getFloat() |
| bool | getEltBool() | getBool() |
| date | getEltDate() | getDate() |
| time | getEltTime() | getTime() |
| light | getEltLight() | — |
| image | getEltImg() | — |
| vídeo | getEltVideo() | — |
| progreso | getEltPrg() | — |
Todos toman (propiedad, elemento). Los accesores de valor directo (getString/getInt/getFloat/getBool/getDate/getTime) tienen una sobrecarga (propiedad, elemento, línea) para leer una grilla en una línea dada — ver Las grillas.