svghmi/widget_keypad.ysl2
changeset 3302 c89fc366bebd
parent 3241 fe945f1f48b7
child 3508 14d696d7d54e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/widget_keypad.ysl2	Thu Sep 02 21:36:29 2021 +0200
@@ -0,0 +1,141 @@
+// widget_keypad.ysl2
+
+widget_desc("Keypad") {
+    longdesc
+    ||
+    Keypad - to be written
+    ||
+
+    shortdesc > Keypad 
+
+    arg name="supported_types" accepts="string" > keypad can input those types 
+    
+}
+
+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»],
+        }
+    }
+    | }
+}
+
+widget_class("Keypad")
+    ||
+         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);
+             }
+         }
+    ||
+
+widget_defs("Keypad") {
+    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»],
+}