@webwriter/flowchart
Version:
Create programming flowcharts with interactive tasks. Use standardized Elements such as loops and Branchings.
451 lines (406 loc) • 21.2 kB
text/typescript
import { FlowchartWidget } from "../../..";
import { localized, msg } from "@lit/localize"
// Funktion zum Zeichnen von Schaltflächenelementen
export function drawButton(element: string, menu: 'flow' | 'tool' | 'task' | 'help' | 'translate', msg1: (template: string) => string ) {
// Funktion zum übersichtlichen setzen der Attribute der SVG Grafiken
function setAttributeList(element: SVGElement, attributes: { [key: string]: string }): void {
for (const key in attributes) {
element.setAttribute(key, attributes[key]);
}
}
// Setze die Maße für das Parent SVG Element und das Text Element in Abhängigkeit vom Menü
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');
switch (menu) {
case 'flow':
setAttributeList(svg, {
width: '130',
height: '55',
viewBox: '0 0 130 55',
});
setAttributeList(text, {
x: '65',
y: '35',
fill: 'white',
'text-anchor': 'middle',
'font-size': '13',
'font-family': 'Arial',
});
svg.appendChild(text);
break;
case 'tool':
setAttributeList(svg, {
width: '40',
height: '30',
});
break;
case 'task':
setAttributeList(svg, {
width: '240',
height: '30',
});
break;
case 'help':
case 'translate':
setAttributeList(svg, {
width: '140',
height: '30',
});
break;
default:
console.log('Unbekanntes Menü');
}
switch (element) {
case 'start':
case 'end':
const terminal = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
setAttributeList(terminal, {
x: '15',
y: '15',
width: '100',
height: '30',
rx: '15',
ry: '15',
fill: 'none',
stroke: 'white',
'stroke-width': '2',
});
svg.appendChild(terminal);
element === 'start' ? (text.textContent = msg(FlowchartWidget.labels["start"])) : (text.textContent = msg(FlowchartWidget.labels["end"]));
break;
case 'op':
const operation = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
setAttributeList(operation, {
x: '15',
y: '15',
width: '100',
height: '30',
fill: 'none',
stroke: 'white',
'stroke-width': '2',
});
svg.appendChild(operation);
text.textContent = msg(FlowchartWidget.labels["op"]);
break;
case 'decision':
const decision = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
setAttributeList(decision, {
points: '65,5 125,27 65,50 5,27',
fill: 'none',
stroke: 'white',
'stroke-width': '2',
});
svg.appendChild(decision);
text.textContent = msg(FlowchartWidget.labels["decision"]);
text.setAttribute('y', '32');
break;
case 'connector':
const connector = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
setAttributeList(connector, {
cx: '65',
cy: '24',
r: '8',
fill: 'none',
stroke: 'white',
'stroke-width': '2',
});
svg.appendChild(connector);
text.textContent = msg(FlowchartWidget.labels["connector"]);
text.setAttribute('y', '50');
break;
case 'i/o':
const io = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
const offsetX = 6;
const offsetY = 15;
const width = 115;
const height = 30;
const skewX = 20;
const points = [
offsetX + skewX,
offsetY,
offsetX + width,
offsetY,
offsetX + width - skewX,
offsetY + height,
offsetX,
offsetY + height,
].join(',');
setAttributeList(io, {
points: points,
fill: 'none',
stroke: 'white',
'stroke-width': '2',
});
svg.appendChild(io);
text.textContent = msg(FlowchartWidget.labels["i/o"]);
break;
case 'sub':
const sub = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
setAttributeList(sub, {
x: '7',
y: '15',
width: '114',
height: '30',
fill: 'none',
stroke: 'white',
'stroke-width': '2',
});
svg.appendChild(sub);
const lineL = document.createElementNS('http://www.w3.org/2000/svg', 'line');
setAttributeList(lineL, {
x1: '12',
y1: '15',
x2: '12',
y2: '45',
stroke: 'white',
'stroke-width': '2',
});
svg.appendChild(lineL);
const lineR = document.createElementNS('http://www.w3.org/2000/svg', 'line');
setAttributeList(lineR, {
x1: '116',
y1: '15',
x2: '116',
y2: '45',
stroke: 'white',
'stroke-width': '2',
});
svg.appendChild(lineR);
text.textContent = msg(FlowchartWidget.labels["sub"]);
text.setAttribute('x', '63');
break;
case 'text':
text.textContent = msg(FlowchartWidget.labels["text"]);
break;
// Tool Menü
case 'grab':
const scaleGrab = 0.05;
const grabX = 115;
const grabY = 45;
const hand = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(hand, {
d: 'M408.864 79.052c-22.401-33.898-66.108-42.273-98.813-23.588-29.474-31.469-79.145-31.093-108.334-.022-47.16-27.02-108.71 5.055-110.671 60.806C44.846 105.407 0 140.001 0 187.429v56.953c0 32.741 14.28 63.954 39.18 85.634l97.71 85.081c4.252 3.702 3.11 5.573 3.11 32.903 0 17.673 14.327 32 32 32h252c17.673 0 32-14.327 32-32 0-23.513-1.015-30.745 3.982-42.37l42.835-99.656c6.094-14.177 9.183-29.172 9.183-44.568V146.963c0-52.839-54.314-88.662-103.136-67.911zM464 261.406a64.505 64.505 0 0 1-5.282 25.613l-42.835 99.655c-5.23 12.171-7.883 25.04-7.883 38.25V432H188v-10.286c0-16.37-7.14-31.977-19.59-42.817l-97.71-85.08C56.274 281.255 48 263.236 48 244.381v-56.953c0-33.208 52-33.537 52 .677v41.228a16 16 0 0 0 5.493 12.067l7 6.095A16 16 0 0 0 139 235.429V118.857c0-33.097 52-33.725 52 .677v26.751c0 8.836 7.164 16 16 16h7c8.836 0 16-7.164 16-16v-41.143c0-33.134 52-33.675 52 .677v40.466c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16v-27.429c0-33.03 52-33.78 52 .677v26.751c0 8.836 7.163 16 16 16h7c8.837 0 16-7.164 16-16 0-33.146 52-33.613 52 .677v114.445z',
fill: 'white',
stroke: 'white',
'stroke-width': '0.1',
transform: `scale(${scaleGrab}) translate(${grabX} ${grabY})`,
});
svg.appendChild(hand);
break;
case 'select':
const scaleSelect = 0.05;
const selectX = 280;
const selectY = 45;
const select = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(select, {
d: 'M318.4 304.5c-3.531 9.344-12.47 15.52-22.45 15.52h-105l45.15 94.82c9.496 19.94 1.031 43.8-18.91 53.31c-19.95 9.504-43.82 1.035-53.32-18.91L117.3 351.3l-75 88.25c-4.641 5.469-11.37 8.453-18.28 8.453c-2.781 0-5.578-.4844-8.281-1.469C6.281 443.1 0 434.1 0 423.1V56.02c0-9.438 5.531-18.03 14.12-21.91C22.75 30.26 32.83 31.77 39.87 37.99l271.1 240C319.4 284.6 321.1 295.1 318.4 304.5z',
fill: 'white',
stroke: 'white',
'stroke-width': '0.1',
transform: `scale(${scaleSelect}) translate(${selectX} ${selectY})`,
});
svg.appendChild(select);
break;
case 'delete':
const scaleDelete = 0.74;
const deleteX = 7;
const deleteY = 1;
const bin = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(bin, {
d: 'M28,40H11.8c-3.3,0-5.9-2.7-5.9-5.9V16c0-0.6,0.4-1,1-1s1,0.4,1,1v18.1c0,2.2,1.8,3.9,3.9,3.9H28c2.2,0,3.9-1.8,3.9-3.9V16 c0-0.6,0.4-1,1-1s1,0.4,1,1v18.1C33.9,37.3,31.2,40,28,40z',
fill: 'white',
stroke: 'white',
'stroke-width': '1',
transform: `scale(${scaleDelete}) translate(${deleteX} ${deleteY})`,
});
const lid = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(lid, {
d: 'M33.3,4.9h-7.6C25.2,2.1,22.8,0,19.9,0s-5.3,2.1-5.8,4.9H6.5c-2.3,0-4.1,1.8-4.1,4.1S4.2,13,6.5,13h26.9 c2.3,0,4.1-1.8,4.1-4.1S35.6,4.9,33.3,4.9z M19.9,2c1.8,0,3.3,1.2,3.7,2.9h-7.5C16.6,3.2,18.1,2,19.9,2z M33.3,11H6.5 c-1.1,0-2.1-0.9-2.1-2.1c0-1.1,0.9-2.1,2.1-2.1h26.9c1.1,0,2.1,0.9,2.1,2.1C35.4,10.1,34.5,11,33.3,11z',
fill: 'white',
stroke: 'white',
'stroke-width': '1',
transform: `scale(${scaleDelete}) translate(${deleteX} ${deleteY})`,
});
const line = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(line, {
d: 'M12.9,35.1c-0.6,0-1-0.4-1-1V17.4c0-0.6,0.4-1,1-1s1,0.4,1,1v16.7C13.9,34.6,13.4,35.1,12.9,35.1z',
fill: 'white',
stroke: 'white',
'stroke-width': '1',
transform: `scale(${scaleDelete}) translate(${deleteX} ${deleteY})`,
});
const line2 = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(line2, {
d: 'M26.9,35.1c-0.6,0-1-0.4-1-1V17.4c0-0.6,0.4-1,1-1s1,0.4,1,1v16.7C27.9,34.6,27.4,35.1,26.9,35.1z',
fill: 'white',
stroke: 'white',
'stroke-width': '1',
transform: `scale(${scaleDelete}) translate(${deleteX} ${deleteY})`,
});
const line3 = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(line3, {
d: 'M19.9,35.1c-0.6,0-1-0.4-1-1V17.4c0-0.6,0.4-1,1-1s1,0.4,1,1v16.7C20.9,34.6,20.4,35.1,19.9,35.1z',
fill: 'white',
stroke: 'white',
'stroke-width': '1',
transform: `scale(${scaleDelete}) translate(${deleteX} ${deleteY})`,
});
svg.appendChild(bin);
svg.appendChild(lid);
svg.appendChild(line);
svg.appendChild(line2);
svg.appendChild(line3);
break;
case 'translate':
const scaleTranslate = 0.85;
const translateX = 10;
const translateY = 4;
const rightArrow = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(rightArrow, {
d: 'M28.75,17.77671a1.24991,1.24991,0,0,0-1.25,1.25,2.73109,2.73109,0,0,1-2.67578,2.77734H9.122l3.48254-3.57227a1.25,1.25,0,0,0-1.78906-1.74609L5.2627,22.181a1.25046,1.25046,0,0,0,0,1.7461l5.55273,5.69531a1.25,1.25,0,1,0,1.78906-1.7461L9.122,24.30405H24.8418c.00653,0,.0119-.00366.01837-.00366A5.23207,5.23207,0,0,0,30,19.02671,1.24991,1.24991,0,0,0,28.75,17.77671Z',
fill: 'white',
stroke: 'white',
'stroke-width': '0.1',
transform: `scale(${scaleTranslate}) translate(${translateX} ${translateY})`,
});
const leftArrow = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(leftArrow, {
d: 'M20.87805,8.19467l-3.48254,3.57227A1.25,1.25,0,1,0,19.18457,13.513L24.7373,7.81772a1.25045,1.25045,0,0,0,0-1.74609L19.18457.37631a1.25,1.25,0,1,0-1.78906,1.7461l3.48254,3.57226H5.1582c-.00653,0-.0119.00367-.01837.00367A5.23207,5.23207,0,0,0,0,10.972a1.25,1.25,0,0,0,2.5,0A2.7311,2.7311,0,0,1,5.17578,8.19467Z',
fill: 'white',
stroke: 'white',
'stroke-width': '0.1',
transform: `scale(${scaleTranslate}) translate(${translateX} ${translateY})`,
});
svg.appendChild(rightArrow);
svg.appendChild(leftArrow);
break;
case 'preset':
const scalePreset = 0.85;
const presetX = 5;
const presetY = 2;
const chart = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(chart, {
d: 'M24,10h4a2,2,0,0,0,2-2V4a2,2,0,0,0-2-2H24a2,2,0,0,0-2,2V5H19a2,2,0,0,0-2,2v8H14V12a2,2,0,0,0-2-2H4a2,2,0,0,0-2,2v8a2,2,0,0,0,2,2h8a2,2,0,0,0,2-2V17h3v8a2,2,0,0,0,2,2h3v1a2,2,0,0,0,2,2h4a2,2,0,0,0,2-2V24a2,2,0,0,0-2-2H24a2,2,0,0,0-2,2v1H19V17h3v1a2,2,0,0,0,2,2h4a2,2,0,0,0,2-2V14a2,2,0,0,0-2-2H24a2,2,0,0,0-2,2v1H19V7h3V8A2,2,0,0,0,24,10ZM12,20H4V12h8Zm12,4h4v4H24Zm0-10h4v4H24ZM24,4h4V8H24Z',
fill: 'white',
stroke: 'white',
'stroke-width': '0.1',
transform: `scale(${scalePreset}) translate(${presetX} ${presetY})`, // rotate(90, 17, 17)
});
svg.appendChild(chart);
break;
case 'help':
const scaleHelp = 0.06;
const helpX = 85;
const helpY = 0;
const curve = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(curve, {
d: 'M345.1,77.1C317.6,56.2,286.6,49,247.3,49c-29.8,0-55.3,6.1-75.5,19.7C142,89,128,123.1,128,177h76.8 c0-14.4-1.4-29.9,7-43.2c8.4-13.3,20.1-23.5,40.2-23.5c20.4,0,30.9,5.9,40.8,18.1c8.4,10.4,11.6,22.8,11.6,36 c0,11.4-5.8,21.9-12.7,31.4c-3.8,5.6-8.8,10.6-15.1,15.4c0,0-41.5,24.7-56.1,48.1c-10.9,17.4-14.8,39.2-15.7,65.3 c-0.1,1.9,0.6,5.8,7.2,5.8c6.5,0,56,0,61.8,0c5.8,0,7-4.4,7.1-6.2c0.4-9.5,1.6-24.1,3.3-29.6c3.3-10.4,9.7-19.5,19.7-27.3 l20.7-14.3c18.7-14.6,33.6-26.5,40.2-35.9c11.3-15.4,19.2-34.4,19.2-56.9C384,123.5,370.5,96.4,345.1,77.1z M242,370.2 c-25.9-0.8-47.3,17.2-48.2,45.3c-0.8,28.2,19.5,46.7,45.5,47.5c27,0.8,47.9-16.6,48.7-44.7C288.8,390.2,269,371,242,370.2z',
fill: 'white',
stroke: 'white',
'stroke-width': '0.1',
transform: `scale(${scaleHelp}) translate(${helpX} ${helpY})`,
});
svg.appendChild(curve);
break;
case 'task':
const scaleTask = 1.5;
const taskX = 1;
const taskY = -1;
const board = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(board, {
d: 'M5 22h14c1.103 0 2-.897 2-2V5c0-1.103-.897-2-2-2h-2a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1H5c-1.103 0-2 .897-2 2v15c0 1.103.897 2 2 2zM5 5h2v2h10V5h2v15H5V5z',
fill: 'white',
stroke: 'white',
'stroke-width': '0.1',
transform: `scale(${scaleTask}) translate(${taskX} ${taskY})`,
});
const check = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(check, {
d: 'm11 13.586-1.793-1.793-1.414 1.414L11 16.414l5.207-5.207-1.414-1.414z',
fill: 'white',
stroke: 'white',
'stroke-width': '0.1',
transform: `scale(${scaleTask}) translate(${taskX} ${taskY})`,
});
svg.appendChild(board);
svg.appendChild(check);
break;
case 'setting':
const scaleSetting = 0.22;
const settingX = 30;
const settingY = 7;
const wheel = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(wheel, {
d: 'M64,39A25,25,0,1,0,89,64,25,25,0,0,0,64,39Zm0,44A19,19,0,1,1,83,64,19,19,0,0,1,64,83Z',
fill: 'white',
stroke: 'white',
'stroke-width': '3',
transform: `scale(${scaleSetting}) translate(${settingX} ${settingY})`,
});
const gear = document.createElementNS('http://www.w3.org/2000/svg', 'path');
setAttributeList(gear, {
d: 'M121,48h-8.93a1,1,0,0,1-.94-.68,49.9,49.9,0,0,0-2-4.85,1,1,0,0,1,.18-1.15L115.62,35a7,7,0,0,0,0-9.9L102.89,12.38a7,7,0,0,0-9.9,0l-6.31,6.31a1,1,0,0,1-1.15.18,49.76,49.76,0,0,0-4.85-2,1,1,0,0,1-.68-.94V7a7,7,0,0,0-7-7H55a7,7,0,0,0-7,7v8.93a1,1,0,0,1-.68.94,49.9,49.9,0,0,0-4.85,2,1,1,0,0,1-1.15-.18L35,12.38a7,7,0,0,0-9.9,0L12.38,25.11a7,7,0,0,0,0,9.9l6.31,6.31a1,1,0,0,1,.18,1.15,49.76,49.76,0,0,0-2,4.85,1,1,0,0,1-.94.68H7a7,7,0,0,0-7,7V73a7,7,0,0,0,7,7h8.93a1,1,0,0,1,.94.68,49.9,49.9,0,0,0,2,4.85,1,1,0,0,1-.18,1.15L12.38,93a7,7,0,0,0,0,9.9l12.73,12.73a7,7,0,0,0,9.9,0l6.31-6.31a1,1,0,0,1,1.15-.18,49.76,49.76,0,0,0,4.85,2,1,1,0,0,1,.68.94V121a7,7,0,0,0,7,7H73a7,7,0,0,0,7-7v-8.93a1,1,0,0,1,.68-.94,49.9,49.9,0,0,0,4.85-2,1,1,0,0,1,1.15.18L93,115.62a7,7,0,0,0,9.9,0l12.73-12.73a7,7,0,0,0,0-9.9l-6.31-6.31a1,1,0,0,1-.18-1.15,49.76,49.76,0,0,0,2-4.85,1,1,0,0,1,.94-.68H121a7,7,0,0,0,7-7V55A7,7,0,0,0,121,48Zm1,25a1,1,0,0,1-1,1h-8.93a7,7,0,0,0-6.6,4.69,43.9,43.9,0,0,1-1.76,4.26,7,7,0,0,0,1.35,8l6.31,6.31a1,1,0,0,1,0,1.41L98.65,111.38a1,1,0,0,1-1.41,0l-6.31-6.31a7,7,0,0,0-8-1.35,43.88,43.88,0,0,1-4.27,1.76,7,7,0,0,0-4.68,6.6V121a1,1,0,0,1-1,1H55a1,1,0,0,1-1-1v-8.93a7,7,0,0,0-4.69-6.6,43.9,43.9,0,0,1-4.26-1.76,7,7,0,0,0-8,1.35l-6.31,6.31a1,1,0,0,1-1.41,0L16.62,98.65a1,1,0,0,1,0-1.41l6.31-6.31a7,7,0,0,0,1.35-8,43.88,43.88,0,0,1-1.76-4.27A7,7,0,0,0,15.93,74H7a1,1,0,0,1-1-1V55a1,1,0,0,1,1-1h8.93a7,7,0,0,0,6.6-4.69,43.9,43.9,0,0,1,1.76-4.26,7,7,0,0,0-1.35-8l-6.31-6.31a1,1,0,0,1,0-1.41L29.35,16.62a1,1,0,0,1,1.41,0l6.31,6.31a7,7,0,0,0,8,1.35,43.88,43.88,0,0,1,4.27-1.76A7,7,0,0,0,54,15.93V7a1,1,0,0,1,1-1H73a1,1,0,0,1,1,1v8.93a7,7,0,0,0,4.69,6.6,43.9,43.9,0,0,1,4.26,1.76,7,7,0,0,0,8-1.35l6.31-6.31a1,1,0,0,1,1.41,0l12.73,12.73a1,1,0,0,1,0,1.41l-6.31,6.31a7,7,0,0,0-1.35,8,43.88,43.88,0,0,1,1.76,4.27,7,7,0,0,0,6.6,4.68H121a1,1,0,0,1,1,1Z',
fill: 'white',
stroke: 'white',
'stroke-width': '3',
transform: `scale(${scaleSetting}) translate(${settingX} ${settingY})`,
});
svg.appendChild(wheel);
svg.appendChild(gear);
break;
// Task Menü
case 'addTask':
setAttributeList(text, {
x: '120',
y: '22',
fill: 'white',
'text-anchor': 'middle',
'font-size': '16',
'font-family': 'Arial',
});
text.textContent = msg('Add task');
svg.appendChild(text);
break;
// Help Menü
case 'addHelp':
setAttributeList(text, {
x: '70',
y: '22',
fill: 'white',
'text-anchor': 'middle',
'font-size': '16',
'font-family': 'Arial',
});
text.textContent = msg('Add hint');
svg.appendChild(text);
break;
// Translate Menü
case 'naturalLanguage':
setAttributeList(text, {
x: '70',
y: '22',
fill: 'white',
'text-anchor': 'middle',
'font-size': '16',
'font-family': 'Arial',
});
text.textContent = msg('Natural language');
svg.appendChild(text);
break;
case 'pseudoCode':
setAttributeList(text, {
x: '70',
y: '22',
fill: 'white',
'text-anchor': 'middle',
'font-size': '16',
'font-family': 'Arial',
});
text.textContent = msg('Pseudocode');
svg.appendChild(text);
break;
default:
console.log('Unknown SVG name');
}
return svg;
}