_renderInteractionLayer()

in showcases/graph/app.js [277:345]


  _renderInteractionLayer(viewport, hovered, clicked) {
    // set flags used below to determine if SVG highlight elements should be rendered.
    // if truthy, each flag is replaced with the corresponding element to render.
    const elements = {
      hovered: hovered && hovered.object,
      clicked: clicked && clicked.object
    };
    const relatedElements = {
      hovered: hovered && hovered.relatedObjects,
      clicked: clicked && clicked.relatedObjects
    };
    const elementInfo = {
      hovered: hovered && hovered.object,
      clicked: clicked && clicked.object
    };

    // process related elements first, since they compare themselves to the focused elements.
    // related elements are:
    // - all links and nodes attached to a node; or
    // - the nodes at each end of a link.
    // see `graph-layout-layer::getPickingInfo()` for more information.
    Object.keys(relatedElements).forEach(k => {
      const els = relatedElements[k];
      if (!els || !els.length) {
        relatedElements[k] = null;
      } else {
        relatedElements[k] = [];
        els.forEach(el => {
          relatedElements[k].push(this._renderInteractionElement(el, `related ${k}`, viewport));
        });
      }
    });

    // process the focused (hovered / clicked) elements
    Object.keys(elements).forEach(k => {
      const el = elements[k];
      elements[k] = el ? this._renderInteractionElement(el, k, viewport) : null;
    });

    // render additional info about the focused elements (only nodes, not links)
    Object.keys(elementInfo).forEach(k => {
      const el = elementInfo[k];
      if (el && el.name) {
        elementInfo[k] = (
          <text x={el.x} y={el.y} dx={this._getNodeSize(el) + 10} dy={-10}>
            {el.name}
          </text>
        );
      } else {
        elementInfo[k] = null;
      }
    });

    // Note: node.x/y, calculated by d3 layout,
    // is measured from the center of the layout (of the viewport).
    // Therefore, we offset the <g> container to align.
    return (
      <svg width={viewport.width} height={viewport.height} className="interaction-overlay">
        <g transform={`translate(${viewport.width / 2},${viewport.height / 2})`}>
          {relatedElements.hovered}
          {elements.hovered}
          {relatedElements.clicked}
          {elements.clicked}
          {elementInfo.hovered}
          {elementInfo.clicked}
        </g>
      </svg>
    );
  }