2
2
3
3
var isNumeric = require ( 'fast-isnumeric' ) ;
4
4
var isArrayOrTypedArray = require ( '../../lib' ) . isArrayOrTypedArray ;
5
+ var svgTextUtils = require ( '../../lib/svg_text_utils' ) ;
5
6
var BADNUM = require ( '../../constants/numerical' ) . BADNUM ;
7
+ var xmlnsNamespaces = require ( '../../constants/xmlns_namespaces' ) ;
6
8
7
9
var Registry = require ( '../../registry' ) ;
8
10
var Axes = require ( '../../plots/cartesian/axes' ) ;
@@ -243,7 +245,7 @@ function setGroupPositionsInOverlayMode(gd, pa, sa, calcTraces, opts) {
243
245
sieveBars ( sieve ) ;
244
246
normalizeBars ( sa , sieve , opts ) ;
245
247
} else {
246
- setBaseAndTop ( sa , sieve ) ;
248
+ setBaseAndTop ( sa , sieve , gd ) ;
247
249
}
248
250
}
249
251
}
@@ -542,7 +544,7 @@ function updatePositionAxis(pa, sieve, allowMinDtick) {
542
544
// store these bar bases and tops in calcdata
543
545
// and make sure the size axis includes zero,
544
546
// along with the bases and tops of each bar.
545
- function setBaseAndTop ( sa , sieve ) {
547
+ function setBaseAndTop ( sa , sieve , gd ) {
546
548
var calcTraces = sieve . traces ;
547
549
var sLetter = getAxisLetter ( sa ) ;
548
550
@@ -574,9 +576,7 @@ function setBaseAndTop(sa, sieve) {
574
576
tozero : tozero ,
575
577
padded : true
576
578
} ;
577
-
578
- addTextPadding ( extremesOpts , fullTrace , sa ) ;
579
-
579
+ addTextPadding ( extremesOpts , fullTrace , sa , gd ) ;
580
580
fullTrace . _extremes [ sa . _id ] = Axes . findExtremes ( sa , pts , extremesOpts ) ;
581
581
}
582
582
}
@@ -654,10 +654,7 @@ function stackBars(sa, sieve, opts) {
654
654
tozero : true ,
655
655
padded : true
656
656
} ;
657
-
658
- // Add text padding if needed
659
657
addTextPadding ( extremesOpts , fullTrace , sa ) ;
660
-
661
658
fullTrace . _extremes [ sa . _id ] = Axes . findExtremes ( sa , pts , extremesOpts ) ;
662
659
}
663
660
}
@@ -769,7 +766,6 @@ function normalizeBars(sa, sieve, opts) {
769
766
padded : padded
770
767
} ;
771
768
addTextPadding ( extremesOpts , fullTrace , sa ) ;
772
-
773
769
fullTrace . _extremes [ sa . _id ] = Axes . findExtremes ( sa , pts , extremesOpts ) ;
774
770
}
775
771
}
@@ -879,21 +875,34 @@ function getAxisLetter(ax) {
879
875
return ax . _id . charAt ( 0 ) ;
880
876
}
881
877
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' ) ;
884
880
var sel = d3 . select ( element ) ;
885
881
sel . text ( txt )
886
882
. attr ( 'x' , 0 )
887
883
. attr ( 'y' , 0 )
888
884
. attr ( 'data-unformatted' , txt )
885
+ . call ( svgTextUtils . convertToTspans , gd )
889
886
. call ( Drawing . font , font ) ;
890
887
891
888
var width = Drawing . bBox ( sel . node ( ) ) . width ;
889
+ var height = Drawing . bBox ( sel . node ( ) ) . height ;
892
890
893
891
// Clean up the temporary element
894
892
element . remove ( ) ;
895
893
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
+ }
897
906
}
898
907
899
908
function findExtremeIndices ( values ) {
@@ -924,7 +933,7 @@ function getMaxLineCount(texts) {
924
933
return maxLines ;
925
934
}
926
935
927
- function addTextPadding ( extremesOpts , trace , sa ) {
936
+ function addTextPadding ( extremesOpts , trace , sa , gd ) {
928
937
var textpos = trace . textposition ;
929
938
if ( ! trace . text || ! textpos ) return ;
930
939
@@ -947,23 +956,36 @@ function addTextPadding(extremesOpts, trace, sa) {
947
956
948
957
var extremes = findExtremeIndices ( values ) ;
949
958
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 ;
950
962
951
963
if ( isHorizontal ) {
952
964
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 ;
954
967
}
955
968
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 ;
957
971
}
958
972
} else {
959
973
// For vertical bars, calculate height based on text for each extreme bar
960
974
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
+ }
963
981
}
964
982
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
+ }
967
989
}
968
990
}
969
991
0 commit comments