Edouard@3627: // widget_assign.ysl2
Edouard@3627: 
Edouard@3627: widget_desc("Assign") {
Edouard@3627:     longdesc
Edouard@3627:     ||
Edouard@3627: 
Edouard@3627:     Arguments are either:
Edouard@3627: 
Edouard@3627:     - name=value: setting variable with literal value.
Edouard@3627:     - name=other_name: copy variable content into another
Edouard@3627: 
Edouard@3627:     "active"+"inactive" labeled elements can be provided to show feedback when pressed
Edouard@3627: 
Edouard@3627:     Exemples:
Edouard@3627: 
Edouard@3627:     HMI:Assign:notify=1@notify=/PLCVAR
Edouard@3627:     HMI:Assign:ack=2:notify=1@ack=.local_var@notify=/PLCVAR
Edouard@3627: 
Edouard@3627:     ||
Edouard@3627: 
Edouard@3627:     shortdesc > Assign variables on click
Edouard@3627: 
Edouard@3627: }
Edouard@3627: 
Edouard@3627: widget_class("Assign") {
Edouard@3627: ||
Edouard@3627:         frequency = 2;
Edouard@3627: 
Edouard@3627:         onmouseup(evt) {
Edouard@3627:             svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
Edouard@3627:             if(this.enable_state) {
Edouard@3627:                 this.activity_state = false
Edouard@3627:                 this.request_animate();
Edouard@3627:                 this.assign();
Edouard@3627:             }
Edouard@3627:         }
Edouard@3627: 
Edouard@3627:         onmousedown(){
Edouard@3627:             if(this.enable_state) {
Edouard@3627:                 svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
Edouard@3627:                 this.activity_state = true;
Edouard@3627:                 this.request_animate();
Edouard@3627:             }
Edouard@3627:         }
Edouard@3627: 
Edouard@3627: ||
Edouard@3627: }
Edouard@3627: 
Edouard@3627: widget_defs("Assign") {
Edouard@3627:     optional_activable();
Edouard@3627: 
Edouard@3627:     |     init: function() {
Edouard@3627:     |         this.bound_onmouseup = this.onmouseup.bind(this);
Edouard@3627:     |         this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
Edouard@3627:     |     },
Edouard@3627: 
Edouard@3627:     |     assignments: {},
Edouard@3627:     |     dispatch: function(value, oldval, varnum) {
Edouard@3627:     const "widget", ".";
Edouard@3627:     foreach "path" {
Edouard@3627:         const "varid","generate-id()";
Edouard@3627:         const "varnum","position()-1";
Edouard@3627:         if "@assign" foreach "$widget/path[@assign]" if "$varid = generate-id()" {
Edouard@3627:     |         if(varnum == «$varnum») this.assignments["«@assign»"] = value;
Edouard@3627:         }
Edouard@3627:     }
Edouard@3627:     |     },
Edouard@3627:     |     assign: function() {
Edouard@3627:     const "paths","path";
Edouard@3627:     foreach "arg[contains(@value,'=')]"{
Edouard@3627:         const "name","substring-before(@value,'=')";
Edouard@3627:         const "value","substring-after(@value,'=')";
Edouard@3627:         const "index" foreach "$paths" if "@assign = $name" value "position()-1";
Edouard@3627:         const "isVarName", "regexp:test($value,'^[a-zA-Z_][a-zA-Z0-9_]+$')";
Edouard@3627:         choose {
Edouard@3627:             when "$isVarName"{
Edouard@3627:     |         const «$value» = this.assignments["«$value»"];
Edouard@3627:     |         if(«$value» != undefined)
Edouard@3627:     |             this.apply_hmi_value(«$index», «$value»);
Edouard@3627:             }
Edouard@3627:             otherwise {
Edouard@3627:     |         this.apply_hmi_value(«$index», «$value»);
Edouard@3627:             }
Edouard@3627:         }
Edouard@3627:     }
Edouard@3627:     |     },
Edouard@3627: }
Edouard@3627: