svghmi/widget_tooglebutton.ysl2
author Edouard Tisserant <edouard.tisserant@gmail.com>
Sat, 05 Mar 2022 11:14:00 +0100
branchwxPython4
changeset 3437 ce366d67a5b7
parent 3241 fe945f1f48b7
child 3478 c04c6db09eff
permissions -rw-r--r--
Tests: Enhance robustness of stdout driven waiting state in Sikuli based tests.

Some tests were randomly passing, because from time to time waiting for idle was skiped. It was combination of multiple problems :
- buffering on stdout (now use readline + flush for each write to log)
- it is sometime required to wait for activity before waiting for timeout added "WaitForChangeAndIdle" to "stdoutIdleObserver"
// widget_tooglebutton.ysl2


widget_desc("ToggleButton") {
    longdesc
    ||
    Button widget takes one boolean variable path, and reflect current true
    or false value by showing "active" or "inactive" labeled element
    respectively. Clicking or touching button toggles variable.
    ||

    shortdesc > Toggle button reflecting given boolean variable

    path name="value" accepts="HMI_BOOL" > Boolean variable
    
}

widget_class("ToggleButton") {
    ||
        frequency = 5;
        state = 0;
        active_style = undefined;
        inactive_style = undefined;

        dispatch(value) {
            this.state = value;
            //redraw toggle button
            this.request_animate();
        }

        on_click(evt) {
            //toggle state and apply
            this.state = this.state ? false : true;
            this.apply_hmi_value(0, this.state);

            //redraw toggle button
            this.request_animate();
        }

        activate(val) {
            let [active, inactive] = val ? ["none",""] : ["", "none"];
            if (this.active_elt)
                this.active_elt.style.display = active;
            if (this.inactive_elt)
                this.inactive_elt.style.display = inactive;
        }

        animate(){
            // redraw toggle button on screen refresh
            this.activate(this.state);
        }

        init() {
            this.activate(false);
            this.element.onclick = (evt) => this.on_click(evt);
        }
    ||
}

widget_defs("ToggleButton") {
    optional_labels("active inactive");
}