SVGHMI: Add inhibition to widget's apply_hmi_value() so that it does not change variable more frquently than given widget's frequency. This prevents flooding network with many update if browser is producing events at high rate, as for exemple when dragging ScrollBar's cursor.
// widget_keypad.ysl2
emit "declarations:keypad" {
|
| var keypads = {
foreach "$keypads_descs"{
const "keypad_id","@id";
foreach "arg"{
const "g", "$geometry[@Id = $keypad_id]";
| "«@value»":["«$keypad_id»", «$g/@x», «$g/@y»],
}
}
| }
}
template "widget[@type='Keypad']", mode="widget_class"
||
class KeypadWidget extends Widget{
on_key_click(symbols) {
var syms = symbols.split(" ");
this.shift |= this.caps;
this.editstr += syms[this.shift?syms.length-1:0];
this.shift = false;
this.update();
}
on_Esc_click() {
end_modal.call(this);
}
on_Enter_click() {
let coercedval = (typeof this.initial) == "number" ? Number(this.editstr) : this.editstr;
if(typeof coercedval == 'number' && isNaN(coercedval)){
// revert to initial so it explicitely shows input was ignored
this.editstr = String(this.initial);
this.update();
} else {
let callback_obj = this.result_callback_obj;
end_modal.call(this);
callback_obj.edit_callback(coercedval);
}
}
on_BackSpace_click() {
this.editstr = this.editstr.slice(0,this.editstr.length-1);
this.update();
}
on_Sign_click() {
if(this.editstr[0] == "-")
this.editstr = this.editstr.slice(1,this.editstr.length);
else
this.editstr = "-" + this.editstr;
this.update();
}
on_NumDot_click() {
if(this.editstr.indexOf(".") == "-1"){
this.editstr += ".";
this.update();
}
}
on_Space_click() {
this.editstr += " ";
this.update();
}
caps = false;
_caps = undefined;
on_CapsLock_click() {
this.caps = !this.caps;
this.update();
}
shift = false;
_shift = undefined;
on_Shift_click() {
this.shift = !this.shift;
this.caps = false;
this.update();
}
editstr = "";
_editstr = undefined;
result_callback_obj = undefined;
start_edit(info, valuetype, callback_obj, initial,size) {
show_modal.call(this,size);
this.editstr = String(initial);
this.result_callback_obj = callback_obj;
this.Info_elt.textContent = info;
this.shift = false;
this.caps = false;
this.initial = initial;
this.update();
}
update() {
if(this.editstr != this._editstr){
this._editstr = this.editstr;
this.Value_elt.textContent = this.editstr;
}
if(this.Shift_sub && this.shift != this._shift){
this._shift = this.shift;
(this.shift?this.activate_activable:this.inactivate_activable)(this.Shift_sub);
}
if(this.CapsLock_sub && this.caps != this._caps){
this._caps = this.caps;
(this.caps?this.activate_activable:this.inactivate_activable)(this.CapsLock_sub);
}
}
}
||
template "widget[@type='Keypad']", mode="widget_defs" {
param "hmi_element";
labels("Esc Enter BackSpace Keys Info Value");
optional_labels("Sign Space NumDot");
activable_labels("CapsLock Shift");
| init: function() {
foreach "$hmi_element/*[@inkscape:label = 'Keys']/*" {
| id("«@id»").setAttribute("onclick", "hmi_widgets['«$hmi_element/@id»'].on_key_click('«func:escape_quotes(@inkscape:label)»')");
}
foreach "str:split('Esc Enter BackSpace Sign Space NumDot CapsLock Shift')" {
| if(this.«.»_elt)
| this.«.»_elt.setAttribute("onclick", "hmi_widgets['«$hmi_element/@id»'].on_«.»_click()");
}
| },
|
const "g", "$geometry[@Id = $hmi_element/@id]";
| coordinates: [«$g/@x», «$g/@y»],
}