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éfaut false) : si false, un envoi SV (écriture d’un seul élément) sur cet élément est refusé — seul un envoi SA (écriture groupée de toute la propriété) peut le modifier.
  • autoupdate (par élément et par propriété, défaut true au niveau propriété, false au niveau élément) : si l’élément ou sa propriété a autoupdate: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.

autoupdate se règle à deux niveaux, c’est un OU logique

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 :

TypegetElt...()valeur directe
stringgetEltString()getString()
intgetEltInt()getInt()
floatgetEltFloat()getFloat()
boolgetEltBool()getBool()
dategetEltDate()getDate()
timegetEltTime()getTime()
lightgetEltLight()—
imagegetEltImg()—
vidéogetEltVideo()—
progressiongetEltPrg()—

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.