svghmi/widget_slider.ysl2
author Edouard Tisserant
Mon, 10 Aug 2020 13:58:55 +0200
branchsvghmi
changeset 3019 497aac6522a3
parent 3018 22b969b409b0
child 3020 895bbeced72d
permissions -rw-r--r--
SVGHMI: provide request_animate() to Widget authors so that they can register redraw code when events lead to redraw. Widget member animate() is called when it is time to update DOM.
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;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    11
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    12
        dispatch(value) {
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    13
            if(!this.drag){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    14
                if(this.value_elt)
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    15
                    this.value_elt.textContent = String(value);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    16
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    17
                this.handle_position(value);
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
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    21
        handle_position(value){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    22
            let [min,max,start,totallength] = this.range;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    23
            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
    24
            let tip = this.range_elt.getPointAtLength(length);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    25
            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
    26
        }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    27
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    28
        on_release(evt) {
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    29
            if(this.drag){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    30
                this.drag = false;
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
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    34
        update_position(evt){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    35
            if(this.drag && this.enTimer){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    36
                var html_dist = 0;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    37
                var svg_dist = 0;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    38
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    39
                //calculate size of widget in html
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    40
                var range_borders = this.range_elt.getBoundingClientRect();
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    41
                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
    42
                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
    43
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    44
                //get range and mouse coordinates
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    45
                var mouseX = undefined;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    46
                var mouseY = undefined;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    47
                if (evt.type.startsWith("touch")){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    48
                    mouseX = Math.ceil(evt.touches[0].clientX);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    49
                    mouseY = Math.ceil(evt.touches[0].clientY);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    50
                }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    51
                else{
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    52
                    mouseX = evt.pageX;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    53
                    mouseY = evt.pageY;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    54
                }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    55
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    56
                //get handle distance from mouse position
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    57
                if (minX > mouseX && minY < mouseY){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    58
                    html_dist = 0;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    59
                }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    60
                else if (maxX < mouseX && maxY > mouseY){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    61
                    html_dist = range_length;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    62
                }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    63
                else{
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    64
                    // calculate distace
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    65
                    if(this.fi > 0.7){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    66
                        html_dist = (minY - mouseY)/Math.sin(this.fi);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    67
                    }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    68
                    else{
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    69
                        html_dist = (mouseX - minX)/Math.cos(this.fi);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    70
                    }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    71
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    72
                    //check if in range
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    73
                    if (html_dist > range_length){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    74
                        html_dist = range_length;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    75
                    }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    76
                    else if (html_dist < 0){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    77
                        html_dist = 0;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    78
                    }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    79
                }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    80
                //redraw handle
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    81
                this.handle_position(svg_dist=(html_dist/range_length)*this.range[1]);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    82
                this.value_elt.textContent = String(Math.ceil(svg_dist));
3018
Edouard Tisserant
parents: 3012
diff changeset
    83
                this.apply_hmi_value(0, Math.ceil(svg_dist));
3012
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    84
                //reset timer
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    85
                this.enTimer = false;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    86
                setTimeout("{hmi_widgets['"+this.element_id+"'].enTimer = true;}", 100);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    87
            }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    88
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    89
        }
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    90
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    91
        on_select(evt){
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    92
            this.drag = true;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    93
            this.enTimer = true;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    94
            this.update_position(evt);
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
        init() {
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    98
            let min = this.min_elt ?
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
    99
                        Number(this.min_elt.textContent) :
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   100
                        this.args.length >= 1 ? this.args[0] : 0;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   101
            let max = this.max_elt ?
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   102
                        Number(this.max_elt.textContent) :
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   103
                        this.args.length >= 2 ? this.args[1] : 100;
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   104
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   105
            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
   106
            let start = this.range_elt.getPointAtLength(0);
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   107
            let end = this.range_elt.getPointAtLength(this.range_elt.getTotalLength());
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   108
            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
   109
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.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
   112
            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
   113
            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
   114
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   115
            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
   116
            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
   117
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   118
            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
   119
            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
   120
            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
   121
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   122
        }
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
    ||
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   125
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   126
template "widget[@type='Slider']", mode="widget_defs" {
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   127
    param "hmi_element";
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   128
    labels("handle range");
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   129
    optional_labels("value min max");
65471f50b421 Create new slider widget which extand class widget
usveticic
parents:
diff changeset
   130
    |,
3018
Edouard Tisserant
parents: 3012
diff changeset
   131
}