SVGHMI: One class per widget type, widget objects are instances of these classes, and members are passed through constructor. This allows to keep compatible with previous widget_defs template used in most widgets.
// widget_input.ysl2
template "widget[@type='Input']", mode="widget_defs" {
param "hmi_element";
const "value_elt" {
optional_labels("value");
}
const "have_value","string-length($value_elt)>0";
value "$value_elt";
if "$have_value"
| frequency: 5,
| last_val: undefined,
| dispatch: function(value) {
| this.last_val = value;
if "$have_value"
| this.value_elt.textContent = String(value);
| },
const "edit_elt_id","$hmi_element/*[@inkscape:label='edit'][1]/@id";
| init: function() {
if "$edit_elt_id" {
| id("«$edit_elt_id»").setAttribute("onclick", "hmi_widgets['«$hmi_element/@id»'].on_edit_click()");
}
foreach "$hmi_element/*[regexp:test(@inkscape:label,'^[=+\-].+')]" {
| id("«@id»").setAttribute("onclick", "hmi_widgets['«$hmi_element/@id»'].on_op_click('«func:escape_quotes(@inkscape:label)»')");
}
| },
| on_op_click: function(opstr) {
| let orig = this.indexes[0];
| let idx = this.offset ? orig - this.offset : orig;
| let new_val = change_hmi_value(idx, opstr);
// if "$have_value"{
// | this.value_elt.textContent = String(new_val);
// /* TODO gray out value until refreshed */
// }
| },
| on_edit_click: function(opstr) {
| edit_value("«path/@value»", "«path/@type»", this, this.last_val);
| },
| edit_callback: function(new_val) {
| let orig = this.indexes[0];
| let idx = this.offset ? orig - this.offset : orig;
| apply_hmi_value(idx, new_val);
// if "$have_value"{
// | this.value_elt.textContent = String(new_val);
// /* TODO gray out value until refreshed */
// }
| },
}