# HG changeset patch # User Edouard Tisserant # Date 1728635910 -7200 # Node ID 59a331f80858e01aa20194e8ec7f39377d0984b5 # Parent a3cf9f635952bdc3010f734ac79cfa432c62fff3 SVGHMI: remove widgets deprecated since long diff -r a3cf9f635952 -r 59a331f80858 svghmi/widget_animate.ysl2 --- a/svghmi/widget_animate.ysl2 Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -// widget_animate.ysl2 - -widget_class("Animate") { - || - frequency = 5; - speed = 0; - start = false; - widget_center = undefined; - - dispatch(value) { - this.speed = value / 5; - - //reconfigure animation - this.request_animate(); - } - - animate(){ - // change animation properties - for(let child of this.element.children){ - if(child.nodeName.startsWith("animate")){ - if(this.speed != 0 && !this.start){ - this.start = true; - this.element.beginElement(); - } - - if(this.speed > 0){ - child.setAttribute("dur", this.speed+"s"); - } - else if(this.speed < 0){ - child.setAttribute("dur", (-1)*this.speed+"s"); - } - else{ - this.start = false; - this.element.endElement(); - } - } - } - } - - init() { - let widget_pos = this.element.getBBox(); - this.widget_center = [(widget_pos.x+widget_pos.width/2), (widget_pos.y+widget_pos.height/2)]; - } - || -} - diff -r a3cf9f635952 -r 59a331f80858 svghmi/widget_animaterotation.ysl2 --- a/svghmi/widget_animaterotation.ysl2 Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -// widget_animaterotation.ysl2 - -widget_desc("AnimateRotation") { - longdesc - || - AnimateRotation - DEPRECATED, do not use. - Doesn't follow WYSIWYG principle, and forces user to add animateTransform tag in SVG (using inkscape XML editor for exemple) - || - - shortdesc > AnimateRotation - DEPRECATED - - path name="speed" accepts="HMI_INT,HMI_REAL" > speed - -} - -widget_class("AnimateRotation") { - || - frequency = 5; - speed = 0; - widget_center = undefined; - - dispatch(value) { - this.speed = value / 5; - - //reconfigure animation - this.request_animate(); - } - - animate(){ - // change animation properties - // TODO : rewrite with proper es6 - for(let child of this.element.children){ - if(child.nodeName == "animateTransform"){ - if(this.speed > 0){ - child.setAttribute("dur", this.speed+"s"); - child.setAttribute("from", "0 "+this.widget_center[0]+" "+this.widget_center[1]); - child.setAttribute("to", "360 "+this.widget_center[0]+" "+this.widget_center[1]); - } - else if(this.speed < 0){ - child.setAttribute("dur", (-1)*this.speed+"s"); - child.setAttribute("from", "360 "+this.widget_center[0]+" "+this.widget_center[1]); - child.setAttribute("to", "0 "+this.widget_center[0]+" "+this.widget_center[1]); - } - else{ - child.setAttribute("from", "0 "+this.widget_center[0]+" "+this.widget_center[1]); - child.setAttribute("to", "0 "+this.widget_center[0]+" "+this.widget_center[1]); - } - } - } - } - - init() { - let widget_pos = this.element.getBBox(); - this.widget_center = [(widget_pos.x+widget_pos.width/2), (widget_pos.y+widget_pos.height/2)]; - } - || -} - diff -r a3cf9f635952 -r 59a331f80858 svghmi/widget_circularslider.ysl2 --- a/svghmi/widget_circularslider.ysl2 Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,264 +0,0 @@ -// widget_circuralslider.ysl2 - -widget_desc("CircularSlider") { - longdesc - || - CircularSlider - DEPRECATED, to be replaced by PathSlider - This widget moves "handle" labeled group along "range" labeled - arc, according to value of the single accepted variable. - - If "min" a "max" labeled texts are provided, or if first and second - argument are given, then they are used as respective minimum and maximum - value. Otherwise, value is expected to be in between 0 and 100. - - If "value" labeled text is found, then its content is replaced by value. - During drag, "setpoint" labeled group is moved to position defined by user - while "handle" reflects current value from variable. - || - - shortdesc > CircularSlider - DEPRECATED - - arg name="min" count="optional" accepts="int,real" > minimum value - - arg name="min" count="optional" accepts="int,real" > maximum value - - // TODO: add printf-like format - - path name="value" accepts="HMI_INT,HMI_REAL" > Value to display - -} - -widget_class("CircularSlider") - || - frequency = 5; - range = undefined; - circle = undefined; - handle_pos = undefined; - curr_value = 0; - drag = false; - enTimer = false; - last_drag = false; - - dispatch(value) { - let [min,max,start,totallength] = this.range; - //save current value inside widget - this.curr_value = value; - - //check if in range - if (this.curr_value > max){ - this.curr_value = max; - this.apply_hmi_value(0, this.curr_value); - } - else if (this.curr_value < min){ - this.curr_value = min; - this.apply_hmi_value(0, this.curr_value); - } - - if(this.value_elt) - this.value_elt.textContent = String(value); - - //don't update if draging and setpoint ghost doesn't exist - if(!this.drag || (this.setpoint_elt != undefined)){ - this.update_DOM(value, this.handle_elt); - } - } - - update_DOM(value, elt){ - let [min,max,totalDistance] = this.range; - let length = Math.max(0,Math.min((totalDistance),(Number(value)-min)/(max-min)*(totalDistance))); - let tip = this.range_elt.getPointAtLength(length); - elt.setAttribute('transform',"translate("+(tip.x-this.handle_pos.x)+","+(tip.y-this.handle_pos.y)+")"); - - // show or hide ghost if exists - if(this.setpoint_elt != undefined){ - if(this.last_drag!= this.drag){ - if(this.drag){ - this.setpoint_elt.setAttribute("style", this.setpoint_style); - }else{ - this.setpoint_elt.setAttribute("style", "display:none"); - } - this.last_drag = this.drag; - } - } - } - - on_release(evt) { - //unbind events - window.removeEventListener("touchmove", this.on_bound_drag, true); - window.removeEventListener("mousemove", this.on_bound_drag, true); - - window.removeEventListener("mouseup", this.bound_on_release, true) - window.removeEventListener("touchend", this.bound_on_release, true); - window.removeEventListener("touchcancel", this.bound_on_release, true); - - //reset drag flag - if(this.drag){ - this.drag = false; - } - - // get final position - this.update_position(evt); - } - - on_drag(evt){ - //ignore drag event for X amount of time and if not selected - if(this.enTimer && this.drag){ - this.update_position(evt); - - //reset timer - this.enTimer = false; - setTimeout("{hmi_widgets['"+this.element_id+"'].enTimer = true;}", 100); - } - } - - update_position(evt){ - if(this.drag && this.enTimer){ - var svg_dist = 0; - - //calculate center of widget in html - // --TODO maybe it would be better to bind this part to window change size event ??? - let [xdest,ydest,svgWidth,svgHeight] = page_desc[current_visible_page].bbox; - let [cX, cY,fiStart,fiEnd,minMax,x1,y1,width,height] = this.circle; - let htmlCirc = this.range_elt.getBoundingClientRect(); - let cxHtml = ((htmlCirc.right-htmlCirc.left)/(width)*(cX-x1))+htmlCirc.left; - let cyHtml = ((htmlCirc.bottom-htmlCirc.top)/(height)*(cY-y1))+htmlCirc.top; - - - //get mouse coordinates - let mouseX = undefined; - let mouseY = undefined; - if (evt.type.startsWith("touch")){ - mouseX = Math.ceil(evt.touches[0].clientX); - mouseY = Math.ceil(evt.touches[0].clientY); - } - else{ - mouseX = evt.pageX; - mouseY = evt.pageY; - } - - //calculate angle - let fi = Math.atan2(cyHtml-mouseY, mouseX-cxHtml); - - // transform from 0 to 2PI - if (fi > 0){ - fi = 2*Math.PI-fi; - } - else{ - fi = -fi; - } - - //offset it to 0 - fi = fi - fiStart; - if (fi < 0){ - fi = fi + 2*Math.PI; - } - - //get handle distance from mouse position - if(fi= 1 ? this.args[0] : 0; - let max = this.max_elt ? - Number(this.max_elt.textContent) : - this.args.length >= 2 ? this.args[1] : 100; - - //fiStart ==> offset - let fiStart = Number(this.range_elt.getAttribute('sodipodi:start')); - let fiEnd = Number(this.range_elt.getAttribute('sodipodi:end')); - fiEnd = fiEnd - fiStart; - - //fiEnd ==> size of angle - if (fiEnd < 0){ - fiEnd = 2*Math.PI + fiEnd; - } - - //min max barrier angle - let minMax = (2*Math.PI - fiEnd)/2; - - //get parameters from svg - let cX = Number(this.range_elt.getAttribute('sodipodi:cx')); - let cY = Number(this.range_elt.getAttribute('sodipodi:cy')); - this.range_elt.style.strokeMiterlimit="0"; //eliminates some weird border around html object - this.range = [min, max,this.range_elt.getTotalLength()]; - let cPos = this.range_elt.getBBox(); - this.handle_pos = this.range_elt.getPointAtLength(0); - this.circle = [cX, cY,fiStart,fiEnd,minMax,cPos.x,cPos.y,cPos.width,cPos.height]; - - //bind functions - this.bound_on_select = this.on_select.bind(this); - this.bound_on_release = this.on_release.bind(this); - this.on_bound_drag = this.on_drag.bind(this); - - this.handle_elt.addEventListener("mousedown", this.bound_on_select); - this.element.addEventListener("mousedown", this.bound_on_select); - this.element.addEventListener("touchstart", this.bound_on_select); - //touch recognised as page drag without next command - document.body.addEventListener("touchstart", function(e){}, false); - - //save ghost style - //save ghost style - if(this.setpoint_elt != undefined){ - this.setpoint_style = this.setpoint_elt.getAttribute("style"); - this.setpoint_elt.setAttribute("style", "display:none"); - } - - } - || - -widget_defs("CircularSlider") { - labels("handle range"); - optional_labels("value min max setpoint"); - |, -} diff -r a3cf9f635952 -r 59a331f80858 svghmi/widget_slider.ysl2 --- a/svghmi/widget_slider.ysl2 Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,357 +0,0 @@ -// widget_slider.ysl2 - -widget_desc("Slider") { - longdesc - || - Slider - DEPRECATED - use ScrollBar or PathSlider instead - || - - shortdesc > Slider - DEPRECATED - use ScrollBar instead - - path name="value" accepts="HMI_INT" > value - path name="range" accepts="HMI_INT" > range - path name="visible" accepts="HMI_INT" > visible - -} - -widget_class("Slider") - || - frequency = 5; - range = undefined; - handle_orig = undefined; - scroll_size = undefined; - scroll_range = 0; - scroll_visible = 7; - min_size = 0.07; - fi = undefined; - curr_value = 0; - drag = false; - enTimer = false; - handle_click = undefined; - last_drag = false; - - dispatch(value,oldval, index) { - if (index == 0){ - let [min,max,start,totallength] = this.range; - //save current value inside widget - this.curr_value = value; - - //check if in range - if (this.curr_value > max){ - this.curr_value = max; - this.apply_hmi_value(0, this.curr_value); - } - else if (this.curr_value < min){ - this.curr_value = min; - this.apply_hmi_value(0, this.curr_value); - } - - if(this.value_elt) - this.value_elt.textContent = String(value); - } - else if(index == 1){ - this.scroll_range = value; - this.set_scroll(); - } - else if(index == 2){ - this.scroll_visible = value; - this.set_scroll(); - } - - //don't update if draging and setpoint ghost doesn't exist - if(!this.drag || (this.setpoint_elt != undefined)){ - this.update_DOM(this.curr_value, this.handle_elt); - } - } - - set_scroll(){ - //check if range is bigger than visible and set scroll size - if(this.scroll_range > this.scroll_visible){ - this.scroll_size = this.scroll_range - this.scroll_visible; - this.range[0] = 0; - this.range[1] = this.scroll_size; - } - else{ - this.scroll_size = 1; - this.range[0] = 0; - this.range[1] = 1; - } - } - - update_DOM(value, elt){ - let [min,max,start,totallength] = this.range; - // check if handle is resizeable - if (this.scroll_size != undefined){ //size changes - //get parameters - let length = Math.max(min,Math.min(max,(Number(value)-min)*max/(max-min))); - let tip = this.range_elt.getPointAtLength(length); - let handle_min = totallength*this.min_size; - - let step = 1; - //check if range is bigger than max displayed and recalculate step - if ((totallength/handle_min) < (max-min+1)){ - step = (max-min+1)/(totallength/handle_min-1); - } - - let kx,ky,offseY,offseX = undefined; - //scale on x or y axes - if (this.fi > 0.75){ - //get scale factor - if(step > 1){ - ky = handle_min/this.handle_orig.height; - } - else{ - ky = (totallength-handle_min*(max-min))/this.handle_orig.height; - } - kx = 1; - //get 0 offset to stay inside range - offseY = start.y - (this.handle_orig.height + this.handle_orig.y) * ky; - offseX = 0; - //get distance from value - tip.y =this.range_elt.getPointAtLength(0).y - length/step *handle_min; - } - else{ - //get scale factor - if(step > 1){ - kx = handle_min/this.handle_orig.width; - } - else{ - kx = (totallength-handle_min*(max-min))/this.handle_orig.width; - } - ky = 1; - //get 0 offset to stay inside range - offseX = start.x - (this.handle_orig.x * kx); - offseY = 0; - //get distance from value - tip.x =this.range_elt.getPointAtLength(0).x + length/step *handle_min; - } - elt.setAttribute('transform',"matrix("+(kx)+" 0 0 "+(ky)+" "+(tip.x-start.x+offseX)+" "+(tip.y-start.y+offseY)+")"); - } - else{ //size stays the same - let length = Math.max(0,Math.min(totallength,(Number(value)-min)*totallength/(max-min))); - let tip = this.range_elt.getPointAtLength(length); - elt.setAttribute('transform',"translate("+(tip.x-start.x)+","+(tip.y-start.y)+")"); - } - - // show or hide ghost if exists - if(this.setpoint_elt != undefined){ - if(this.last_drag!= this.drag){ - if(this.drag){ - this.setpoint_elt.setAttribute("style", this.setpoint_style); - }else{ - this.setpoint_elt.setAttribute("style", "display:none"); - } - this.last_drag = this.drag; - } - } - } - - on_release(evt) { - //unbind events - window.removeEventListener("touchmove", this.on_bound_drag, true); - window.removeEventListener("mousemove", this.on_bound_drag, true); - - window.removeEventListener("mouseup", this.bound_on_release, true); - window.removeEventListener("touchend", this.bound_on_release, true); - window.removeEventListener("touchcancel", this.bound_on_release, true); - - //reset drag flag - if(this.drag){ - this.drag = false; - } - - // get final position - this.update_position(evt); - - } - - on_drag(evt){ - //ignore drag event for X amount of time and if not selected - if(this.enTimer && this.drag){ - this.update_position(evt); - - //reset timer - this.enTimer = false; - setTimeout("{hmi_widgets['"+this.element_id+"'].enTimer = true;}", 100); - } - } - - update_position(evt){ - var html_dist = 0; - let [min,max,start,totallength] = this.range; - - //calculate size of widget in html - var range_borders = this.range_elt.getBoundingClientRect(); - var [minX,minY,maxX,maxY] = [range_borders.left,range_borders.bottom,range_borders.right,range_borders.top]; - var range_length = Math.sqrt( range_borders.height*range_borders.height + range_borders.width*range_borders.width ); - - //get range and mouse coordinates - var mouseX = undefined; - var mouseY = undefined; - if (evt.type.startsWith("touch")){ - mouseX = Math.ceil(evt.touches[0].clientX); - mouseY = Math.ceil(evt.touches[0].clientY); - } - else{ - mouseX = evt.pageX; - mouseY = evt.pageY; - } - - // calculate position - if (this.handle_click){ //if clicked on handle - let moveDist = 0, resizeAdd = 0; - let range_percent = 1; - - //set paramters for resizeable handle - if (this.scroll_size != undefined){ - // add one more object to stay inside range - resizeAdd = 1; - - //chack if range is bigger than display option and - // calculate percent of range with out handle - if(((max/(max*this.min_size)) < (max-min+1))){ - range_percent = 1-this.min_size; - } - else{ - range_percent = 1-(max-max*this.min_size*(max-min))/max; - } - } - - //calculate value difference on x or y axis - if(this.fi > 0.7){ - moveDist = ((max-min+resizeAdd)/(range_length*range_percent))*((this.handle_click[1]-mouseY)/Math.sin(this.fi)); - } - else{ - moveDist = ((max-min+resizeAdd)/(range_length*range_percent))*((mouseX-this.handle_click[0])/Math.cos(this.fi)); - } - - this.curr_value = Math.ceil(this.handle_click[2] + moveDist); - } - else{ //if clicked on widget - //get handle distance from mouse position - if (minX > mouseX && minY < mouseY){ - html_dist = 0; - } - else if (maxX < mouseX && maxY > mouseY){ - html_dist = range_length; - } - else{ - if(this.fi > 0.7){ - html_dist = (minY - mouseY)/Math.sin(this.fi); - } - else{ - html_dist = (mouseX - minX)/Math.cos(this.fi); - } - } - //calculate distance - this.curr_value=Math.ceil((html_dist/range_length)*(this.range[1]-this.range[0])+this.range[0]); - } - - //check if in range and apply - if (this.curr_value > max){ - this.curr_value = max; - } - else if (this.curr_value < min){ - this.curr_value = min; - } - this.apply_hmi_value(0, this.curr_value); - - //redraw handle - this.request_animate(); - - } - - animate(){ - // redraw handle on screen refresh - // check if setpoint(ghost) handle exsist otherwise update main handle - if(this.setpoint_elt != undefined){ - this.update_DOM(this.curr_value, this.setpoint_elt); - } - else{ - this.update_DOM(this.curr_value, this.handle_elt); - } - } - - on_select(evt){ - //enable drag flag and timer - this.drag = true; - this.enTimer = true; - - //bind events - window.addEventListener("touchmove", this.on_bound_drag, true); - window.addEventListener("mousemove", this.on_bound_drag, true); - - window.addEventListener("mouseup", this.bound_on_release, true); - window.addEventListener("touchend", this.bound_on_release, true); - window.addEventListener("touchcancel", this.bound_on_release, true); - - // check if handle was pressed - if (evt.currentTarget == this.handle_elt){ - //get mouse position on the handle - let mouseX = undefined; - let mouseY = undefined; - if (evt.type.startsWith("touch")){ - mouseX = Math.ceil(evt.touches[0].clientX); - mouseY = Math.ceil(evt.touches[0].clientY); - } - else{ - mouseX = evt.pageX; - mouseY = evt.pageY; - } - //save coordinates and orig value - this.handle_click = [mouseX,mouseY,this.curr_value]; - } - else{ - // get new handle position and reset if handle was not pressed - this.handle_click = undefined; - this.update_position(evt); - } - - //prevent next events - evt.stopPropagation(); - - } - - - init() { - //set min max value if not defined - let min = this.min_elt ? - Number(this.min_elt.textContent) : - this.args.length >= 1 ? this.args[0] : 0; - let max = this.max_elt ? - Number(this.max_elt.textContent) : - this.args.length >= 2 ? this.args[1] : 100; - - - // save initial parameters - this.range_elt.style.strokeMiterlimit="0"; - this.range = [min, max, this.range_elt.getPointAtLength(0),this.range_elt.getTotalLength()]; - let start = this.range_elt.getPointAtLength(0); - let end = this.range_elt.getPointAtLength(this.range_elt.getTotalLength()); - this.fi = Math.atan2(start.y-end.y, end.x-start.x); - this.handle_orig = this.handle_elt.getBBox(); - - //bind functions - this.bound_on_select = this.on_select.bind(this); - this.bound_on_release = this.on_release.bind(this); - this.on_bound_drag = this.on_drag.bind(this); - - this.handle_elt.addEventListener("mousedown", this.bound_on_select); - this.element.addEventListener("mousedown", this.bound_on_select); - this.element.addEventListener("touchstart", this.bound_on_select); - //touch recognised as page drag without next command - document.body.addEventListener("touchstart", function(e){}, false); - - //save ghost style - if(this.setpoint_elt != undefined){ - this.setpoint_style = this.setpoint_elt.getAttribute("style"); - this.setpoint_elt.setAttribute("style", "display:none"); - } - - } - || - -widget_defs("Slider") { - labels("handle range"); - optional_labels("value min max setpoint"); -} diff -r a3cf9f635952 -r 59a331f80858 tests/projects/svghmi_v2/beremiz.xml --- a/tests/projects/svghmi_v2/beremiz.xml Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ - - - - - diff -r a3cf9f635952 -r 59a331f80858 tests/projects/svghmi_v2/plc.xml --- a/tests/projects/svghmi_v2/plc.xml Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,585 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TargetPressure - - - - - - - TestButton - - - - - - - - - - - - - TestLocal - - - - - - - Multistate - - - - - - - - - - - MultistateExt - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TargetPressure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Pressure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Sloth - - - - - - - - - - - Pressure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 100 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - strout - - - - - - - TargetPressure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - strin - - - - - - - boolin - - - - - - - - - - - boolout - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Pressure - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - - - - - - - Sloth - - - - - - - - - - - - - - - - - - diff -r a3cf9f635952 -r 59a331f80858 tests/projects/svghmi_v2/py_ext_0@py_ext/baseconfnode.xml --- a/tests/projects/svghmi_v2/py_ext_0@py_ext/baseconfnode.xml Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ - - diff -r a3cf9f635952 -r 59a331f80858 tests/projects/svghmi_v2/py_ext_0@py_ext/pyfile.xml --- a/tests/projects/svghmi_v2/py_ext_0@py_ext/pyfile.xml Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff -r a3cf9f635952 -r 59a331f80858 tests/projects/svghmi_v2/svghmi_0@svghmi/baseconfnode.xml --- a/tests/projects/svghmi_v2/svghmi_0@svghmi/baseconfnode.xml Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ - - diff -r a3cf9f635952 -r 59a331f80858 tests/projects/svghmi_v2/svghmi_0@svghmi/confnode.xml --- a/tests/projects/svghmi_v2/svghmi_0@svghmi/confnode.xml Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ - - diff -r a3cf9f635952 -r 59a331f80858 tests/projects/svghmi_v2/svghmi_0@svghmi/svghmi.svg --- a/tests/projects/svghmi_v2/svghmi_0@svghmi/svghmi.svg Fri Oct 11 10:34:15 2024 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1619 +0,0 @@ - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 10 - 000 - - - Test - - - - - - - - - - Q - - - - W - - - - E - - - - R - - - - T - - - - Y - - - - U - - - - I - - - - O - - - - P - - - - A - - - - S - - - - D - - - - F - - - - G - - - - H - - - - J - - - - K - - - - L - - - - Z - - - - X - - - - C - - - - V - - - - B - - - - N - - - - M - - - - . - : - - - - ; - , - - - - 1 - - - - 2 - - - - 3 - - - - 4 - - - - 5 - - - - 6 - - - - 7 - - - - 8 - - - - 9 - - - - - - 0 - + - - - - - Esc - - - - - - - - - - - - - Caps - Lock - - - - Caps - Lock - - - - text - - - - Shift - - Shift - - - - Shift - - Shift - - - information - - - - - - - - - - - - - 0 - 1000 - 000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 000 - - - - - - - - - - - - - 000 - - - - - - - - - - - - - - - - - - - - <img xmlns="http://www.w3.org/1999/xhtml" id="img" src="https://thumbs.gfycat.com/ImpoliteSoupyKakapo-size_restricted.gif" width="100%" height="80%" /> <a xmlns="http://www.w3.org/1999/xhtml" href='www.gmail.com'>Gmail</a> <p xmlns="http://www.w3.org/1999/xhtml">Koj kurac to ne dela</p> - -