svghmi/widget_display.ysl2
author Edouard Tisserant
Thu, 09 Dec 2021 10:21:45 +0100
branchRuntimeLists
changeset 3395 93ad018fb602
parent 3360 746e3e3f6537
child 3524 27d298c6f961
permissions -rw-r--r--
RUNTIME: Variable forcing now uses limited list and buffer instead of systematical instance tree traversal and in-tree "fvalue" to keep track of forced value for pointed variables (external, located). Pointer swapping is performed when forcing externals and located, with backup being restored when forcing is reset. Retain still uses tree traversal.
// widget_display.ysl2

widget_desc("Display") {
    longdesc
    ||
    If Display widget is a svg:text element, then text content is replaced by
    value of given variables, space separated.

    Otherwise, if Display widget is a group containing a svg:text element
    labelled "format", then text content is replaced by printf-like formated
    string. In other words, if "format" labeled text is "%d %s %f", then 3
    variables paths are expected : HMI_IN, HMI_STRING and HMI_REAL.

    In case Display widget is a svg::text element, it is also possible to give
    format string as first argument.
    ||

    shortdesc > Printf-like formated text display 

    arg name="format" count="optional" accepts="string" > printf-like format string when not given as svg:text

    path name="fields" count="many" accepts="HMI_INT,HMI_REAL,HMI_STRING,HMI_BOOL" > variables to be displayed
    
}


widget_class("Display")
    ||
        frequency = 5;
        dispatch(value, oldval, index) {
            this.fields[index] = value;    
            this.request_animate();
        }
    ||

widget_defs("Display") {
    const "format" optional_labels("format");
    const "has_format","string-length($format)>0";
    value "$format";

    if "$hmi_element[not(self::svg:text)] and not($has_format)"
        error > Display Widget id="«$hmi_element/@id»" must be a svg::text element itself or a group containing a svg:text element labelled "format"

    const "field_initializer" foreach "path" {
        choose{
            when "@type='HMI_STRING'" > ""
            otherwise > 0
        }
        if "position()!=last()" > ,
    }
    |     fields: [«$field_initializer»],
    |     animate: function(){
    choose {
        when "$has_format" {
    |       if(this.format_elt.getAttribute("lang")) {
    |           this.format = svg_text_to_multiline(this.format_elt);
    |           this.format_elt.removeAttribute("lang");
    |       }
    |       let str = vsprintf(this.format,this.fields);
    |       multiline_to_svg_text(this.format_elt, str);
        }
        otherwise {
    |       let str = this.args.length == 1 ? vsprintf(this.args[0],this.fields) : this.fields.join(' ');
    |       multiline_to_svg_text(this.element, str);
        }
    }
    |     },
    |     
    if "$has_format" {
    |     init: function() {
    |       this.format = svg_text_to_multiline(this.format_elt);
    |     },
    }
}