in frontend/src/lib/cytoscape-cxtmenu/cxtmenu.js [151:209]
function drawBg(radius, rspotlight) {
rspotlight = rspotlight !== undefined ? rspotlight : rs;
c2d.globalCompositeOperation = 'source-over';
c2d.clearRect(0, 0, containerSize, containerSize);
// draw background items
c2d.fillStyle = options.fillColor;
const dtheta = 2 * Math.PI / (commands.length);
let theta1 = Math.PI / 2;
let theta2 = theta1 + dtheta;
for (let index = 0; index < commands.length; index++) {
const command = commands[index];
if (command.fillColor) {
c2d.fillStyle = command.fillColor;
}
c2d.beginPath();
c2d.moveTo(radius + options.activePadding, radius + options.activePadding);
c2d.arc(radius + options.activePadding, radius + options.activePadding, radius, 2 * Math.PI - theta1, 2 * Math.PI - theta2, true);
c2d.closePath();
c2d.fill();
theta1 += dtheta;
theta2 += dtheta;
c2d.fillStyle = options.fillColor;
}
// draw separators between items
c2d.globalCompositeOperation = 'destination-out';
c2d.strokeStyle = 'white';
c2d.lineWidth = options.separatorWidth;
theta1 = Math.PI / 2;
theta2 = theta1 + dtheta;
for (let i = 0; i < commands.length; i++) {
const rx1 = radius * Math.cos(theta1);
const ry1 = radius * Math.sin(theta1);
c2d.beginPath();
c2d.moveTo(radius + options.activePadding, radius + options.activePadding);
c2d.lineTo(radius + options.activePadding + rx1, radius + options.activePadding - ry1);
c2d.closePath();
c2d.stroke();
theta1 += dtheta;
theta2 += dtheta;
}
c2d.fillStyle = 'white';
c2d.globalCompositeOperation = 'destination-out';
c2d.beginPath();
c2d.arc(radius + options.activePadding, radius + options.activePadding, rspotlight + options.spotlightPadding, 0, Math.PI * 2, true);
c2d.closePath();
c2d.fill();
c2d.globalCompositeOperation = 'source-over';
}