// widget_input.ysl2 widget_desc("Input") { longdesc || Input widget takes one variable path, and displays current value in optional "value" labeled sub-element. Click on optional "edit" labeled element opens keypad to edit value. Operation on current value is performed when click on sub-elements with label starting with '=', '+' or '-' sign. Value after sign is used as operand. || shortdesc > Input field with predefined operation buttons arg name="format" accepts="string" > optional printf-like format path name="edit" accepts="HMI_INT, HMI_REAL, HMI_STRING" > single variable to edit } widget_class("Input") || on_op_click(opstr) { this.change_hmi_value(0, opstr); } edit_callback(new_val) { this.apply_hmi_value(0, new_val); } is_inhibited = false; alert(msg){ this.is_inhibited = true; this.display = msg; setTimeout(() => this.stopalert(), 1000); this.request_animate(); } stopalert(){ this.is_inhibited = false; this.display = this.last_value; this.request_animate(); } overshot(new_val, max) { this.alert("max"); } undershot(new_val, min) { this.alert("min"); } || widget_defs("Input") { const "value_elt" optional_labels("value"); const "have_value","string-length($value_elt)>0"; value "$value_elt"; const "edit_elt" optional_labels("edit"); const "have_edit","string-length($edit_elt)>0"; value "$edit_elt"; if "$have_value" | frequency: 5, | dispatch: function(value) { if "$have_value or $have_edit" { choose{ when "count(arg) = 1" { | this.last_value = vsprintf("«arg[1]/@value»", [value]); } otherwise { | this.last_value = value; } } | if(!this.is_inhibited){ | this.display = this.last_value; if "$have_value" { | this.request_animate(); } | } } | }, if "$have_value" { | animate: function(){ | this.value_elt.textContent = String(this.display); | }, } | init: function() { if "$have_edit" { | this.edit_elt.onclick = () => edit_value("«path/@value»", "«path/@type»", this, this.last_value); if "$have_value" { | this.value_elt.style.pointerEvents = "none"; } } foreach "$hmi_element/*[regexp:test(@inkscape:label,'^[=+\-].+')]" { | id("«@id»").onclick = () => this.on_op_click("«func:escape_quotes(@inkscape:label)»"); } | }, }