/** * Contains reusable function for drawing nodes. */ module.exports = (function (){ var tools = {}; /** * Append a circular class node with the passed attributes. * @param parent the parent element to which the circle will be appended * @param radius * @param [cssClasses] an array of additional css classes * @param [tooltip] * @param [backgroundColor] * @returns {*} */ tools.appendCircularClass = function ( parent, radius, cssClasses, tooltip, backgroundColor ){ var circle = parent.append("circle") .classed("class", true) .attr("r", radius); addCssClasses(circle, cssClasses); addToolTip(circle, tooltip); addBackgroundColor(circle, backgroundColor); return circle; }; function addCssClasses( element, cssClasses ){ if ( cssClasses instanceof Array ) { cssClasses.forEach(function ( cssClass ){ element.classed(cssClass, true); }); } } function addToolTip( element, tooltip ){ if ( tooltip ) { element.append("title").text(tooltip); } } function addBackgroundColor( element, backgroundColor ){ if ( backgroundColor ) { element.style("fill", backgroundColor); } } /** * Appends a rectangular class node with the passed attributes. * @param parent the parent element to which the rectangle will be appended * @param width * @param height * @param [cssClasses] an array of additional css classes * @param [tooltip] * @param [backgroundColor] * @returns {*} */ tools.appendRectangularClass = function ( parent, width, height, cssClasses, tooltip, backgroundColor ){ var rectangle = parent.append("rect") .classed("class", true) .attr("x", -width / 2) .attr("y", -height / 2) .attr("width", width) .attr("height", height); addCssClasses(rectangle, cssClasses); addToolTip(rectangle, tooltip); addBackgroundColor(rectangle, backgroundColor); return rectangle; }; tools.drawPin = function ( container, dx, dy, onClick, accuraciesHelperFunction, useAccuracyHelper ){ var pinGroupElement = container .append("g") .classed("hidden-in-export", true) .attr("transform", "translate(" + dx + "," + dy + ")"); var base = pinGroupElement.append("circle") .classed("class pin feature", true) .attr("r", 12) .on("click", function (){ if ( onClick ) { onClick(); } d3.event.stopPropagation(); }); pinGroupElement.append("line") .attr("x1", 0) .attr("x2", 0) .attr("y1", 12) .attr("y2", 16); if ( useAccuracyHelper === true ) { pinGroupElement.append("circle") .attr("r", 15) .attr("cx", -7) .attr("cy", -7) .classed("superHiddenElement ", true) .classed("superOpacityElement", !accuraciesHelperFunction()) .on("click", function (){ if ( onClick ) { onClick(); } d3.event.stopPropagation(); }) .on("mouseover", function (){ base.classed("feature_hover", true); }) .on("mouseout", function (){ base.classed("feature_hover", false); }) ; } return pinGroupElement; }; tools.drawRectHalo = function ( node, width, height, offset ){ var container; if ( node.nodeElement ) container = node.nodeElement(); else container = node.labelElement(); if ( !container ) { // console.log("no container found"); return; } var haloGroupElement = container .append("g") .classed("hidden-in-export", true); haloGroupElement.append("rect") .classed("searchResultA", true) .attr("x", (-width - offset) / 2) .attr("y", (-offset - height) / 2) .attr("width", width + offset) .attr("height", height + offset); haloGroupElement.attr("animationRunning", true); haloGroupElement.node().addEventListener("webkitAnimationEnd", function (){ var test = haloGroupElement.selectAll(".searchResultA"); test.classed("searchResultA", false) .classed("searchResultB", true); haloGroupElement.attr("animationRunning", false); }); haloGroupElement.node().addEventListener("animationend", function (){ var test = haloGroupElement.selectAll(".searchResultA"); test.classed("searchResultA", false) .classed("searchResultB", true); haloGroupElement.attr("animationRunning", false); }); return haloGroupElement; }; tools.drawHalo = function ( container, radius ){ if ( container === undefined ) { return null; // there is no element to add the halo to; // this means the node was not rendered previously } var haloGroupElement = container .append("g") .classed("hidden-in-export", true); haloGroupElement.append("circle", ":first-child") .classed("searchResultA", true) .attr("r", radius + 15); haloGroupElement.attr("animationRunning", true); haloGroupElement.node().addEventListener("webkitAnimationEnd", function (){ var test = haloGroupElement.selectAll(".searchResultA"); test.classed("searchResultA", false) .classed("searchResultB", true) .attr("animationRunning", false); haloGroupElement.attr("animationRunning", false); }); haloGroupElement.node().addEventListener("animationend", function (){ var test = haloGroupElement.selectAll(".searchResultA"); test.classed("searchResultA", false) .classed("searchResultB", true) .attr("animationRunning", false); haloGroupElement.attr("animationRunning", false); }); return haloGroupElement; }; return function (){ // Encapsulate into function to maintain default.module.path() return tools; }; })();