Réagir à une écriture utilisateur
Module d’exemple : helloedit.
Deux réglages contrôlent ce qui se passe quand un client écrit une valeur sur un élément :
directedit(par élément, défautfalse) : sifalse, un envoiSV(écriture d’un seul élément) sur cet élément est refusé — seul un envoiSA(écriture groupée de toute la propriété) peut le modifier.autoupdate(par élément et par propriété, défauttrueau niveau propriété,falseau niveau élément) : si l’élément ou sa propriété aautoupdate:true, le framework applique lui-même la valeur écrite au datastore, avant même que le module n’en soit informé.
"hello": {
"permission": 2,
"devcat": "", "group": "",
"autoupdate": false,
"e": {
"autoname": {
"type": "string", "directedit": true, "autoupdate": true
},
"manualname": {
"type": "string", "directedit": true, "autoupdate": false
}
}
}Avec cette déclaration, écrire sur autoname se reflète immédiatement, sans aucun code : le framework applique la valeur de lui-même.
Si la propriété elle-même ne fixe pas autoupdate (ou le fixe à true), elle reste à son défaut true — et un élément avec autoupdate:false sera quand même auto-appliqué, parce que élément.autoupdate() || propriété.autoupdate() vaut true dès que l’un des deux l’est. Pour qu’un élément échappe réellement à l’application automatique, il faut que sa propriété aussi ait autoupdate:false explicitement, comme ci-dessus.
Extraire une valeur non auto-appliquée
Pour manualname (élément et propriété tous deux autoupdate:false), rien n’est appliqué automatiquement : onExternalEvent() doit extraire lui-même la valeur brute écrite par le client, puis l’appliquer (éventuellement après l’avoir transformée) :
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);
}
}Modifier une valeur depuis le code du module (getEltXxx(...)->setValue(..., true)) ne repasse jamais par les contrôles de permission/directedit : ceux-ci ne s’appliquent qu’aux écritures venant du client. C’est ce qui permet ici de transformer la valeur (mise en majuscules) avant de l’appliquer réellement.
Catalogue des accesseurs
Deux familles, selon qu’on veut l’élément lui-même (pour appeler setValue(), disable()…) ou juste sa valeur :
| Type | getElt...() | valeur directe |
|---|---|---|
| string | getEltString() | getString() |
| int | getEltInt() | getInt() |
| float | getEltFloat() | getFloat() |
| bool | getEltBool() | getBool() |
| date | getEltDate() | getDate() |
| time | getEltTime() | getTime() |
| light | getEltLight() | — |
| image | getEltImg() | — |
| vidéo | getEltVideo() | — |
| progression | getEltPrg() | — |
Tous prennent (propriété, élément). Les accesseurs de valeur directe (getString/getInt/getFloat/getBool/getDate/getTime) ont une surcharge (propriété, élément, ligne) pour lire une grille à une ligne donnée — voir Les grilles.