Skip to content

Commit 1255581

Browse files
committed
handle nonzero textangle
1 parent 0bfed6e commit 1255581

File tree

2 files changed

+42
-19
lines changed

2 files changed

+42
-19
lines changed

src/components/drawing/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1888,3 +1888,4 @@ function getMarkerAngle(d, trace) {
18881888
}
18891889

18901890
drawing.getMarkerAngle = getMarkerAngle;
1891+
drawing.rotate = rotate;

src/traces/bar/cross_trace_calc.js

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
var isNumeric = require('fast-isnumeric');
44
var isArrayOrTypedArray = require('../../lib').isArrayOrTypedArray;
5+
var svgTextUtils = require('../../lib/svg_text_utils');
56
var BADNUM = require('../../constants/numerical').BADNUM;
7+
var xmlnsNamespaces = require('../../constants/xmlns_namespaces');
68

79
var Registry = require('../../registry');
810
var Axes = require('../../plots/cartesian/axes');
@@ -243,7 +245,7 @@ function setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces, opts) {
243245
sieveBars(sieve);
244246
normalizeBars(sa, sieve, opts);
245247
} else {
246-
setBaseAndTop(sa, sieve);
248+
setBaseAndTop(sa, sieve, gd);
247249
}
248250
}
249251
}
@@ -542,7 +544,7 @@ function updatePositionAxis(pa, sieve, allowMinDtick) {
542544
// store these bar bases and tops in calcdata
543545
// and make sure the size axis includes zero,
544546
// along with the bases and tops of each bar.
545-
function setBaseAndTop(sa, sieve) {
547+
function setBaseAndTop(sa, sieve, gd) {
546548
var calcTraces = sieve.traces;
547549
var sLetter = getAxisLetter(sa);
548550

@@ -574,9 +576,7 @@ function setBaseAndTop(sa, sieve) {
574576
tozero: tozero,
575577
padded: true
576578
};
577-
578-
addTextPadding(extremesOpts, fullTrace, sa);
579-
579+
addTextPadding(extremesOpts, fullTrace, sa, gd);
580580
fullTrace._extremes[sa._id] = Axes.findExtremes(sa, pts, extremesOpts);
581581
}
582582
}
@@ -654,10 +654,7 @@ function stackBars(sa, sieve, opts) {
654654
tozero: true,
655655
padded: true
656656
};
657-
658-
// Add text padding if needed
659657
addTextPadding(extremesOpts, fullTrace, sa);
660-
661658
fullTrace._extremes[sa._id] = Axes.findExtremes(sa, pts, extremesOpts);
662659
}
663660
}
@@ -769,7 +766,6 @@ function normalizeBars(sa, sieve, opts) {
769766
padded: padded
770767
};
771768
addTextPadding(extremesOpts, fullTrace, sa);
772-
773769
fullTrace._extremes[sa._id] = Axes.findExtremes(sa, pts, extremesOpts);
774770
}
775771
}
@@ -879,21 +875,34 @@ function getAxisLetter(ax) {
879875
return ax._id.charAt(0);
880876
}
881877

882-
function measureTextWidth(txt, font) {
883-
var element = document.createElementNS('http://www.w3.org/2000/svg', 'text');
878+
function measureText(txt, font, textAngle, gd) {
879+
var element = document.createElementNS(xmlnsNamespaces.svg, 'text');
884880
var sel = d3.select(element);
885881
sel.text(txt)
886882
.attr('x', 0)
887883
.attr('y', 0)
888884
.attr('data-unformatted', txt)
885+
.call(svgTextUtils.convertToTspans, gd)
889886
.call(Drawing.font, font);
890887

891888
var width = Drawing.bBox(sel.node()).width;
889+
var height = Drawing.bBox(sel.node()).height;
892890

893891
// Clean up the temporary element
894892
element.remove();
895893

896-
return width;
894+
if(textAngle) {
895+
var rotated = Drawing.rotate(textAngle, [width, height]);
896+
return {
897+
'width': rotated[0],
898+
'height': rotated[1],
899+
}
900+
}
901+
902+
return {
903+
'width': width,
904+
'height': height,
905+
}
897906
}
898907

899908
function findExtremeIndices(values) {
@@ -924,7 +933,7 @@ function getMaxLineCount(texts) {
924933
return maxLines;
925934
}
926935

927-
function addTextPadding(extremesOpts, trace, sa) {
936+
function addTextPadding(extremesOpts, trace, sa, gd) {
928937
var textpos = trace.textposition;
929938
if(!trace.text || !textpos) return;
930939

@@ -947,23 +956,36 @@ function addTextPadding(extremesOpts, trace, sa) {
947956

948957
var extremes = findExtremeIndices(values);
949958
var positivePadding = 0, negativePadding = 0;
959+
var textAnglePositive = Array.isArray(trace.textangle) ? trace.textangle[extremes.positive] : trace.textangle;
960+
var textAngleNegative = Array.isArray(trace.textangle) ? trace.textangle[extremes.negative] : trace.textangle;
961+
var positiveText, negativeText;
950962

951963
if(isHorizontal) {
952964
if(extremes.positive >= 0 && trace.text[extremes.positive]) {
953-
positivePadding = measureTextWidth(trace.text[extremes.positive], font) + TEXTPAD;
965+
positiveText = trace.text[extremes.positive];
966+
positivePadding = measureText(positiveText, font, textAnglePositive).width + TEXTPAD;
954967
}
955968
if(extremes.negative >= 0 && trace.text[extremes.negative]) {
956-
negativePadding = measureTextWidth(trace.text[extremes.negative], font) + TEXTPAD;
969+
negativeText = trace.text[extremes.negative];
970+
negativePadding = measureText(negativeText, font, textAngleNegative).width + TEXTPAD;
957971
}
958972
} else {
959973
// For vertical bars, calculate height based on text for each extreme bar
960974
if(extremes.positive >= 0 && trace.text[extremes.positive]) {
961-
var positiveTexts = [trace.text[extremes.positive]];
962-
positivePadding = fontSize * getMaxLineCount(positiveTexts) + TEXTPAD;
975+
positiveText = trace.text[extremes.positive];
976+
if(textAnglePositive) {
977+
positivePadding = measureText(trace.text[extremes.positive], font, textAnglePositive).height + TEXTPAD;
978+
} else {
979+
positivePadding = fontSize * getMaxLineCount(positiveText) + TEXTPAD;
980+
}
963981
}
964982
if(extremes.negative >= 0 && trace.text[extremes.negative]) {
965-
var negativeTexts = [trace.text[extremes.negative]];
966-
negativePadding = fontSize * getMaxLineCount(negativeTexts) + TEXTPAD;
983+
var negativeText = trace.text[extremes.negative];
984+
if(textAngleNegative) {
985+
negativePadding = measureText(negativeText, font, textAngleNegative).height + TEXTPAD;
986+
} else {
987+
negativePadding = fontSize * getMaxLineCount(negativeText) + TEXTPAD;
988+
}
967989
}
968990
}
969991

0 commit comments

Comments
 (0)