Auf einen Schreibzugriff des Benutzers reagieren

Beispielmodul: helloedit.

Zwei Einstellungen steuern, was passiert, wenn ein Client einen Wert auf ein Element schreibt:

  • directedit (pro Element, Standard false): wenn false, wird ein SV-Versand (Schreiben eines einzelnen Elements) auf dieses Element abgelehnt — nur ein SA-Versand (gruppiertes Schreiben der gesamten Property) kann es ändern.
  • autoupdate (pro Element und pro Property, Standard true auf Property-Ebene, false auf Element-Ebene): wenn das Element oder seine Property autoupdate:true hat, wendet das Framework den geschriebenen Wert selbst auf den Datastore an, noch bevor das Modul davon informiert wird.
"hello": {
  "permission": 2,
  "devcat": "", "group": "",
  "autoupdate": false,
  "e": {
    "autoname": {
      "type": "string", "directedit": true, "autoupdate": true
    },
    "manualname": {
      "type": "string", "directedit": true, "autoupdate": false
    }
  }
}

Mit dieser Deklaration wird ein Schreibzugriff auf autoname sofort reflektiert, ohne jeglichen Code: das Framework wendet den Wert von sich aus an.

autoupdate wird auf zwei Ebenen gesetzt — es ist ein logisches ODER

Wenn die Property selbst autoupdate nicht setzt (oder auf true setzt), bleibt sie bei ihrem Standard true — und ein Element mit autoupdate:false wird trotzdem automatisch angewendet, weil élément.autoupdate() || propriété.autoupdate() bereits true ergibt, sobald eines der beiden es ist. Damit ein Element der automatischen Anwendung wirklich entgeht, muss auch seine Property explizit autoupdate:false haben, wie oben.

Einen nicht automatisch angewendeten Wert extrahieren

Für manualname (Element und Property beide autoupdate:false) wird nichts automatisch angewendet: onExternalEvent() muss den vom Client geschriebenen Rohwert selbst extrahieren und ihn anschließend anwenden (gegebenenfalls nach einer Transformation):

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);
    }
}

Einen Wert aus dem Code des Moduls heraus zu ändern (getEltXxx(...)->setValue(..., true)) durchläuft nie die Permission-/directedit-Kontrollen: diese gelten nur für Schreibzugriffe vom Client. Das erlaubt es hier, den Wert zu transformieren (Umwandlung in Großbuchstaben), bevor er tatsächlich angewendet wird.

Katalog der Zugriffsmethoden

Zwei Familien, je nachdem, ob man das Element selbst will (um setValue(), disable()… aufzurufen) oder nur seinen Wert:

TypgetElt...()direkter Wert
stringgetEltString()getString()
intgetEltInt()getInt()
floatgetEltFloat()getFloat()
boolgetEltBool()getBool()
dategetEltDate()getDate()
timegetEltTime()getTime()
lightgetEltLight()—
imagegetEltImg()—
VideogetEltVideo()—
FortschrittgetEltPrg()—

Alle nehmen (propriété, élément). Die direkten Wert-Zugriffsmethoden (getString/getInt/getFloat/getBool/getDate/getTime) haben eine Überladung (propriété, élément, ligne), um eine bestimmte Zeile eines Grids zu lesen — siehe Die Grids.