Skip to content

Commit a1a2a2b

Browse files
committed
rework text transform to move inside slice function
- cast _text to pt for easier debugging - pass pt object to the function instead of separated arguments - do not return in the middle of draw functions - expand void area for blank text
1 parent 31ed977 commit a1a2a2b

File tree

4 files changed

+53
-58
lines changed

4 files changed

+53
-58
lines changed

src/traces/treemap/draw_ancestors.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -132,23 +132,23 @@ module.exports = function drawAncestors(gd, cd, entry, slices, opts) {
132132
hovered: false
133133
});
134134

135+
pt._text = (helpers.getPtLabel(pt) || '').split('<br>').join(' ') || '';
136+
135137
var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext');
136138
var sliceText = Lib.ensureSingle(sliceTextGroup, 'text', '', function(s) {
137139
// prohibit tex interpretation until we can handle
138140
// tex and regular text together
139141
s.attr('data-notex', 1);
140142
});
141143

142-
var tx = (helpers.getPtLabel(pt) || ' ').split('<br>').join(' ');
143-
144-
sliceText.text(tx)
144+
sliceText.text(pt._text)
145145
.classed('slicetext', true)
146146
.attr('text-anchor', 'start')
147147
.call(Drawing.font, helpers.determineTextFont(trace, pt, fullLayout.font, trace.pathdir))
148148
.call(svgTextUtils.convertToTspans, gd);
149149

150150
pt.textBB = Drawing.bBox(sliceText.node());
151-
pt.transform = toMoveInsideSlice(pt.x0, pt.x1, pt.y0, pt.y1, pt.textBB, {
151+
pt.transform = toMoveInsideSlice(pt, {
152152
onPathbar: true
153153
});
154154

src/traces/treemap/draw_descendants.js

+13-27
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var d3 = require('d3');
1212
var Lib = require('../../lib');
1313
var Drawing = require('../../components/drawing');
1414
var svgTextUtils = require('../../lib/svg_text_utils');
15-
var TEXTPAD = require('../bar/constants').TEXTPAD;
15+
1616
var partition = require('./partition');
1717
var styleOne = require('./style').styleOne;
1818
var constants = require('./constants');
@@ -157,45 +157,31 @@ module.exports = function drawDescendants(gd, cd, entry, slices, opts) {
157157
hovered: false
158158
});
159159

160+
if(pt.x0 === pt.x1 && pt.y0 === pt.y1) {
161+
pt._text = ' '; // use one space character instead of a blank string in this case
162+
} else {
163+
if(isHeader) {
164+
pt._text = noRoomForHeader ? '' : helpers.getPtLabel(pt) || '';
165+
} else {
166+
pt._text = formatSliceLabel(pt, entry, trace, cd, fullLayout) || '';
167+
}
168+
}
169+
160170
var sliceTextGroup = Lib.ensureSingle(sliceTop, 'g', 'slicetext');
161171
var sliceText = Lib.ensureSingle(sliceTextGroup, 'text', '', function(s) {
162172
// prohibit tex interpretation until we can handle
163173
// tex and regular text together
164174
s.attr('data-notex', 1);
165175
});
166176

167-
var _x0 = pt.x0;
168-
var _x1 = pt.x1;
169-
var _y0 = pt.y0;
170-
var _y1 = pt.y1;
171-
172-
var tx;
173-
if(_x0 < _x1 && _y0 < _y1) {
174-
if(isHeader) {
175-
if(noRoomForHeader) return;
176-
177-
tx = helpers.getPtLabel(pt);
178-
} else {
179-
tx = formatSliceLabel(pt, entry, trace, cd, fullLayout) || ' ';
180-
}
181-
} else { // handle text positions for out of range cases e.g. with maxdepth
182-
tx = ' ';
183-
184-
var expand = 2 * TEXTPAD;
185-
_x0 -= expand;
186-
_x1 += expand;
187-
_y0 -= expand;
188-
_y1 += expand;
189-
}
190-
191-
sliceText.text(tx)
177+
sliceText.text(pt._text)
192178
.classed('slicetext', true)
193179
.attr('text-anchor', hasRight ? 'end' : (hasLeft || isHeader) ? 'start' : 'middle')
194180
.call(Drawing.font, helpers.determineTextFont(trace, pt, fullLayout.font))
195181
.call(svgTextUtils.convertToTspans, gd);
196182

197183
pt.textBB = Drawing.bBox(sliceText.node());
198-
pt.transform = toMoveInsideSlice(_x0, _x1, _y0, _y1, pt.textBB, {
184+
pt.transform = toMoveInsideSlice(pt, {
199185
isHeader: isHeader
200186
});
201187

src/traces/treemap/plot.js

+33-24
Original file line numberDiff line numberDiff line change
@@ -162,14 +162,14 @@ function plotOne(gd, cd, element, transitionOpts) {
162162
var cenX = -vpw / 2 + gs.l + gs.w * (domain.x[1] + domain.x[0]) / 2;
163163
var cenY = -vph / 2 + gs.t + gs.h * (1 - (domain.y[1] + domain.y[0]) / 2);
164164

165-
var viewMapX = function(x) { return cenX + x; };
166-
var viewMapY = function(y) { return cenY + y; };
165+
var viewMapX = function(x) { return cenX + (x || 0); };
166+
var viewMapY = function(y) { return cenY + (y || 0); };
167167

168168
var barY0 = viewMapY(0);
169169
var barX0 = viewMapX(0);
170170

171-
var viewBarX = function(x) { return barX0 + x; };
172-
var viewBarY = function(y) { return barY0 + y; };
171+
var viewBarX = function(x) { return barX0 + (x || 0); };
172+
var viewBarY = function(y) { return barY0 + (y || 0); };
173173

174174
function pos(x, y) {
175175
return x + ',' + y;
@@ -273,7 +273,23 @@ function plotOne(gd, cd, element, transitionOpts) {
273273
);
274274
};
275275

276-
var toMoveInsideSlice = function(x0, x1, y0, y1, textBB, opts) {
276+
var toMoveInsideSlice = function(pt, opts) {
277+
var x0 = pt.x0;
278+
var x1 = pt.x1;
279+
var y0 = pt.y0;
280+
var y1 = pt.y1;
281+
var textBB = pt.textBB;
282+
283+
if(x0 === x1) {
284+
x0 -= TEXTPAD;
285+
x1 += TEXTPAD;
286+
}
287+
288+
if(y0 === y1) {
289+
y0 -= TEXTPAD;
290+
y1 += TEXTPAD;
291+
}
292+
277293
var hasFlag = function(f) { return trace.textposition.indexOf(f) !== -1; };
278294

279295
var hasBottom = hasFlag('bottom');
@@ -327,20 +343,13 @@ function plotOne(gd, cd, element, transitionOpts) {
327343
else if(offsetDir === 'right') transform.targetX += deltaX;
328344
}
329345

330-
transform.targetX = viewMapX(transform.targetX);
331-
transform.targetY = viewMapY(transform.targetY);
332-
333-
if(isNaN(transform.targetX) || isNaN(transform.targetY)) {
334-
return {};
335-
}
336-
337346
return {
338347
scale: transform.scale,
339348
rotate: transform.rotate,
340349
textX: transform.textX,
341350
textY: transform.textY,
342-
targetX: transform.targetX,
343-
targetY: transform.targetY
351+
targetX: viewMapX(transform.targetX),
352+
targetY: viewMapY(transform.targetY)
344353
};
345354
};
346355

@@ -428,16 +437,16 @@ function plotOne(gd, cd, element, transitionOpts) {
428437
var origin = getOrigin(pt, onPathbar, refRect, size);
429438

430439
Lib.extendFlat(prev, {
431-
transform: toMoveInsideSlice(
432-
origin.x0,
433-
origin.x1,
434-
origin.y0,
435-
origin.y1,
436-
pt.textBB,
437-
{
438-
isHeader: helpers.isHeader(pt, trace)
439-
}
440-
)
440+
transform: toMoveInsideSlice({
441+
x0: origin.x0,
442+
x1: origin.x1,
443+
y0: origin.y0,
444+
y1: origin.y1,
445+
textBB: pt.textBB,
446+
_text: pt._text
447+
}, {
448+
isHeader: helpers.isHeader(pt, trace)
449+
})
441450
});
442451

443452
if(prev0) {

test/jasmine/tests/treemap_test.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1066,7 +1066,7 @@ describe('Test treemap restyle:', function() {
10661066
.then(_restyle({textinfo: 'value'}))
10671067
.then(_assert('show input values', ['Root', 'B', '1', '3']))
10681068
.then(_restyle({textinfo: 'none'}))
1069-
.then(_assert('no textinfo', ['Root', 'B', ' ', ' '])) // N.B. replaced empty string with space character for better transitions
1069+
.then(_assert('no textinfo', ['Root', 'B', '', '']))
10701070
.then(_restyle({textinfo: 'label+text+value'}))
10711071
.then(_assert('show everything', ['Root', 'B', 'A\n1\nnode1', 'b\n3\nnode3']))
10721072
.then(_restyle({textinfo: null}))
@@ -1127,7 +1127,7 @@ describe('Test treemap tweening:', function() {
11271127
if(attrName === 'transform') {
11281128
var fake = {attr: function() { return actual; }};
11291129
var xy = Drawing.getTranslate(fake);
1130-
expect([xy.x, xy.y]).toBeWithinArray(exp, 1, msg2);
1130+
expect([xy.x, xy.y]).toBeWithinArray(exp, 2, msg2);
11311131
} else {
11321132
// we could maybe to bring in:
11331133
// https://github.com/hughsk/svg-path-parser
@@ -1225,7 +1225,7 @@ describe('Test treemap tweening:', function() {
12251225
'M284.375,188.5L548.375,188.5L548.375,308.5L284.375,308.5Z'
12261226
);
12271227
_assert('move B text to new position', 'transform', 'B', [220.25126, 0]);
1228-
_assert('enter b text to new position', 'transform', 'b', [284.66071, 35714285714286]);
1228+
_assert('enter b text to new position', 'transform', 'b', [286.16071428571433, 35714285714286]);
12291229
})
12301230
.catch(failTest)
12311231
.then(done);

0 commit comments

Comments
 (0)