Skip to content

Commit b137b25

Browse files
committed
store cornerradius in t instead of trace; general cleanup
1 parent dedce2a commit b137b25

File tree

4 files changed

+64
-48
lines changed

4 files changed

+64
-48
lines changed

src/traces/bar/cross_trace_calc.js

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -123,40 +123,53 @@ function setGroupPositions(gd, pa, sa, calcTraces, opts) {
123123
}
124124
break;
125125
}
126+
setCornerradius(calcTraces);
126127
collectExtents(calcTraces, pa);
127128
}
128129

130+
// Set cornerradiusvalue and cornerradiusform in calcTraces[0].t
131+
function setCornerradius(calcTraces) {
132+
var i, calcTrace, fullTrace, t, cr, crValue, crForm;
133+
134+
for(i = 0; i < calcTraces.length; i++) {
135+
calcTrace = calcTraces[i];
136+
fullTrace = calcTrace[0].trace;
137+
t = calcTrace[0].t;
138+
139+
if(t.cornerradiusvalue === undefined) {
140+
cr = fullTrace.marker ? fullTrace.marker.cornerradius : undefined;
141+
if(cr !== undefined) {
142+
crValue = isNumeric(cr) ? +cr : +cr.slice(0, -1);
143+
crForm = isNumeric(cr) ? 'px' : '%';
144+
t.cornerradiusvalue = crValue;
145+
t.cornerradiusform = crForm;
146+
}
147+
}
148+
}
149+
}
150+
151+
// Make sure all traces in a stack use the same cornerradius
129152
function standardizeCornerradius(calcTraces) {
130153
if(calcTraces.length < 2) return;
131-
var i, calcTrace, fullTrace;
132-
var cr;
154+
var i, calcTrace, fullTrace, t;
155+
var cr, crValue, crForm;
133156
for(i = 0; i < calcTraces.length; i++) {
134157
calcTrace = calcTraces[i];
135158
fullTrace = calcTrace[0].trace;
136-
137-
fullTrace.marker = fullTrace.marker || {};
138-
cr = fullTrace.marker.cornerradius;
159+
cr = fullTrace.marker ? fullTrace.marker.cornerradius : undefined;
139160
if(cr !== undefined) break;
140161
}
141-
// If any trace has cornerradius, set all other traces
142-
// to match first trace which has cornerradius
162+
// If any trace has cornerradius, store first cornerradius
163+
// in calcTrace[0].t so that all traces in stack use same cornerradius
143164
if(cr !== undefined) {
165+
crValue = isNumeric(cr) ? +cr : +cr.slice(0, -1);
166+
crForm = isNumeric(cr) ? 'px' : '%';
144167
for(i = 0; i < calcTraces.length; i++) {
145168
calcTrace = calcTraces[i];
146-
fullTrace = calcTrace[0].trace;
169+
t = calcTrace[0].t;
147170

148-
fullTrace.marker = fullTrace.marker || {};
149-
fullTrace.marker.cornerradius = cr;
150-
}
151-
// Otherwise, remove cornerradius from all other traces
152-
} else {
153-
for(i = 0; i < calcTraces.length; i++) {
154-
calcTrace = calcTraces[i];
155-
fullTrace = calcTrace[0].trace;
156-
157-
if(fullTrace.marker && fullTrace.marker.cornerradius) {
158-
delete fullTrace.marker.cornerradius;
159-
}
171+
t.cornerradiusvalue = crValue;
172+
t.cornerradiusform = crForm;
160173
}
161174
}
162175
}
@@ -754,13 +767,14 @@ function normalizeBars(sa, sieve, opts) {
754767
// Add an `_sMin` and `_sMax` value for each bar representing the min and max size value
755768
// across all bars sharing the same position as that bar. These values are used for rounded
756769
// bar corners, to carry rounding down to lower bars in the stack as needed.
757-
function setHelperValuesForRoundedCorners(calcTraces, sMinByPos, sMaxByPos) {
770+
function setHelperValuesForRoundedCorners(calcTraces, sMinByPos, sMaxByPos, pa) {
771+
var pLetter = getAxisLetter(pa);
758772
// Set `_sMin` and `_sMax` value for each bar
759773
for(var i = 0; i < calcTraces.length; i++) {
760774
var calcTrace = calcTraces[i];
761775
for(var j = 0; j < calcTrace.length; j++) {
762776
var bar = calcTrace[j];
763-
var pos = bar.p0;
777+
var pos = bar[pLetter];
764778
bar._sMin = sMinByPos[pos];
765779
bar._sMax = sMaxByPos[pos];
766780
}
@@ -840,14 +854,14 @@ function collectExtents(calcTraces, pa) {
840854
if(anyTraceHasCornerradius) {
841855
var sMin = Math.min(di.s0, di.s1) || 0;
842856
var sMax = Math.max(di.s0, di.s1) || 0;
843-
var pos = di.p0;
857+
var pos = di[pLetter];
844858
sMinByPos[pos] = (pos in sMinByPos) ? Math.min(sMinByPos[pos], sMin) : sMin;
845859
sMaxByPos[pos] = (pos in sMaxByPos) ? Math.max(sMaxByPos[pos], sMax) : sMax;
846860
}
847861
}
848862
}
849863
if(anyTraceHasCornerradius) {
850-
setHelperValuesForRoundedCorners(calcTraces, sMinByPos, sMaxByPos);
864+
setHelperValuesForRoundedCorners(calcTraces, sMinByPos, sMaxByPos, pa);
851865
}
852866
}
853867

src/traces/bar/defaults.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,18 +93,17 @@ function crossTraceDefaults(fullData, fullLayout) {
9393
// If the given cornerradius value is a numeric string, it will be converted
9494
// to a number.
9595
function validateCornerradius(r) {
96-
var validR = false;
9796
if(isNumeric(r)) {
9897
r = +r;
99-
if(r >= 0) validR = true;
100-
} else if(typeof r === 'string' && r.slice(-1) === '%') {
101-
r = +r.slice(0, -1);
102-
if(r >= 0) {
103-
r += '%';
104-
validR = true;
98+
if(r >= 0) return r;
99+
} else if(typeof r === 'string') {
100+
r = r.trim();
101+
if(r.slice(-1) === '%' && isNumeric(r.slice(0, -1))) {
102+
r = +r.slice(0, -1);
103+
if(r >= 0) return r + '%';
105104
}
106105
}
107-
return validR ? r : undefined;
106+
return undefined;
108107
}
109108

110109
function handleText(traceIn, traceOut, layout, coerce, textposition, opts) {

src/traces/bar/layout_defaults.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ var Axes = require('../../plots/cartesian/axes');
55
var Lib = require('../../lib');
66

77
var layoutAttributes = require('./layout_attributes');
8+
var validateCornerradius = require('./defaults').validateCornerradius;
9+
810

911
module.exports = function(layoutIn, layoutOut, fullData) {
1012
function coerce(attr, dflt) {
@@ -47,5 +49,6 @@ module.exports = function(layoutIn, layoutOut, fullData) {
4749

4850
coerce('bargap', (shouldBeGapless && !gappedAnyway) ? 0 : 0.2);
4951
coerce('bargroupgap');
50-
coerce('barcornerradius');
52+
var r = coerce('barcornerradius');
53+
layoutOut.barcornerradius = validateCornerradius(r);
5154
};

src/traces/bar/plot.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ function plot(gd, plotinfo, cdModule, traceLayer, opts, makeOnCompleteCallback)
100100
var bartraces = Lib.makeTraceGroups(traceLayer, cdModule, 'trace bars').each(function(cd) {
101101
var plotGroup = d3.select(this);
102102
var trace = cd[0].trace;
103+
var t = cd[0].t;
103104
var isWaterfall = (trace.type === 'waterfall');
104105
var isFunnel = (trace.type === 'funnel');
105106
var isHistogram = (trace.type === 'histogram');
@@ -249,26 +250,26 @@ function plot(gd, plotinfo, cdModule, traceLayer, opts, makeOnCompleteCallback)
249250
}
250251

251252
// Calculate corner radius of bar in pixels
252-
function calcCornerRadius(radiusParam) {
253+
function calcCornerRadius(crValue, crForm) {
253254
var barWidth = isHorizontal ? Math.abs(y1 - y0) : Math.abs(x1 - x0);
254255
var barLength = isHorizontal ? Math.abs(x1 - x0) : Math.abs(y1 - y0);
255256
var stackedBarTotalLength = fixpx(Math.abs(c2p(outerBound, true) - c2p(0, true)));
256257
var maxRadius = di.hasB ? Math.min(barWidth / 2, barLength / 2) : Math.min(barWidth / 2, stackedBarTotalLength);
257-
var rPx;
258-
if(!radiusParam) {
258+
var crPx;
259+
if(!crValue) {
259260
return 0;
260-
} else if(typeof radiusParam === 'string') {
261+
} else if(crForm === '%') {
261262
// If radius is given as a % string, convert to number of pixels
262-
var rPercent = Math.min(50, +radiusParam.slice(0, -1));
263-
rPx = barWidth * (rPercent / 100);
263+
var crPercent = Math.min(50, crValue);
264+
crPx = barWidth * (crPercent / 100);
264265
} else {
265266
// Otherwise, it's already a number of pixels, use the given value
266-
rPx = +radiusParam;
267+
crPx = crValue;
267268
}
268-
return fixpx(Math.max(Math.min(rPx, maxRadius), 0));
269+
return fixpx(Math.max(Math.min(crPx, maxRadius), 0));
269270
}
270271
// Exclude anything which is not explicitly a bar or histogram chart from rounding
271-
var r = (isBar || isHistogram) ? calcCornerRadius(trace.marker.cornerradius) : 0;
272+
var r = (isBar || isHistogram) ? calcCornerRadius(t.cornerradiusvalue, t.cornerradiusform) : 0;
272273
// Construct path string for bar
273274
var path, h;
274275
// Functions which return x-dimension and y-dimension of bar at a given x/y,
@@ -580,11 +581,13 @@ function appendBarText(gd, plotinfo, bar, cd, i, x0, x1, y0, y1, lxFunc, lyFunc,
580581
trace.constraintext === 'both' ||
581582
trace.constraintext === 'inside';
582583

583-
transform = toMoveInsideBarWithCornerradius(x0, x1, y0, y1, textBB, lxFunc, lyFunc, {
584+
transform = toMoveInsideBar(x0, x1, y0, y1, textBB, {
584585
isHorizontal: isHorizontal,
585586
constrained: constrained,
586587
angle: angle,
587588
anchor: insidetextanchor,
589+
lxFunc: lxFunc,
590+
lyFunc: lyFunc,
588591
});
589592
}
590593

@@ -612,11 +615,6 @@ function getRotatedTextSize(textBB, rotate) {
612615
}
613616

614617
function toMoveInsideBar(x0, x1, y0, y1, textBB, opts) {
615-
// Wrapper for export
616-
return toMoveInsideBarWithCornerradius(x0, x1, y0, y1, textBB, null, null, opts);
617-
}
618-
619-
function toMoveInsideBarWithCornerradius(x0, x1, y0, y1, textBB, lxFunc, lyFunc, opts) {
620618
var isHorizontal = !!opts.isHorizontal;
621619
var constrained = !!opts.constrained;
622620
var angle = opts.angle || 0;
@@ -626,6 +624,8 @@ function toMoveInsideBarWithCornerradius(x0, x1, y0, y1, textBB, lxFunc, lyFunc,
626624
var leftToRight = opts.leftToRight || 0; // left: -1, center: 0, right: 1
627625
var toRight = (leftToRight + 1) / 2;
628626
var toLeft = 1 - toRight;
627+
var lxFunc = opts.lxFunc;
628+
var lyFunc = opts.lyFunc;
629629

630630
var textWidth = textBB.width;
631631
var textHeight = textBB.height;

0 commit comments

Comments
 (0)