Reagire a una scrittura utente
Modulo di esempio: helloedit.
Due impostazioni controllano cosa accade quando un client scrive un valore su un elemento:
directedit(per elemento, defaultfalse): sefalse, un invioSV(scrittura di un singolo elemento) su questo elemento è rifiutato — solo un invioSA(scrittura raggruppata di tutta la proprietà) può modificarlo.autoupdate(per elemento e per proprietà, defaulttruea livello proprietà,falsea livello elemento): se l’elemento o la sua proprietà haautoupdate:true, il framework applica da solo il valore scritto al datastore, prima ancora che il modulo ne venga informato.
"hello": {
"permission": 2,
"devcat": "", "group": "",
"autoupdate": false,
"e": {
"autoname": {
"type": "string", "directedit": true, "autoupdate": true
},
"manualname": {
"type": "string", "directedit": true, "autoupdate": false
}
}
}Con questa dichiarazione, scrivere su autoname si riflette immediatamente, senza alcun codice: il framework applica il valore da solo.
Se la proprietà stessa non fissa autoupdate (o lo fissa a true), resta al suo default true — e un elemento con autoupdate:false verrà comunque auto-applicato, perché elemento.autoupdate() || proprietà.autoupdate() vale true non appena uno dei due lo è. Perché un elemento sfugga davvero all’applicazione automatica, è necessario che anche la sua proprietà abbia autoupdate:false esplicitamente, come sopra.
Estrarre un valore non auto-applicato
Per manualname (elemento e proprietà entrambi autoupdate:false), nulla viene applicato automaticamente: onExternalEvent() deve estrarre da solo il valore grezzo scritto dal client, poi applicarlo (eventualmente dopo averlo trasformato):
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);
}
}Modificare un valore dal codice del modulo (getEltXxx(...)->setValue(..., true)) non passa mai attraverso i controlli di permesso/directedit: questi si applicano solo alle scritture provenienti dal client. È ciò che permette qui di trasformare il valore (messa in maiuscolo) prima di applicarlo realmente.
Catalogo degli accessori
Due famiglie, secondo che si voglia l’elemento stesso (per chiamare setValue(), disable()…) o solo il suo valore:
| Tipo | getElt...() | valore diretto |
|---|---|---|
| string | getEltString() | getString() |
| int | getEltInt() | getInt() |
| float | getEltFloat() | getFloat() |
| bool | getEltBool() | getBool() |
| date | getEltDate() | getDate() |
| time | getEltTime() | getTime() |
| light | getEltLight() | — |
| image | getEltImg() | — |
| video | getEltVideo() | — |
| progressione | getEltPrg() | — |
Tutti prendono (proprietà, elemento). Gli accessori di valore diretto (getString/getInt/getFloat/getBool/getDate/getTime) hanno un overload (proprietà, elemento, riga) per leggere una griglia a una riga data — vedi Le griglie.