67 |
67 |
}
|
68 |
68 |
}, this);
|
69 |
69 |
|
|
70 |
var vertexRelatedArchetypeMap = vertex.getRelatedArchetypeMap();
|
|
71 |
for (var archetypeIndex in vertexRelatedArchetypeMap) {
|
|
72 |
if (!relatedArchetypeMap.hasOwnProperty(archetypeIndex)) {
|
|
73 |
relatedArchetypeMap[archetypeIndex] = 0;
|
|
74 |
}
|
|
75 |
|
|
76 |
relatedArchetypeMap[archetypeIndex] += vertexRelatedArchetypeMap[archetypeIndex];
|
|
77 |
}
|
|
78 |
|
70 |
79 |
app.viewportComponent.removeVertex(vertex);
|
71 |
80 |
|
72 |
81 |
if (rootElement) {
|
... | ... | |
95 |
104 |
edge.moveStart(this.getCenter());
|
96 |
105 |
}, vertex);
|
97 |
106 |
|
|
107 |
var vertexRelatedArchetypeMap = vertex.getRelatedArchetypeMap();
|
|
108 |
for (var archetypeIndex in vertexRelatedArchetypeMap) {
|
|
109 |
relatedArchetypeMap[archetypeIndex] -= vertexRelatedArchetypeMap[archetypeIndex];
|
|
110 |
}
|
|
111 |
|
98 |
112 |
app.viewportComponent.addVertex(vertex);
|
99 |
113 |
|
100 |
114 |
if (rootElement) {
|
... | ... | |
570 |
584 |
var svg = app.utils.createSvgElement('svg', {
|
571 |
585 |
'xmlns': 'http://www.w3.org/2000/svg',
|
572 |
586 |
'height': 60,
|
573 |
|
'width': 40,
|
|
587 |
'width': 46,
|
574 |
588 |
});
|
575 |
589 |
rootElement.appendChild(svg);
|
576 |
590 |
|
577 |
|
var group = app.utils.createSvgElement('g', {
|
578 |
|
'transform': 'translate(60,10)',
|
|
591 |
// related archetypes
|
|
592 |
var relatedArchetypesGroup = app.dom.createSvgElement('g', {
|
|
593 |
'transform': 'translate(10, 15)',
|
579 |
594 |
});
|
580 |
|
svg.appendChild(group);
|
581 |
|
|
582 |
|
/*
|
583 |
|
// required
|
584 |
|
var required = app.utils.createSvgElement('g', {
|
585 |
|
'class': 'required-counter',
|
586 |
|
});
|
587 |
|
required.addEventListener('click', requiredClick.bind(this));
|
588 |
|
group.appendChild(required);
|
589 |
|
|
590 |
|
required.appendChild(app.utils.createSvgElement('line', {
|
591 |
|
'x1': -60,
|
592 |
|
'y1': 5,
|
593 |
|
'x2': -50,
|
594 |
|
'y2': 5,
|
595 |
|
'stroke': 'black',
|
596 |
|
'class': 'outer-floater',
|
597 |
|
}));
|
598 |
|
required.appendChild(app.utils.createSvgElement('line', {
|
599 |
|
'x1': -30,
|
600 |
|
'y1': 5,
|
601 |
|
'x2': -20,
|
602 |
|
'y2': 5,
|
603 |
|
'stroke': 'black',
|
604 |
|
}));
|
605 |
|
required.appendChild(app.utils.createSvgElement('path', {
|
606 |
|
'class': 'lollipop',
|
607 |
|
'd': 'M-42,-5 C-27,-5 -27,15 -42,15',
|
608 |
|
}));
|
|
595 |
svg.appendChild(relatedArchetypesGroup);
|
609 |
596 |
|
610 |
|
var requiredCounterText = app.utils.createSvgElement('text', {
|
611 |
|
'x': -45,
|
612 |
|
'y': 10,
|
613 |
|
});
|
614 |
|
requiredCounterText.appendChild(document.createTextNode(requiredCounter));
|
615 |
|
required.appendChild(requiredCounterText);
|
|
597 |
var archetypeIconOrder = 0;
|
|
598 |
for (var archetypeIndex in relatedArchetypeMap) {
|
|
599 |
var relatedArchetype = app.dom.createSvgElement('g', {
|
|
600 |
'class': 'related-archetype',
|
|
601 |
'transform': `translate(0, ${archetypeIconOrder * 20})`,
|
|
602 |
});
|
|
603 |
relatedArchetypesGroup.appendChild(relatedArchetype);
|
616 |
604 |
|
617 |
|
// provided
|
618 |
|
var provided = app.utils.createSvgElement('g', {
|
619 |
|
'class': 'provided-counter',
|
620 |
|
});
|
621 |
|
provided.addEventListener('click', providedClick.bind(this));
|
622 |
|
group.appendChild(provided);
|
623 |
|
|
624 |
|
provided.appendChild(app.utils.createSvgElement('line', {
|
625 |
|
'x1': -60,
|
626 |
|
'y1': 35,
|
627 |
|
'x2': -50,
|
628 |
|
'y2': 35,
|
629 |
|
'stroke': 'black',
|
630 |
|
'class': 'outer-floater',
|
631 |
|
}));
|
632 |
|
provided.appendChild(app.utils.createSvgElement('line', {
|
633 |
|
'x1': -30,
|
634 |
|
'y1': 35,
|
635 |
|
'x2': -20,
|
636 |
|
'y2': 35,
|
637 |
|
'stroke': 'black',
|
638 |
|
}));
|
639 |
|
provided.appendChild(app.utils.createSvgElement('circle', {
|
640 |
|
'class': 'lollipop',
|
641 |
|
'cx': -42,
|
642 |
|
'cy': 35,
|
643 |
|
'r': 11,
|
644 |
|
}));
|
|
605 |
// counter
|
|
606 |
var relatedArchetypeCounter = app.dom.createSvgElement('text', {});
|
|
607 |
relatedArchetypeCounter.appendChild(app.dom.createTextElement(relatedArchetypeMap[archetypeIndex]));
|
|
608 |
relatedArchetype.appendChild(relatedArchetypeCounter);
|
645 |
609 |
|
646 |
|
var providedCounterText = app.utils.createSvgElement('text', {
|
647 |
|
'x': -45,
|
648 |
|
'y': 40,
|
649 |
|
});
|
650 |
|
providedCounterText.appendChild(document.createTextNode(providedCounter));
|
651 |
|
provided.appendChild(providedCounterText);
|
652 |
|
*/
|
|
610 |
// icon
|
|
611 |
var relatedArchetypeIcon = app.dom.createSvgElement('g', {
|
|
612 |
'class': 'archetype-icon',
|
|
613 |
'transform': `translate(15, -10)`,
|
|
614 |
});
|
|
615 |
relatedArchetypeIcon.addEventListener('click', relatedArchetypeClick.bind(this, parseInt(archetypeIndex)));
|
|
616 |
relatedArchetypeIcon.innerHTML = app.archetype.icon[app.archetype.vertex[archetypeIndex].name];
|
|
617 |
relatedArchetype.appendChild(relatedArchetypeIcon);
|
|
618 |
|
|
619 |
// line
|
|
620 |
relatedArchetype.appendChild(app.dom.createSvgElement('line', {
|
|
621 |
'x1': 30,
|
|
622 |
'y1': -5,
|
|
623 |
'x2': 36,
|
|
624 |
'y2': -5,
|
|
625 |
}));
|
|
626 |
|
|
627 |
archetypeIconOrder++;
|
|
628 |
}
|
653 |
629 |
|
654 |
630 |
// symbol
|
655 |
631 |
var symbolText = app.utils.createHtmlElement('span', {
|
... | ... | |
812 |
788 |
app.viewportComponent.removeGroup(this);
|
813 |
789 |
}
|
814 |
790 |
|
|
791 |
/**
|
|
792 |
* Archetype icon click interaction. Toggles highlighting of neighbour vertices which are instances of a vertex archetype.
|
|
793 |
* @param {integer} archetypeIndex Index of the vertex archetype.
|
|
794 |
* @param {MouseEvent} e Click event.
|
|
795 |
*/
|
|
796 |
function relatedArchetypeClick(archetypeIndex, e) {
|
|
797 |
e.stopPropagation();
|
|
798 |
|
|
799 |
this.setHighlighted(!highlighted);
|
|
800 |
this.setHighlightedArchetypeNeighbours(highlighted);
|
|
801 |
|
|
802 |
prepareHighlighting.call(this);
|
|
803 |
highlightArchetypeNeighbours.call(this, archetypeIndex);
|
|
804 |
}
|
|
805 |
|
815 |
806 |
/**
|
816 |
807 |
* Handles drag and drop interaction with the group. At the moment mouse button is pressed, it is not yet known whether
|
817 |
808 |
* it is just clicked or dragged.
|
... | ... | |
957 |
948 |
*/
|
958 |
949 |
function highlightArchetypeNeighbours(archetypeIndex) {
|
959 |
950 |
if (highlightedArchetypeNeighbours === false) return;
|
|
951 |
|
|
952 |
this.getInEdgeList().filter(function(edge) {
|
|
953 |
return edge.getFrom().archetype === archetypeIndex;
|
|
954 |
}).forEach(function(edge) {
|
|
955 |
edge.setHidden(false);
|
|
956 |
|
|
957 |
edge.setDimmed(false);
|
|
958 |
edge.getFrom().setDimmed(false);
|
|
959 |
|
|
960 |
edge.getFrom().setHighlightedArchetype(true);
|
|
961 |
});
|
|
962 |
|
|
963 |
this.getOutEdgeList().filter(function(edge) {
|
|
964 |
return edge.getTo().archetype === archetypeIndex;
|
|
965 |
}).forEach(function(edge) {
|
|
966 |
edge.setHidden(false);
|
|
967 |
|
|
968 |
edge.setDimmed(false);
|
|
969 |
edge.getTo().setDimmed(false);
|
|
970 |
|
|
971 |
edge.getTo().setHighlightedArchetype(true);
|
|
972 |
});
|
960 |
973 |
}
|
961 |
974 |
}
|
excluded Group related archetypes highlighting