svghmi/widget_assign.ysl2
author Edouard Tisserant <edouard.tisserant@gmail.com>
Fri, 26 Apr 2024 09:24:26 +0200
changeset 3938 fc4af5685aa3
parent 3922 ffc8da83fdc2
permissions -rw-r--r--
merge
// widget_assign.ysl2

widget_desc("Assign") {
    longdesc
    ||

    Arguments are either:

    - name=value: setting variable with literal value.
    - name=other_name: copy variable content into another

    "active"+"inactive" labeled elements can be provided to show feedback when pressed

    Exemples:

    HMI:Assign:notify=1@notify=/PLCVAR
    HMI:Assign:ack=2:notify=1@ack=.local_var@notify=/PLCVAR

    ||

    shortdesc > Assign variables on click

}

widget_class("Assign") {
||
        frequency = 2;

        onmouseup(evt) {
            svg_root.removeEventListener("pointerup", this.bound_onmouseup, true);
            if(this.enable_state) {
                this.activity_state = false
                this.request_animate();
                this.assign();
            }
        }

        onmousedown(){
            if(this.enable_state) {
                svg_root.addEventListener("pointerup", this.bound_onmouseup, true);
                this.activity_state = true;
                this.request_animate();
            }
        }

||
}

widget_defs("Assign") {
    optional_activable();

    |     init: function() {
    |         this.bound_onmouseup = this.onmouseup.bind(this);
    |         this.element.addEventListener("pointerdown", this.onmousedown.bind(this));
    |     },

    |     assignments: {},
    |     dispatch: function(value, oldval, varnum) {
    const "widget", ".";
    foreach "path" {
        const "varid","generate-id()";
        const "varnum","position()-1";
        if "@assign" foreach "$widget/path[@assign]" if "$varid = generate-id()" {
    |         if(varnum == «$varnum») this.assignments["«@assign»"] = value;
        }
    }
    |     },
    |     assign: function() {
    const "paths","path";
    foreach "arg[contains(@value,'=')]"{
        const "name","substring-before(@value,'=')";
        const "value","substring-after(@value,'=')";
        const "index" foreach "$paths" if "@assign = $name" value "position()-1";
        const "isVarName", "regexp:test($value,'^[a-zA-Z_][a-zA-Z0-9_]*$')";
        choose {
            when "$isVarName"{
    |         const «$value» = this.assignments["«$value»"];
    |         if(«$value» != undefined)
    |             this.apply_hmi_value(«$index», «$value»);
            }
            otherwise {
    |         this.apply_hmi_value(«$index», «$value»);
            }
        }
    }
    |     },
}