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, default false): se false, un invio SV (scrittura di un singolo elemento) su questo elemento è rifiutato — solo un invio SA (scrittura raggruppata di tutta la proprietà) può modificarlo.
  • autoupdate (per elemento e per proprietà, default true a livello proprietà, false a livello elemento): se l’elemento o la sua proprietà ha autoupdate: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.

autoupdate si imposta a due livelli, è un OR logico

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:

TipogetElt...()valore diretto
stringgetEltString()getString()
intgetEltInt()getInt()
floatgetEltFloat()getFloat()
boolgetEltBool()getBool()
dategetEltDate()getDate()
timegetEltTime()getTime()
lightgetEltLight()—
imagegetEltImg()—
videogetEltVideo()—
progressionegetEltPrg()—

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.