svghmi/widget_input.ysl2
author Edouard Tisserant <edouard.tisserant@gmail.com>
Sun, 12 Mar 2023 00:51:53 +0100
branchwxPython4
changeset 3746 41be039fbb8c
parent 3706 39ae17a1cabe
permissions -rw-r--r--
IDE: fix again ruberband with gtk3.

DC logical functions are now disabled when using GTK3.
Apparently using XOR was still having an effect.
Use regular black pen with no logical funciton instead.
// widget_input.ysl2

widget_desc("Input") {
    longdesc
    || 
    Input widget takes one variable path, and displays current value in
    optional "value" labeled sub-element. 

    Click on optional "edit" labeled element opens keypad to edit value.
    
    Operation on current value is performed when click on sub-elements with
    label starting with '=', '+' or '-' sign. Value after sign is used as
    operand.
    ||

    shortdesc > Input field with predefined operation buttons

    arg name="format" accepts="string" > optional printf-like format 

    path name="edit" accepts="HMI_INT, HMI_REAL, HMI_STRING" > single variable to edit
    
}

widget_class("Input")
||
     on_op_click(opstr) {
         this.change_hmi_value(0, opstr);
     }
     edit_callback(new_val) {
         this.apply_hmi_value(0, new_val);
     }

     is_inhibited = false;
     alert(msg){
         this.is_inhibited = true;
         this.display = msg;
         setTimeout(() => this.stopalert(), 1000);
         this.request_animate();
     }

     stopalert(){
         this.is_inhibited = false;
         this.display = this.last_value;
         this.request_animate();
     }

     overshot(new_val, max) {
         this.alert("max");
     }

     undershot(new_val, min) {
         this.alert("min");
     }

     display = "";
||

widget_defs("Input") {

    const "value_elt" optional_labels("value");
    const "have_value","string-length($value_elt)>0";
    value "$value_elt";

    const "edit_elt" optional_labels("edit");
    const "have_edit","string-length($edit_elt)>0";
    value "$edit_elt";

    const "action_elements", "$hmi_element/*[regexp:test(@inkscape:label,'^[=+\-].+')]";

    if "$have_value"
    |     frequency: 5,
    |     dispatch: function(value) {


    if "$have_value or $have_edit" {
        choose{
            when "count(arg) = 1" {
    |         this.last_value = vsprintf("«arg[1]/@value»", [value]);
            }
            otherwise {
    |         this.last_value = value;
            }
        }
    |         if(!this.is_inhibited){
    |             this.display = this.last_value;
    if "$have_value" {
    |             this.request_animate();
    }
    |         }
    }
    |     },

    if "$have_value" {
    |     animate: function(){
    |         multiline_to_svg_text(this.value_elt, String(this.display));
    |     },
    }

    foreach "$action_elements" {
    |     action_elt_«position()»: id("«@id»"),
    }
    |     init: function() {

    if "$have_edit" {
    |         this.edit_elt.onclick = () => edit_value("«path/@value»", "«path/@type»", this, this.last_value);
        if "$have_value" {
    |         this.value_elt.style.pointerEvents = "none";
        }
    |         this.animate();
    }

    foreach "$action_elements" {
    |         this.action_elt_«position()».onclick = () => this.on_op_click("«func:escape_quotes(@inkscape:label)»");
    }

    if "$have_value" {
    |         multiline_to_svg_text(this.value_elt, "");
    }
    |     },
}