Python Safe Globals now have more reliable triggering of OnChange call. Added "Onchange" object to accessible runtime variables that let user python code see count of changes and first and last values.
// widget_input.ysl2
template "widget[@type='Input']", mode="widget_defs" {
param "hmi_element";
optional_labels("key_pos");
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 new_val = this.change_hmi_value(0, opstr);
// if "$have_value"{
// | this.value_elt.textContent = String(new_val);
// /* TODO gray out value until refreshed */
// }
| },
| on_edit_click: function(opstr) {
| var size = (typeof this.key_pos_elt !== 'undefined') ? this.key_pos_elt.getBBox() : undefined
| edit_value("«path/@value»", "«path/@type»", this, this.last_val, size);
| },
| edit_callback: function(new_val) {
| this.apply_hmi_value(0, new_val);
// if "$have_value"{
// | this.value_elt.textContent = String(new_val);
// /* TODO gray out value until refreshed */
// }
| },
}