Skip to content

Commit 918d22e

Browse files
committed
implement hoverlabel.namelength for traces using Fx.loneHover
... that is pie, sankey, sunburst and all gl3d traces
1 parent e9f8403 commit 918d22e

File tree

10 files changed

+108
-25
lines changed

10 files changed

+108
-25
lines changed

src/components/fx/hover.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ exports.loneHover = function loneHover(hoverItem, opts) {
124124
fontFamily: hoverItem.fontFamily,
125125
fontSize: hoverItem.fontSize,
126126
fontColor: hoverItem.fontColor,
127+
nameLength: hoverItem.nameLength,
127128

128129
// filler to make createHoverText happy
129130
trace: hoverItem.trace || {

src/plots/gl2d/scene2d.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,8 @@ proto.draw = function() {
686686
borderColor: Fx.castHoverOption(trace, ptNumber, 'bordercolor'),
687687
fontFamily: Fx.castHoverOption(trace, ptNumber, 'font.family'),
688688
fontSize: Fx.castHoverOption(trace, ptNumber, 'font.size'),
689-
fontColor: Fx.castHoverOption(trace, ptNumber, 'font.color')
689+
fontColor: Fx.castHoverOption(trace, ptNumber, 'font.color'),
690+
nameLength: Fx.castHoverOption(trace, ptNumber, 'namelength')
690691
}, {
691692
container: this.svgContainer,
692693
gd: this.graphDiv

src/plots/gl3d/scene.js

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ var computeTickMarks = require('./layout/tick_marks');
3232
var STATIC_CANVAS, STATIC_CONTEXT;
3333

3434
function render(scene) {
35+
var gd = scene.graphDiv;
3536
var trace;
3637

3738
// update size of svg container
@@ -70,6 +71,7 @@ function render(scene) {
7071
if(lastPicked !== null) {
7172
var pdata = project(scene.glplot.cameraParams, selection.dataCoordinate);
7273
trace = lastPicked.data;
74+
var traceNow = gd._fullData[trace.index];
7375
var ptNumber = selection.index;
7476

7577
var labels = {
@@ -78,11 +80,11 @@ function render(scene) {
7880
zLabel: formatter('zaxis', selection.traceCoordinate[2])
7981
};
8082

81-
var hoverinfo = Fx.castHoverinfo(trace, scene.fullLayout, ptNumber);
83+
var hoverinfo = Fx.castHoverinfo(traceNow, scene.fullLayout, ptNumber);
8284
var hoverinfoParts = (hoverinfo || '').split('+');
8385
var isHoverinfoAll = hoverinfo && hoverinfo === 'all';
8486

85-
if(!trace.hovertemplate && !isHoverinfoAll) {
87+
if(!traceNow.hovertemplate && !isHoverinfoAll) {
8688
if(hoverinfoParts.indexOf('x') === -1) labels.xLabel = undefined;
8789
if(hoverinfoParts.indexOf('y') === -1) labels.yLabel = undefined;
8890
if(hoverinfoParts.indexOf('z') === -1) labels.zLabel = undefined;
@@ -138,55 +140,55 @@ function render(scene) {
138140
x: selection.traceCoordinate[0],
139141
y: selection.traceCoordinate[1],
140142
z: selection.traceCoordinate[2],
141-
data: trace._input,
142-
fullData: trace,
143-
curveNumber: trace.index,
143+
data: traceNow._input,
144+
fullData: traceNow,
145+
curveNumber: traceNow.index,
144146
pointNumber: ptNumber
145147
};
146148

147-
Fx.appendArrayPointValue(pointData, trace, ptNumber);
149+
Fx.appendArrayPointValue(pointData, traceNow, ptNumber);
148150

149151
if(trace._module.eventData) {
150-
pointData = trace._module.eventData(pointData, selection, trace, {}, ptNumber);
152+
pointData = traceNow._module.eventData(pointData, selection, traceNow, {}, ptNumber);
151153
}
152154

153155
var eventData = {points: [pointData]};
154156

155157
if(scene.fullSceneLayout.hovermode) {
156158
Fx.loneHover({
157-
trace: trace,
159+
trace: traceNow,
158160
x: (0.5 + 0.5 * pdata[0] / pdata[3]) * width,
159161
y: (0.5 - 0.5 * pdata[1] / pdata[3]) * height,
160162
xLabel: labels.xLabel,
161163
yLabel: labels.yLabel,
162164
zLabel: labels.zLabel,
163165
text: tx,
164166
name: lastPicked.name,
165-
color: Fx.castHoverOption(trace, ptNumber, 'bgcolor') || lastPicked.color,
166-
borderColor: Fx.castHoverOption(trace, ptNumber, 'bordercolor'),
167-
fontFamily: Fx.castHoverOption(trace, ptNumber, 'font.family'),
168-
fontSize: Fx.castHoverOption(trace, ptNumber, 'font.size'),
169-
fontColor: Fx.castHoverOption(trace, ptNumber, 'font.color'),
170-
hovertemplate: Lib.castOption(trace, ptNumber, 'hovertemplate'),
167+
color: Fx.castHoverOption(traceNow, ptNumber, 'bgcolor') || lastPicked.color,
168+
borderColor: Fx.castHoverOption(traceNow, ptNumber, 'bordercolor'),
169+
fontFamily: Fx.castHoverOption(traceNow, ptNumber, 'font.family'),
170+
fontSize: Fx.castHoverOption(traceNow, ptNumber, 'font.size'),
171+
fontColor: Fx.castHoverOption(traceNow, ptNumber, 'font.color'),
172+
nameLength: Fx.castHoverOption(traceNow, ptNumber, 'namelength'),
173+
hovertemplate: Lib.castOption(traceNow, ptNumber, 'hovertemplate'),
171174
hovertemplateLabels: Lib.extendFlat({}, pointData, labels),
172175
eventData: [pointData]
173176
}, {
174177
container: svgContainer,
175-
gd: scene.graphDiv
178+
gd: gd
176179
});
177180
}
178181

179182
if(selection.buttons && selection.distance < 5) {
180-
scene.graphDiv.emit('plotly_click', eventData);
183+
gd.emit('plotly_click', eventData);
181184
} else {
182-
scene.graphDiv.emit('plotly_hover', eventData);
185+
gd.emit('plotly_hover', eventData);
183186
}
184187

185188
oldEventData = eventData;
186-
}
187-
else {
189+
} else {
188190
Fx.loneUnhover(svgContainer);
189-
scene.graphDiv.emit('plotly_unhover', oldEventData);
191+
gd.emit('plotly_unhover', oldEventData);
190192
}
191193

192194
scene.drawAnnotations(scene);

src/traces/pie/plot.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -363,10 +363,11 @@ function attachFxHandlers(sliceTop, gd, cd) {
363363
pt.percentLabel = helpers.formatPiePercent(pt.percent, separators);
364364
if(hoverinfo && hoverinfo.indexOf('percent') !== -1) thisText.push(pt.percentLabel);
365365

366-
var hoverLabel = trace.hoverlabel;
366+
var hoverLabel = trace2.hoverlabel;
367367
var hoverFont = hoverLabel.font;
368368

369369
Fx.loneHover({
370+
trace: trace,
370371
x0: hoverCenterX - rInscribed * cd0.r,
371372
x1: hoverCenterX + rInscribed * cd0.r,
372373
y: hoverCenterY,
@@ -378,8 +379,7 @@ function attachFxHandlers(sliceTop, gd, cd) {
378379
fontFamily: helpers.castOption(hoverFont.family, pt.pts),
379380
fontSize: helpers.castOption(hoverFont.size, pt.pts),
380381
fontColor: helpers.castOption(hoverFont.color, pt.pts),
381-
382-
trace: trace2,
382+
nameLength: helpers.castOption(hoverLabel.namelength, pt.pts),
383383
hovertemplate: helpers.castOption(trace2.hovertemplate, pt.pts),
384384
hovertemplateLabels: pt,
385385
eventData: [eventData(pt, trace2)]

src/traces/sankey/plot.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ module.exports = function plot(gd, calcData) {
186186
fontFamily: castHoverOption(obj, 'font.family'),
187187
fontSize: castHoverOption(obj, 'font.size'),
188188
fontColor: castHoverOption(obj, 'font.color'),
189+
nameLength: castHoverOption(obj, 'namelength'),
189190
idealAlign: d3.event.x < hoverCenterX ? 'right' : 'left',
190191

191192
hovertemplate: obj.hovertemplate,
@@ -267,6 +268,7 @@ module.exports = function plot(gd, calcData) {
267268
fontFamily: castHoverOption(obj, 'font.family'),
268269
fontSize: castHoverOption(obj, 'font.size'),
269270
fontColor: castHoverOption(obj, 'font.color'),
271+
nameLength: castHoverOption(obj, 'namelength'),
270272
idealAlign: 'left',
271273

272274
hovertemplate: obj.hovertemplate,

src/traces/sunburst/plot.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -581,18 +581,19 @@ function attachFxHandlers(sliceTop, gd, cd) {
581581
if(hasFlag('text') && hoverPt.text) thisText.push(hoverPt.text);
582582

583583
Fx.loneHover({
584+
trace: traceNow,
584585
x0: hoverCenterX - rInscribed * pt.rpx1,
585586
x1: hoverCenterX + rInscribed * pt.rpx1,
586587
y: hoverCenterY,
587588
idealAlign: pt.pxmid[0] < 0 ? 'left' : 'right',
588-
trace: traceNow,
589589
text: thisText.join('<br>'),
590590
name: (hovertemplate || hasFlag('name')) ? traceNow.name : undefined,
591591
color: _cast('hoverlabel.bgcolor') || cdi.color,
592592
borderColor: _cast('hoverlabel.bordercolor'),
593593
fontFamily: _cast('hoverlabel.font.family'),
594594
fontSize: _cast('hoverlabel.font.size'),
595595
fontColor: _cast('hoverlabel.font.color'),
596+
nameLength: _cast('hoverlabel.namelength'),
596597
hovertemplate: hovertemplate,
597598
hovertemplateLabels: hoverPt,
598599
eventData: [makeEventData(pt, traceNow)]

test/jasmine/tests/gl3d_plot_interact_test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,18 @@ describe('Test gl3d plots', function() {
226226
}
227227
);
228228
})
229+
.then(function() { return Plotly.restyle(gd, 'hoverlabel.namelength', 3); })
230+
.then(delay(20))
231+
.then(_hover)
232+
.then(delay(20))
233+
.then(function() {
234+
assertHoverLabelContent(
235+
{
236+
nums: ['x: 0', 'y: 0', 'z: 0'].join('\n'),
237+
name: 'tra'
238+
}
239+
);
240+
})
229241
.catch(failTest)
230242
.then(done);
231243
});

test/jasmine/tests/pie_test.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,6 +1169,24 @@ describe('pie hovering', function() {
11691169
.catch(failTest)
11701170
.then(done);
11711171
});
1172+
1173+
it('should honor *hoverlabel.namelength*', function(done) {
1174+
mockCopy.data[0].name = 'loooooooooooooooooooooooong';
1175+
mockCopy.data[0].hoverinfo = 'all';
1176+
1177+
Plotly.plot(gd, mockCopy.data, mockCopy.layout)
1178+
.then(_hover)
1179+
.then(function() {
1180+
assertHoverLabelContent({nums: '4\n5\n33.3%', name: 'looooooooooo...'}, 'base');
1181+
})
1182+
.then(function() { return Plotly.restyle(gd, 'hoverlabel.namelength', 2); })
1183+
.then(_hover)
1184+
.then(function() {
1185+
assertHoverLabelContent({nums: '4\n5\n33.3%', name: 'lo'}, 'base');
1186+
})
1187+
.catch(failTest)
1188+
.then(done);
1189+
});
11721190
});
11731191

11741192
describe('should fit labels within graph div', function() {

test/jasmine/tests/sankey_test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ var destroyGraphDiv = require('../assets/destroy_graph_div');
1616
var failTest = require('../assets/fail_test');
1717
var mouseEvent = require('../assets/mouse_event');
1818
var getNodeCoords = require('../assets/get_node_coords');
19+
var assertHoverLabelContent = require('../assets/custom_assertions').assertHoverLabelContent;
1920
var assertHoverLabelStyle = require('../assets/custom_assertions').assertHoverLabelStyle;
2021
var supplyAllDefaults = require('../assets/supply_defaults');
2122
var defaultColors = require('@src/components/color/attributes').defaults;
@@ -866,6 +867,32 @@ describe('sankey tests', function() {
866867
.catch(failTest)
867868
.then(done);
868869
});
870+
871+
it('should honor *hoverlabel.namelength*', function(done) {
872+
var gd = createGraphDiv();
873+
var mockCopy = Lib.extendDeep({}, mock);
874+
875+
Plotly.plot(gd, mockCopy)
876+
.then(function() { _hover(404, 302); })
877+
.then(function() {
878+
assertHoverLabelContent({
879+
nums: 'Solid\nincoming flow count: 4\noutgoing flow count: 3',
880+
name: '447TWh'
881+
});
882+
})
883+
.then(function() {
884+
return Plotly.restyle(gd, 'hoverlabel.namelength', 3);
885+
})
886+
.then(function() { _hover(404, 302); })
887+
.then(function() {
888+
assertHoverLabelContent({
889+
nums: 'Solid\nincoming flow count: 4\noutgoing flow count: 3',
890+
name: '447'
891+
});
892+
})
893+
.catch(failTest)
894+
.then(done);
895+
});
869896
});
870897

871898
describe('Test hover/click event data:', function() {

test/jasmine/tests/sunburst_test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,25 @@ describe('Test sunburst hover:', function() {
365365
parent: 'Eve'
366366
}
367367
}
368+
}, {
369+
desc: 'with hoverlabel.namelength set ',
370+
traces: [{
371+
hoverlabel: {namelength: 4},
372+
hoverinfo: 'all'
373+
}],
374+
pos: 4,
375+
exp: {
376+
label: {
377+
nums: 'Abel',
378+
name: 't...'
379+
},
380+
ptData: {
381+
curveNumber: 0,
382+
pointNumber: 5,
383+
label: 'Abel',
384+
parent: 'Eve'
385+
}
386+
}
368387
}, {
369388
desc: 'with values',
370389
traces: [{

0 commit comments

Comments
 (0)