Files
architype/Grid.js

208 lines
5.8 KiB
JavaScript
Raw Permalink Normal View History

2019-07-10 22:18:00 +00:00
class Grid {
2019-07-13 22:30:37 +00:00
constructor(container) {
2019-07-10 22:43:29 +00:00
this.container_ = container;
this.container_.classList.add('grid');
this.toSize_ = [];
addEventListener('resize', (e) => { this.onResize(e); });
}
2019-07-13 05:06:48 +00:00
onResize() {
2019-07-10 22:43:29 +00:00
this.fixSizes();
}
draw(steps) {
this.container_.innerHTML = '';
2019-07-13 21:44:51 +00:00
this.toSize_.length = 0;
2019-07-10 22:43:29 +00:00
for (let step of steps) {
switch (step.type) {
case 'size':
this.drawGrid(step.size);
break;
case 'arrow':
this.drawArrow(step.id, step.pos, step.cls);
2019-07-10 22:43:29 +00:00
break;
case 'graphLabel':
2019-07-13 21:44:51 +00:00
this.drawGraphLabel(step.id, step.min, step.max, step.label);
2019-07-10 22:43:29 +00:00
break;
case 'group':
this.drawGroup(step.id, step.min, step.max);
break;
case 'groupLabel':
this.drawGroupLabel(step.id, step.min, step.max, step.label);
2019-07-10 22:43:29 +00:00
break;
case 'line':
this.drawLine(step.id, step.pos, step.cls);
2019-07-10 22:43:29 +00:00
break;
case 'linkLabel':
2019-07-13 21:44:51 +00:00
this.drawLinkLabel(step.id, step.pos, step.label);
2019-07-10 22:43:29 +00:00
break;
case 'node':
2019-07-14 20:44:07 +00:00
this.drawNode(step.id, step.label, step.pos, step.tags);
2019-07-10 22:43:29 +00:00
break;
2019-07-14 22:21:43 +00:00
case 'tagLabel':
this.drawTagLabel(step.id, step.pos, step.label, step.tag);
break;
2019-07-10 22:43:29 +00:00
}
}
this.fixSizes();
}
drawGrid(size) {
this.container_.style.gridTemplateColumns =
'repeat(' + size[0] + ',1fr)';
this.container_.style.gridTemplateRows =
'repeat(' + size[1] +
',minmax(0, calc((100vw - var(--editor-width)) / ' +
size[0] + ')))';
}
drawArrow(id, pos, cls) {
2019-07-10 22:43:29 +00:00
let svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
2019-07-13 22:30:37 +00:00
this.container_.appendChild(svg);
2019-07-10 22:43:29 +00:00
svg.classList.add('gridArrow');
2019-07-13 22:30:37 +00:00
svg.classList.add('grid-' + id);
2019-07-10 22:43:29 +00:00
svg.style.gridColumn = pos[0] + 1;
svg.style.gridRow = pos[1] + 1;
this.linkToEditor(svg, id, false);
2019-07-10 22:43:29 +00:00
let use = document.createElementNS('http://www.w3.org/2000/svg', 'use');
svg.appendChild(use);
use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#' + cls);
}
2019-07-13 21:44:51 +00:00
drawGraphLabel(id, min, max, label) {
2019-07-10 22:43:29 +00:00
let elem = document.createElement('div');
this.container_.appendChild(elem);
elem.classList.add('gridGraphLabel');
2019-07-13 22:30:37 +00:00
elem.classList.add('grid-' + id);
2019-07-10 22:43:29 +00:00
elem.style.gridColumn = (min[0] + 1) + ' / ' + (max[0] + 2);
elem.style.gridRow = (min[1] + 1) + ' / ' + (max[1] + 2);
elem.innerText = label;
this.linkToEditor(elem, id, true);
2019-07-10 22:43:29 +00:00
}
drawGroup(id, min, max) {
2019-07-10 22:43:29 +00:00
let group = document.createElement('div');
this.container_.appendChild(group);
group.classList.add('gridGroup');
2019-07-13 22:30:37 +00:00
group.classList.add('grid-' + id);
2019-07-10 22:43:29 +00:00
group.style.gridColumn = (min[0] + 1) + ' / ' + (max[0] + 2);
group.style.gridRow = (min[1] + 1) + ' / ' + (max[1] + 2);
this.linkToEditor(group, id, false);
}
2019-07-10 22:43:29 +00:00
drawGroupLabel(id, min, max, label) {
let elem = document.createElement('div');
this.container_.appendChild(elem);
elem.classList.add('gridGroupLabel');
elem.classList.add('grid-' + id);
elem.innerText = label;
elem.style.gridColumn = (min[0] + 1) + ' / ' + (max[0] + 2);
elem.style.gridRow = min[1] + 1;
this.linkToEditor(elem, id, true);
2019-07-10 22:43:29 +00:00
}
drawLine(id, pos, cls) {
2019-07-10 22:43:29 +00:00
let svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
2019-07-13 22:30:37 +00:00
this.container_.appendChild(svg);
2019-07-10 22:43:29 +00:00
svg.classList.add('gridLines');
2019-07-13 22:30:37 +00:00
svg.classList.add('grid-' + id);
2019-07-10 22:43:29 +00:00
svg.style.gridColumn = pos[0] + 1;
svg.style.gridRow = pos[1] + 1;
this.linkToEditor(svg, id, false);
2019-07-10 22:43:29 +00:00
let use = document.createElementNS('http://www.w3.org/2000/svg', 'use');
svg.appendChild(use);
use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#' + cls);
}
2019-07-13 21:44:51 +00:00
drawLinkLabel(id, pos, label) {
2019-07-10 22:43:29 +00:00
let elem = document.createElement('div');
this.container_.appendChild(elem);
2019-07-13 22:30:37 +00:00
elem.classList.add('gridLinkLabel');
elem.classList.add('grid-' + id);
2019-07-10 22:43:29 +00:00
elem.innerText = label;
elem.style.gridColumn = pos[0] + 1;
elem.style.gridRow = pos[1] + 1;
this.linkToEditor(elem, id, true);
2019-07-10 22:43:29 +00:00
}
2019-07-14 20:44:07 +00:00
drawNode(id, label, pos, tags) {
2019-07-10 22:43:29 +00:00
let node = document.createElement('div');
this.container_.appendChild(node);
2019-07-13 22:30:37 +00:00
node.classList.add('gridNode');
node.classList.add('grid-' + id);
2019-07-10 22:43:29 +00:00
node.innerText = label;
node.style.gridColumn = pos[0] + 1;
node.style.gridRow = pos[1] + 1;
2019-07-14 20:44:07 +00:00
for (let tag of tags) {
node.classList.add('tag' + tag);
}
this.linkToEditor(node, id, true);
}
2019-07-14 22:21:43 +00:00
drawTagLabel(id, pos, label, tag) {
let elem = document.createElement('div');
this.container_.appendChild(elem);
elem.classList.add('gridTagLabel');
elem.classList.add('grid-' + id);
elem.innerText = label;
elem.style.gridColumn = pos[0] + 1;
elem.style.gridRow = pos[1] + 1;
elem.classList.add('tag' + tag);
this.linkToEditor(elem, id, true);
}
linkToEditor(elem, id, copyLabel) {
let source = document.getElementById(id);
if (!source) {
return;
}
elem.classList.toggle('highlight', source.classList.contains('highlight'));
if (copyLabel) {
elem.innerText = source.xArchObj.getLabel();
elem.xArchFixSize = () => {
this.fixSize(elem);
};
this.toSize_.push(elem);
}
2019-07-11 05:12:08 +00:00
elem.addEventListener('click', () => {
2019-07-11 05:12:08 +00:00
let editorElem = document.getElementById(id);
if (!editorElem) {
return;
}
editorElem.xArchObj.toggleHighlight();
editorElem.focus();
2019-07-11 05:12:08 +00:00
});
2019-07-10 22:43:29 +00:00
}
fixSize(elem) {
elem.style.fontSize = null;
for (let size = 30;
size && (elem.scrollWidth > elem.clientWidth ||
elem.scrollHeight > elem.clientHeight);
--size) {
elem.style.fontSize = size + 'px';
}
}
2019-07-10 22:43:29 +00:00
fixSizes() {
for (let node of this.toSize_) {
node.xArchFixSize();
2019-07-10 22:43:29 +00:00
}
}
2019-07-10 22:18:00 +00:00
}