tnt.board
Version:
TnT track-based board display
85 lines (74 loc) • 2.35 kB
JavaScript
var spinner = function () {
// var n = 0;
var sp_elem;
var sp = {};
sp.on = function () {
var track = this;
if (!track.spinner) {
track.spinner = 1;
} else {
track.spinner++;
}
if (track.spinner==1) {
var container = track.g;
var bgColor = track.color();
sp_elem = container
.append("svg")
.attr("class", "tnt_spinner")
.attr("width", "30px")
.attr("height", "30px")
.attr("xmls", "http://www.w3.org/2000/svg")
.attr("viewBox", "0 0 100 100")
.attr("preserveAspectRatio", "xMidYMid");
sp_elem
.append("rect")
.attr("x", '0')
.attr("y", '0')
.attr("width", "100")
.attr("height", "100")
.attr("rx", '50')
.attr("ry", '50')
.attr("fill", bgColor);
//.attr("opacity", 0.6);
for (var i=0; i<12; i++) {
tick(sp_elem, i, bgColor);
}
} else if (track.spinner>0){
// Move the spinner to front
var node = sp_elem.node();
if (node.parentNode) {
node.parentNode.appendChild(node);
}
}
};
sp.off = function () {
var track = this;
track.spinner--;
if (!track.spinner) {
var container = track.g;
container.selectAll(".tnt_spinner")
.remove();
}
};
function tick (elem, i, bgColor) {
elem
.append("rect")
.attr("x", "46.5")
.attr("y", '40')
.attr("width", "7")
.attr("height", "20")
.attr("rx", "5")
.attr("ry", "5")
.attr("fill", d3.rgb(bgColor).darker(2))
.attr("transform", "rotate(" + (360/12)*i + " 50 50) translate(0 -30)")
.append("animate")
.attr("attributeName", "opacity")
.attr("from", "1")
.attr("to", "0")
.attr("dur", "1s")
.attr("begin", (1/12)*i + "s")
.attr("repeatCount", "indefinite");
}
return sp;
};
module.exports = exports = spinner;