// widget_circularbar.ysl2
widget_desc("CircularBar") {
CircularBar widget changes the end angle of a "path" labeled arc according
to value of the single accepted variable.
If "min" a "max" labeled texts are provided, then they are used as
respective minimum and maximum value. Otherwise, value is expected to be
If "value" labeled text is found, then its content is replaced by value.
shortdesc > Change end angle of Inkscape's arc
// TODO: add min/max arguments
// TODO: add printf-like format
path name="value" accepts="HMI_INT,HMI_REAL" > Value to display
widget_class("CircularBar") {
this.display_val = value;
this.value_elt.textContent = String(this.display_val);
let [min,max,start,end] = this.range;
let [cx,cy] = this.center;
let [rx,ry] = this.proportions;
let tip = start + (end-start)*Number(this.display_val)/(max-min);
this.path_elt.setAttribute('d', "M "+(cx+rx*Math.cos(start))+","+(cy+ry*Math.sin(start))+
" 1 "+(cx+rx*Math.cos(tip))+","+(cy+ry*Math.sin(tip)));
let [start, end, cx, cy, rx, ry] = ["start", "end", "cx", "cy", "rx", "ry"].
map(tag=>Number(this.path_elt.getAttribute('sodipodi:'+tag)))
let [min,max] = [[this.min_elt,0],[this.max_elt,100]].map(([elt,def],i)=>elt?
Number(elt.textContent) :
this.args.length >= i+1 ? this.args[i] : def);
this.range = [min, max, start, end];
this.proportions = [rx, ry];
widget_defs("CircularBar") {
optional_labels("value min max");