svghmi/widget_slider.ysl2
author Edouard Tisserant
Mon, 10 Aug 2020 14:00:20 +0200
branchsvghmi
changeset 3020 895bbeced72d
parent 3018 22b969b409b0
child 3021 49799de67540
permissions -rw-r--r--
SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
3012
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
     1
// widget_slider.ysl2
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
     2
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
     3
template "widget[@type='Slider']", mode="widget_class"
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
     4
    ||
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
     5
    class SliderWidget extends Widget{
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
     6
        frequency = 5;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
     7
        range = undefined;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
     8
        fi = undefined;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
     9
        drag = false;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    10
        enTimer = false;
3020
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    11
        svg_dist = 0
3012
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    12
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    13
        dispatch(value) {
3020
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    14
            if(this.value_elt)
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    15
                this.value_elt.textContent = String(value);
3012
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    16
3020
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    17
            this.handle_position(value);
3012
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    18
        }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    19
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    20
        handle_position(value){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    21
            let [min,max,start,totallength] = this.range;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    22
            let length = Math.max(0,Math.min(totallength,(Number(value)-min)*totallength/(max-min)));
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    23
            let tip = this.range_elt.getPointAtLength(length);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    24
            this.handle_elt.setAttribute('transform',"translate("+(tip.x-start.x)+","+(tip.y-start.y)+")");
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    25
        }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    26
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    27
        on_release(evt) {
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    28
            if(this.drag){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    29
                this.drag = false;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    30
            }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    31
        }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    32
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    33
        update_position(evt){
3020
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    34
            if(this.drag){
3012
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    35
                var html_dist = 0;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    36
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    37
                //calculate size of widget in html
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    38
                var range_borders = this.range_elt.getBoundingClientRect();
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    39
                var range_length = Math.sqrt( range_borders.height*range_borders.height + range_borders.width*range_borders.width );
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    40
                var [minX,minY,maxX,maxY] = [range_borders.left,range_borders.bottom,range_borders.right,range_borders.top];
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    41
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    42
                //get range and mouse coordinates
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    43
                var mouseX = undefined;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    44
                var mouseY = undefined;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    45
                if (evt.type.startsWith("touch")){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    46
                    mouseX = Math.ceil(evt.touches[0].clientX);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    47
                    mouseY = Math.ceil(evt.touches[0].clientY);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    48
                }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    49
                else{
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    50
                    mouseX = evt.pageX;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    51
                    mouseY = evt.pageY;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    52
                }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    53
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    54
                //get handle distance from mouse position
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    55
                if (minX > mouseX && minY < mouseY){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    56
                    html_dist = 0;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    57
                }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    58
                else if (maxX < mouseX && maxY > mouseY){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    59
                    html_dist = range_length;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    60
                }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    61
                else{
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    62
                    // calculate distace
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    63
                    if(this.fi > 0.7){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    64
                        html_dist = (minY - mouseY)/Math.sin(this.fi);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    65
                    }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    66
                    else{
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    67
                        html_dist = (mouseX - minX)/Math.cos(this.fi);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    68
                    }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    69
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    70
                    //check if in range
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    71
                    if (html_dist > range_length){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    72
                        html_dist = range_length;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    73
                    }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    74
                    else if (html_dist < 0){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    75
                        html_dist = 0;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    76
                    }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    77
                }
3020
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    78
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    79
                this.svg_dist=(html_dist/range_length)*this.range[1];
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    80
3012
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    81
                //redraw handle
3020
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    82
                //this.handle_position(svg_dist=(html_dist/range_length)*this.range[1]);
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    83
                //this.value_elt.textContent = String(Math.ceil(svg_dist));
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    84
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    85
                if(this.enTimer){
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    86
                    this.apply_hmi_value(0, Math.ceil(this.svg_dist));
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    87
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    88
                    // TODO : update ghost cursor and call this.request_animate()
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    89
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    90
                    //reset timer
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    91
                    this.enTimer = false;
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    92
                    setTimeout("{hmi_widgets['"+this.element_id+"'].enTimer = true;}", 100);
895bbeced72d SVGHMI: Update Slider widget so that it doesn't display future value but actual value only.
Edouard Tisserant
parents: 3018
diff changeset
    93
                }
3012
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    94
            }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    95
        }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    96
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    97
        on_select(evt){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    98
            this.drag = true;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    99
            this.enTimer = true;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   100
            this.update_position(evt);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   101
        }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   102
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   103
        init() {
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   104
            let min = this.min_elt ?
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   105
                        Number(this.min_elt.textContent) :
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   106
                        this.args.length >= 1 ? this.args[0] : 0;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   107
            let max = this.max_elt ?
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   108
                        Number(this.max_elt.textContent) :
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   109
                        this.args.length >= 2 ? this.args[1] : 100;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   110
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   111
            this.range = [min, max, this.range_elt.getPointAtLength(0),this.range_elt.getTotalLength()];
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   112
            let start = this.range_elt.getPointAtLength(0);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   113
            let end = this.range_elt.getPointAtLength(this.range_elt.getTotalLength());
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   114
            this.fi = Math.atan2(start.y-end.y, end.x-start.x);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   115
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   116
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   117
            this.handle_elt.addEventListener("touchstart", hmi_widgets[this.element_id].on_select.bind(this));
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   118
            this.handle_elt.addEventListener("mousedown", hmi_widgets[this.element_id].on_select.bind(this));
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   119
            this.element.addEventListener("mousedown", hmi_widgets[this.element_id].on_select.bind(this));
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   120
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   121
            window.addEventListener("touchmove", hmi_widgets[this.element_id].update_position.bind(this));
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   122
            window.addEventListener("mousemove", hmi_widgets[this.element_id].update_position.bind(this));
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   123
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   124
            window.addEventListener("mouseup", hmi_widgets[this.element_id].on_release.bind(this))
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   125
            window.addEventListener("touchend", hmi_widgets[this.element_id].on_release.bind(this));
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   126
            window.addEventListener("touchcancel", hmi_widgets[this.element_id].on_release.bind(this));
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   127
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   128
        }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   129
    }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   130
    ||
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   131
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   132
template "widget[@type='Slider']", mode="widget_defs" {
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   133
    param "hmi_element";
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   134
    labels("handle range");
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   135
    optional_labels("value min max");
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   136
    |,
3018
Edouard Tisserant
parents: 3012
diff changeset
   137
}