Create new multistate widget which extand class widget svghmi
authorusveticic
Wed, 05 Aug 2020 15:16:43 +0200
branchsvghmi
changeset 3014 1a3fd83d9136
parent 3013 0ea6b4f435de
child 3015 bd0b120cf277
Create new multistate widget which extand class widget
svghmi/widget_multistate.ysl2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svghmi/widget_multistate.ysl2	Wed Aug 05 15:16:43 2020 +0200
@@ -0,0 +1,60 @@
+// widget_multistate.ysl2
+
+template "widget[@type='MultiState']", mode="widget_class"
+    ||
+    class MultiStateWidget extends Widget{
+        frequency = 5;
+        state = 0;
+        dispatch(value) {
+            this.state = value;
+            for(let choice of this.choices){
+                if(this.state != choice.value){
+                    choice.elt.setAttribute("style", "display:none");
+                } else {
+                    choice.elt.setAttribute("style", choice.style);
+                }
+            }
+        }
+
+        on_click(evt) {
+            //get current selected value
+            let next_ind;
+            for(next_ind=0; next_ind<this.choices.length; next_ind++){
+                if(this.state == this.choices[next_ind].value){
+                   next_ind = next_ind + 1;
+                   break;
+                }
+            }
+
+            //get next selected value
+            if(this.choices.length > next_ind){
+                this.state = this.choices[next_ind].value;
+            }
+            else{
+                this.state = this.choices[0].value;
+            }
+
+            //post value to plc
+            change_hmi_value(this.indexes[0], "="+this.state);
+        }
+
+        init() {
+            this.element.setAttribute("onclick", "hmi_widgets['"+this.element_id+"'].on_click(evt)");
+        }
+    }
+    ||
+
+template "widget[@type='MultiState']", mode="widget_defs" {
+    param "hmi_element";
+    |     choices: [
+    const "regex",!"'^(\"[^\"].*\"|\-?[0-9]+|false|true)(#.*)?$'"!;
+    foreach "$result_svg_ns//*[@id = $hmi_element/@id]//*[regexp:test(@inkscape:label,$regex)]" {
+        const "literal", "regexp:match(@inkscape:label,$regex)[2]";
+    |         {
+    |             elt:id("«@id»"),
+    |             style:"«@style»",
+    |             value:«$literal»
+    |         }`if "position()!=last()" > ,`
+    }
+    |     ],
+}
\ No newline at end of file