--- /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»],
+}