/*\
title: $:/plugins/tiddlywiki/d3/CirclePackWidget.js
D3.js version: V5 plugin
type: application/javascript
module-type: widget
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var Widget = require("$:/core/modules/widgets/widget.js").widget,
d3 = require("$:/plugins/tiddlywiki/d3/d3.js");
var CirclePackWidget = function(parseTreeNode,options) {
this.initialise(parseTreeNode,options);
};
/*
Inherit from the base widget class
*/
CirclePackWidget.prototype = new Widget();
/*
Render this widget into the DOM
*/
CirclePackWidget.prototype.render = function(parent,nextSibling) {
var self = this; //added by BurningTreeC
// Save the parent dom node
this.parentDomNode = parent;
// Compute our attributes
this.computeAttributes();
// Execute our logic
this.execute();
// Create the chart
var chart = this.createChart(parent,nextSibling);
this.updateChart = chart.updateChart;
if(this.updateChart) {
this.updateChart();
}
// Insert the chart into the DOM and render any children
parent.insertBefore(chart.domNode,nextSibling);
this.domNodes.push(chart.domNode);
};
CirclePackWidget.prototype.createChart = function(parent,nextSibling) {
var self = this; //added by BurningTreeC
// Get the data we're plotting
var root = this.wiki.getTiddlerData(this.myDataTiddler);
// Create SVG element
var margin = {top: 20, right: 10, bottom: 20, left: 10},
width = 800 - margin.left - margin.right,
height = 800 - margin.top - margin.bottom;
var svg = d3.select(parent).insert("svg",function() {return nextSibling;})
.attr("viewBox", "0 0 800 800")
.attr("preserveAspectRatio", "xMinYMin meet")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom);
var diameter = +svg.attr("width"),
g = svg.append("g").attr("transform", "translate(2,2)"),
format = d3.format(",d");
var pack = d3.pack()
.size([diameter - 4, diameter - 4]);
var monAction ="";
root = d3.hierarchy(root)
.sum(function(d) { return d.size; })
.sort(function(a, b) { return b.value - a.value; });
var node = g.selectAll(".node")
.data(pack(root).descendants())
.enter().append("g")
// .attr("class", function(d) { return d.children ? "node" : "leaf node"; })
.attr("fill", function(d) { return d.children ? "steelblue" : "#FFEBCC"; })
.attr("fill-opacity", function(d) { return d.children ? ".3" : "1"; })
.attr("stroke", "rgb(31, 119, 180)")
.attr("stroke-width", "1px")
.attr("stroke-opacity", ".5")
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
// .on("dblclick",function(d){ alert( "<$action-navigate $to='" +d.data.name +"'/>"); }); .on("dblclick",function(d){ monAction = "<$action-navigate $to='" +d.data.name +"'/>"; self.dispatchEvent({type: "tm-navigate", navigateTo: d.data.name}); //added by BurningTreeC }); //was missing
node.append("title")
.text(function(d) { return d.data.name + "\n" + format(d.value); })
node.append("circle")
.attr("r", function(d) { return d.r; });
node.filter(function(d) { return !d.children; }).append("text")
.attr("dy", "0.3em")
.text(function(d) { return d.data.name.substring(0, d.r / 3); })
.attr("font", "arial")
.attr("font-size","9px")
.attr("fill","black")
.attr("text-anchor","middle")
;
// Return the svg node
return {
domNode: svg._groups[0][0],
};
};
/*
Compute the internal state of the widget
*/
CirclePackWidget.prototype.execute = function() {
// Get the parameters from the attributes
this.myDataTiddler = this.getAttribute("data");
};
/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
CirclePackWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes();
if(changedAttributes.data || changedTiddlers[this.myDataTiddler]) {
this.refreshSelf();
return true;
}
return false;
};
exports.d3circlepackclick = CirclePackWidget;
})();