Il catalogo dei tipi
Modulo di esempio: hellotypes.
I tipi di elemento si dividono in due famiglie.
Tipi necessariamente in sola lettura lato interfaccia
ElementLight (indicatore di stato), ElementImg (immagine), ElementVideo (flusso video), ElementPrg (barra di progressione o spinner) — nessuno di questi ha senso in scrittura diretta da un client.
Immagine: la convenzione webroot
Un modulo scrive il suo file in getWebroot() + "/" + getModuleName() + "/...", e dà all’elemento un URL relativo a questa posizione:
QDir dir;
dir.mkdir(getWebroot() + "/" + getModuleName());
atomicSaveJpeg(img, getWebroot() + "/" + getModuleName() + "/photo.jpeg");
OST::ImgData data;
data.mUrlJpeg = getModuleName() + "/photo.jpeg";
getEltImg("display", "photo")->setValue(data, true);Il controller chiama setWebroot() su un modulo solo dopo il ritorno del suo costruttore. Qualsiasi codice che scriva un file dipendente dal webroot deve quindi essere differito all’iterazione successiva del ciclo di eventi:
QTimer::singleShot(0, this, [this]() {
// getWebroot() est maintenant garanti défini.
});ElementVideo segue esattamente la stessa convenzione di URL (OST::VideoData::url), per un flusso già esistente altrove.
Barra di progressione e spinner: entrambi pilotati da un valore
ElementPrg ha due presentazioni (prgtype: "bar" o "spinner"), ma entrambe sono determinate da un valore 0-100 — uno spinner non è un indicatore di attività indeterminata, è un anello il cui riempimento segue setPrgValue(), esattamente come la barra:
getEltPrg("display", "progress")->setPrgValue(42.0, true);
getEltPrg("display", "spinner")->setPrgValue(42.0, true); // oui, le spinner aussi
getEltPrg("display", "spinner")->setDynLabel("En cours...", true);Tipi normalmente modificabili
ElementBool, ElementString, ElementInt, ElementFloat, ElementDate, ElementTime, ElementDateTime — tutti possono essere bloccati in sola lettura a livello della loro proprietà (permission:0), indipendentemente da qualsiasi impostazione per elemento (directedit, autoupdate): il controllo di permesso è il primo verificato, prima di tutto il resto.
Vincoli numerici e tooltip
Per int/float, quattro chiavi JSON opzionali supplementari:
"gain": { "type": "float", "directedit": true, "min": 0, "max": 100, "step": 1, "format": "%.0f", "hint": "Gain capteur" }min/max: limiti accettati.step: incremento del controllo lato client.format: formato di visualizzazione (stileprintf).hint: tooltip — disponibile su tutti i tipi di elemento, non solo numerici.
Mescolare i tipi in una sola proprietà
A differenza di INDI, dove un vettore contiene solo un unico tipo di elemento, una proprietà OST può mescolare liberamente tipi diversi:
"editabledata": {
"permission": 2,
"e": {
"bool1": { "type": "bool", "directedit": true },
"string1": { "type": "string", "directedit": true },
"int1": { "type": "int" },
"float1": { "type": "float" },
"date1": { "type": "date", "directedit": true }
}
}directedit:true vs directedit:false
directedit:true: il client modifica l’elemento individualmente e lo invia da solo (SV) — applicato immediatamente.directedit:false: l’elemento può essere modificato solo tramite un invio raggruppato di tutta la proprietà (SA) — tutti gli elementi modificabili della proprietà devono essere inclusi in questo invio, altrimenti nulla viene applicato. Lato client tipico, questo corrisponde a due presentazioni diverse: un controllo di modifica immediata per ogni elementodirectedit:true, e un form con pulsante “Salva” che raggruppa tutti gli elementidirectedit:false.
Questa distinzione è indipendente dal tipo: nell’esempio sopra, bool1/string1/date1 si modificano immediatamente, int1/float1 solo tramite il form raggruppato.