Skip to content

Commit dbe942a

Browse files
authored
Merge pull request #4101 from plotly/make-sunburst-funcs-reusable
Making sunburst plot functions reusable for other hierarchical traces
2 parents 6bc4fec + 04603d4 commit dbe942a

File tree

2 files changed

+163
-125
lines changed

2 files changed

+163
-125
lines changed

src/traces/sunburst/helpers.js

+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/**
2+
* Copyright 2012-2019, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
'use strict';
10+
11+
var Lib = require('../../lib');
12+
var Color = require('../../components/color');
13+
var setCursor = require('../../lib/setcursor');
14+
var appendArrayPointValue = require('../../components/fx/helpers').appendArrayPointValue;
15+
16+
exports.makeEventData = function(pt, trace) {
17+
var cdi = pt.data.data;
18+
19+
var out = {
20+
curveNumber: trace.index,
21+
pointNumber: cdi.i,
22+
data: trace._input,
23+
fullData: trace,
24+
25+
// TODO more things like 'children', 'siblings', 'hierarchy?
26+
};
27+
28+
appendArrayPointValue(out, trace, cdi.i);
29+
30+
return out;
31+
};
32+
33+
exports.findEntryWithLevel = function(hierarchy, level) {
34+
var out;
35+
if(level) {
36+
hierarchy.eachAfter(function(pt) {
37+
if(exports.getPtId(pt) === level) {
38+
return out = pt.copy();
39+
}
40+
});
41+
}
42+
return out || hierarchy;
43+
};
44+
45+
exports.findEntryWithChild = function(hierarchy, childId) {
46+
var out;
47+
hierarchy.eachAfter(function(pt) {
48+
var children = pt.children || [];
49+
for(var i = 0; i < children.length; i++) {
50+
var child = children[i];
51+
if(exports.getPtId(child) === childId) {
52+
return out = pt.copy();
53+
}
54+
}
55+
});
56+
return out || hierarchy;
57+
};
58+
59+
exports.isHierachyRoot = function(pt) {
60+
var cdi = pt.data.data;
61+
return cdi.pid === '';
62+
};
63+
64+
exports.isEntry = function(pt) {
65+
return !pt.parent;
66+
};
67+
68+
exports.isLeaf = function(pt) {
69+
return !pt.children;
70+
};
71+
72+
exports.getPtId = function(pt) {
73+
var cdi = pt.data.data;
74+
return cdi.id;
75+
};
76+
77+
exports.setSliceCursor = function(sliceTop, gd, opts) {
78+
var pt = sliceTop.datum();
79+
var isTransitioning = (opts || {}).isTransitioning;
80+
setCursor(sliceTop, (isTransitioning || exports.isLeaf(pt) || exports.isHierachyRoot(pt)) ? null : 'pointer');
81+
};
82+
83+
exports.determineOutsideTextFont = function(trace, pt, layoutFont) {
84+
var cdi = pt.data.data;
85+
var ptNumber = cdi.i;
86+
87+
var color = Lib.castOption(trace, ptNumber, 'outsidetextfont.color') ||
88+
Lib.castOption(trace, ptNumber, 'textfont.color') ||
89+
layoutFont.color;
90+
91+
var family = Lib.castOption(trace, ptNumber, 'outsidetextfont.family') ||
92+
Lib.castOption(trace, ptNumber, 'textfont.family') ||
93+
layoutFont.family;
94+
95+
var size = Lib.castOption(trace, ptNumber, 'outsidetextfont.size') ||
96+
Lib.castOption(trace, ptNumber, 'textfont.size') ||
97+
layoutFont.size;
98+
99+
return {
100+
color: color,
101+
family: family,
102+
size: size
103+
};
104+
};
105+
106+
exports.determineInsideTextFont = function(trace, pt, layoutFont) {
107+
var cdi = pt.data.data;
108+
var ptNumber = cdi.i;
109+
110+
var customColor = Lib.castOption(trace, ptNumber, 'insidetextfont.color');
111+
if(!customColor && trace._input.textfont) {
112+
// Why not simply using trace.textfont? Because if not set, it
113+
// defaults to layout.font which has a default color. But if
114+
// textfont.color and insidetextfont.color don't supply a value,
115+
// a contrasting color shall be used.
116+
customColor = Lib.castOption(trace._input, ptNumber, 'textfont.color');
117+
}
118+
119+
var family = Lib.castOption(trace, ptNumber, 'insidetextfont.family') ||
120+
Lib.castOption(trace, ptNumber, 'textfont.family') ||
121+
layoutFont.family;
122+
123+
var size = Lib.castOption(trace, ptNumber, 'insidetextfont.size') ||
124+
Lib.castOption(trace, ptNumber, 'textfont.size') ||
125+
layoutFont.size;
126+
127+
return {
128+
color: customColor || Color.contrast(cdi.color),
129+
family: family,
130+
size: size
131+
};
132+
};

0 commit comments

Comments
 (0)