22
33var isNumeric = require ( 'fast-isnumeric' ) ;
44var isArrayOrTypedArray = require ( '../../lib' ) . isArrayOrTypedArray ;
5+ var svgTextUtils = require ( '../../lib/svg_text_utils' ) ;
56var BADNUM = require ( '../../constants/numerical' ) . BADNUM ;
7+ var xmlnsNamespaces = require ( '../../constants/xmlns_namespaces' ) ;
68
79var Registry = require ( '../../registry' ) ;
810var 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
899908function 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