Skip to content

Commit c5afe3c

Browse files
authored
Merge pull request #5895 from plotly/unified-hover-fonts
Use `hoverlabel.font` for group titles in unified hover modes
2 parents 13944ae + 111c3ee commit c5afe3c

File tree

4 files changed

+56
-16
lines changed

4 files changed

+56
-16
lines changed

draftlogs/5895_fix.md

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Use hoverlabel.font for group titles in unified hover modes

src/components/fx/hover.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -1029,13 +1029,15 @@ function createHoverText(hoverData, opts, gd) {
10291029
if(hoverData.length === 0) return;
10301030

10311031
// mock legend
1032+
var hoverlabel = fullLayout.hoverlabel;
1033+
var font = hoverlabel.font;
10321034
var mockLayoutIn = {
10331035
showlegend: true,
10341036
legend: {
1035-
title: {text: t0, font: fullLayout.hoverlabel.font},
1036-
font: fullLayout.hoverlabel.font,
1037-
bgcolor: fullLayout.hoverlabel.bgcolor,
1038-
bordercolor: fullLayout.hoverlabel.bordercolor,
1037+
title: {text: t0, font: font},
1038+
font: font,
1039+
bgcolor: hoverlabel.bgcolor,
1040+
bordercolor: hoverlabel.bordercolor,
10391041
borderwidth: 1,
10401042
tracegroupgap: 7,
10411043
traceorder: fullLayout.legend ? fullLayout.legend.traceorder : undefined,
@@ -1080,6 +1082,7 @@ function createHoverText(hoverData, opts, gd) {
10801082

10811083
// Draw unified hover label
10821084
mockLegend._inHover = true;
1085+
mockLegend._groupTitleFont = font;
10831086
legendDraw(gd, mockLegend);
10841087

10851088
// Position the hover

src/components/legend/get_legend_data.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var Registry = require('../../registry');
44
var helpers = require('./helpers');
55

66
module.exports = function getLegendData(calcdata, opts) {
7+
var inHover = opts._inHover;
78
var grouped = helpers.isGrouped(opts);
89
var reversed = helpers.isReversed(opts);
910

@@ -39,7 +40,7 @@ module.exports = function getLegendData(calcdata, opts) {
3940
var trace = cd0.trace;
4041
var lgroup = trace.legendgroup;
4142

42-
if(!opts._inHover && (!trace.visible || !trace.showlegend)) continue;
43+
if(!inHover && (!trace.visible || !trace.showlegend)) continue;
4344

4445
if(Registry.traceIs(trace, 'pie-like')) {
4546
if(!slicesShown[lgroup]) slicesShown[lgroup] = {};
@@ -126,6 +127,7 @@ module.exports = function getLegendData(calcdata, opts) {
126127
var gt = legendData[i][j].trace.legendgrouptitle;
127128
if(gt && gt.text) {
128129
groupTitle = gt;
130+
if(inHover) gt.font = opts._groupTitleFont;
129131
break;
130132
}
131133
}

test/jasmine/tests/hover_label_test.js

+45-11
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ var assertElemRightTo = customAssertions.assertElemRightTo;
2626
var assertElemTopsAligned = customAssertions.assertElemTopsAligned;
2727
var assertElemInside = customAssertions.assertElemInside;
2828

29+
var groupTitlesMock = require('@mocks/legendgroup-titles');
30+
2931
function touch(path, options) {
3032
var len = path.length;
3133
Lib.clearThrottle();
@@ -4547,17 +4549,6 @@ describe('hovermode: (x|y)unified', function() {
45474549
});
45484550
}
45494551

4550-
function assertFont(fontFamily, fontSize, fontColor) {
4551-
var hover = getHoverLabel();
4552-
var text = hover.select('text.legendtext');
4553-
var node = text.node();
4554-
4555-
var textStyle = window.getComputedStyle(node);
4556-
expect(textStyle.fontFamily.split(',')[0]).toBe(fontFamily, 'wrong font family');
4557-
expect(textStyle.fontSize).toBe(fontSize, 'wrong font size');
4558-
expect(textStyle.fill).toBe(fontColor, 'wrong font color');
4559-
}
4560-
45614552
it('set smart defaults for spikeline in x unified', function(done) {
45624553
Plotly.newPlot(gd, [{y: [4, 6, 5]}], {'hovermode': 'x unified', 'xaxis': {'color': 'red'}})
45634554
.then(function(gd) {
@@ -6011,6 +6002,17 @@ describe('hovermode: (x|y)unified', function() {
60116002
});
60126003

60136004
it('should use hoverlabel.font or legend.font or layout.font', function(done) {
6005+
function assertFont(fontFamily, fontSize, fontColor) {
6006+
var hover = getHoverLabel();
6007+
var text = hover.select('text.legendtext');
6008+
var node = text.node();
6009+
6010+
var textStyle = window.getComputedStyle(node);
6011+
expect(textStyle.fontFamily.split(',')[0]).toBe(fontFamily, 'wrong font family');
6012+
expect(textStyle.fontSize).toBe(fontSize, 'wrong font size');
6013+
expect(textStyle.fill).toBe(fontColor, 'wrong font color');
6014+
}
6015+
60146016
var mockCopy = Lib.extendDeep({}, mock);
60156017

60166018
// Set layout.font
@@ -6078,6 +6080,38 @@ describe('hovermode: (x|y)unified', function() {
60786080
.then(done, done.fail);
60796081
});
60806082

6083+
it('should use hoverlabel.font for group titles as well as traces', function(done) {
6084+
function assertFont(fontFamily, fontSize, fontColor) {
6085+
var hover = getHoverLabel();
6086+
var traces = hover.selectAll('g.traces');
6087+
6088+
traces.each(function() {
6089+
var e = d3Select(this);
6090+
var text = e.select('text.legendtext');
6091+
var node = text.node();
6092+
6093+
var textStyle = window.getComputedStyle(node);
6094+
expect(textStyle.fontFamily.split(',')[0]).toBe(fontFamily, 'wrong font family');
6095+
expect(textStyle.fontSize).toBe(fontSize, 'wrong font size');
6096+
expect(textStyle.fill).toBe(fontColor, 'wrong font color');
6097+
});
6098+
}
6099+
6100+
var mockCopy = Lib.extendDeep({}, groupTitlesMock);
6101+
6102+
mockCopy.layout.hoverlabel = {
6103+
font: {size: 20, family: 'Mono', color: 'rgb(255, 127, 0)'}
6104+
};
6105+
6106+
Plotly.newPlot(gd, mockCopy)
6107+
.then(function(gd) {
6108+
_hover(gd, { xval: 0});
6109+
6110+
assertFont('Mono', '20px', 'rgb(255, 127, 0)');
6111+
})
6112+
.then(done, done.fail);
6113+
});
6114+
60816115
it('should work with hovertemplate', function(done) {
60826116
var mockCopy = Lib.extendDeep({}, mock);
60836117
mockCopy.data[0].hovertemplate = 'hovertemplate: %{y:0.2f}';

0 commit comments

Comments
 (0)