svghmi/widget_meter.ysl2
author Edouard Tisserant <edouard.tisserant@gmail.com>
Tue, 29 Dec 2020 16:54:32 +0100
branchsvghmi
changeset 3104 14d15712fcca
parent 3045 f6d428330e04
child 3232 7bdb766c2a4d
permissions -rw-r--r--
SVGHMI: Meter widget: use animate() + cosmetic changes
// widget_meter.ysl2

template "widget[@type='Meter']", mode="widget_class"{
    ||
    class MeterWidget extends Widget{
        frequency = 10;
        origin = undefined;
        range = undefined;

        dispatch(value) {
            this.display_val = value;
            this.request_animate();
        }

        animate(){
            if(this.value_elt)
                this.value_elt.textContent = String(this.display_val);
            let [min,max,totallength] = this.range;
            let length = Math.max(0,Math.min(totallength,(Number(this.display_val)-min)*totallength/(max-min)));
            let tip = this.range_elt.getPointAtLength(length);
            this.needle_elt.setAttribute('d', "M "+this.origin.x+","+this.origin.y+" "+tip.x+","+tip.y);
        }

        init() {
            let [min,max] = [[this.min_elt,0],[this.max_elt,100]].map(([elt,def],i)=>elt?
                Number(elt.textContent) :
                this.args.length >= i+1 ? this.args[i] : def);

            this.range = [min, max, this.range_elt.getTotalLength()]
            this.origin = this.needle_elt.getPointAtLength(0);
        }

    }
    ||
}

template "widget[@type='Meter']", mode="widget_defs" {
    param "hmi_element";
    labels("needle range");
    optional_labels("value min max");
}