Skip to content

Commit 5cfadbd

Browse files
committed
persistent selection for 'bar' & 'histogram' traces
- note that Drawing.font needs to be called in Bar.plot to find out if the text label fit inside the bars.
1 parent bf039ab commit 5cfadbd

File tree

10 files changed

+60
-20
lines changed

10 files changed

+60
-20
lines changed

src/traces/bar/arrays_to_calcdata.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ var mergeArray = require('../../lib').mergeArray;
1414

1515
// arrayOk attributes, merge them into calcdata array
1616
module.exports = function arraysToCalcdata(cd, trace) {
17+
for(var i = 0; i < cd.length; i++) cd[i].i = i;
18+
1719
mergeArray(trace.text, cd, 'tx');
1820
mergeArray(trace.hovertext, cd, 'htx');
1921

src/traces/bar/attributes.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ var marker = extendFlat({
5151
}
5252
});
5353

54-
5554
module.exports = {
5655
x: scatterAttrs.x,
5756
x0: scatterAttrs.x0,
@@ -160,6 +159,9 @@ module.exports = {
160159

161160
marker: marker,
162161

162+
selected: scatterAttrs.selected,
163+
unselected: scatterAttrs.unselected,
164+
163165
r: scatterAttrs.r,
164166
t: scatterAttrs.t,
165167

src/traces/bar/calc.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ var isNumeric = require('fast-isnumeric');
1414
var Axes = require('../../plots/cartesian/axes');
1515
var hasColorscale = require('../../components/colorscale/has_colorscale');
1616
var colorscaleCalc = require('../../components/colorscale/calc');
17-
1817
var arraysToCalcdata = require('./arrays_to_calcdata');
19-
18+
var calcSelection = require('../scatter/calc_selection');
2019

2120
module.exports = function calc(gd, trace) {
2221
// depending on bar direction, set position and size axes
@@ -92,6 +91,7 @@ module.exports = function calc(gd, trace) {
9291
}
9392

9493
arraysToCalcdata(cd, trace);
94+
calcSelection(cd, trace);
9595

9696
return cd;
9797
};

src/traces/bar/defaults.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ var handleStyleDefaults = require('../bar/style_defaults');
1717
var errorBarsSupplyDefaults = require('../../components/errorbars/defaults');
1818
var attributes = require('./attributes');
1919

20-
2120
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
2221
function coerce(attr, dflt) {
2322
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
@@ -44,11 +43,14 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
4443
var hasBoth = Array.isArray(textPosition) || textPosition === 'auto',
4544
hasInside = hasBoth || textPosition === 'inside',
4645
hasOutside = hasBoth || textPosition === 'outside';
46+
4747
if(hasInside || hasOutside) {
4848
var textFont = coerceFont(coerce, 'textfont', layout.font);
4949
if(hasInside) coerceFont(coerce, 'insidetextfont', textFont);
5050
if(hasOutside) coerceFont(coerce, 'outsidetextfont', textFont);
5151
coerce('constraintext');
52+
coerce('selected.textfont.color');
53+
coerce('unselected.textfont.color');
5254
}
5355

5456
handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout);

src/traces/bar/plot.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,14 @@ module.exports = function plot(gd, plotinfo, cdbar) {
4242
bartraces.enter().append('g')
4343
.attr('class', 'trace bars');
4444

45+
bartraces.each(function(d) {
46+
d[0].node3 = d3.select(this);
47+
});
48+
4549
bartraces.append('g')
4650
.attr('class', 'points')
4751
.each(function(d) {
48-
var sel = d[0].node3 = d3.select(this);
52+
var sel = d3.select(this);
4953
var t = d[0].t;
5054
var trace = d[0].trace;
5155
var poffset = t.poffset;
@@ -146,6 +150,8 @@ module.exports = function plot(gd, plotinfo, cdbar) {
146150
};
147151

148152
function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) {
153+
var textPosition;
154+
149155
function appendTextNode(bar, text, textFont) {
150156
var textSelection = bar.append('text')
151157
.text(text)
@@ -157,6 +163,7 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) {
157163
// tex and regular text together
158164
'data-notex': 1
159165
})
166+
.classed('bartext-' + textPosition, true)
160167
.call(Drawing.font, textFont)
161168
.call(svgTextUtils.convertToTspans, gd);
162169

@@ -170,7 +177,7 @@ function appendBarText(gd, bar, calcTrace, i, x0, x1, y0, y1) {
170177
var text = getText(trace, i);
171178
if(!text) return;
172179

173-
var textPosition = getTextPosition(trace, i);
180+
textPosition = getTextPosition(trace, i);
174181
if(textPosition === 'none') return;
175182

176183
var textFont = getTextFont(trace, i, gd._fullLayout.font),

src/traces/bar/select.js

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,17 @@
88

99
'use strict';
1010

11-
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
12-
1311
module.exports = function selectPoints(searchInfo, polygon) {
1412
var cd = searchInfo.cd;
1513
var xa = searchInfo.xaxis;
1614
var ya = searchInfo.yaxis;
1715
var selection = [];
18-
var node3 = cd[0].node3;
1916
var i;
2017

2118
if(polygon === false) {
2219
// clear selection
2320
for(i = 0; i < cd.length; i++) {
24-
cd[i].dim = 0;
21+
cd[i].selected = 0;
2522
}
2623
} else {
2724
for(i = 0; i < cd.length; i++) {
@@ -33,19 +30,12 @@ module.exports = function selectPoints(searchInfo, polygon) {
3330
x: xa.c2d(di.x),
3431
y: ya.c2d(di.y)
3532
});
36-
di.dim = 0;
33+
di.selected = 1;
3734
} else {
38-
di.dim = 1;
35+
di.selected = 0;
3936
}
4037
}
4138
}
4239

43-
node3.selectAll('.point').style('opacity', function(d) {
44-
return d.dim ? DESELECTDIM : 1;
45-
});
46-
node3.selectAll('text').style('opacity', function(d) {
47-
return d.dim ? DESELECTDIM : 1;
48-
});
49-
5040
return selection;
5141
};

src/traces/bar/style.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,32 @@ module.exports = function style(gd, cd) {
3636
s.selectAll('g.points').each(function(d) {
3737
var sel = d3.select(this);
3838
var pts = sel.selectAll('.point');
39+
var txs = sel.selectAll('text');
3940
var trace = d[0].trace;
4041

4142
Drawing.pointStyle(pts, trace, gd);
43+
Drawing.selectedPointStyle(pts, trace);
44+
45+
txs.each(function(d) {
46+
var tx = d3.select(this);
47+
var textFont;
48+
49+
if(tx.classed('bartext-inside')) {
50+
textFont = trace.insidetextfont;
51+
} else if(tx.classed('bartext-outside')) {
52+
textFont = trace.outsidetextfont;
53+
}
54+
if(!textFont) textFont = trace.textfont;
55+
56+
function cast(k) {
57+
var cont = textFont[k];
58+
return Array.isArray(cont) ? cont[d.i] : cont;
59+
}
60+
61+
Drawing.font(tx, cast('family'), cast('size'), cast('color'));
62+
});
63+
64+
Drawing.selectedTextStyle(txs, trace);
4265
});
4366

4467
ErrorBars.style(s);

src/traces/bar/style_defaults.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
var Color = require('../../components/color');
1313
var hasColorscale = require('../../components/colorscale/has_colorscale');
1414
var colorscaleDefaults = require('../../components/colorscale/defaults');
15-
15+
var DESELECTDIM = require('../../constants/interactions').DESELECTDIM;
1616

1717
module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout) {
1818
coerce('marker.color', defaultColor);
@@ -32,4 +32,13 @@ module.exports = function handleStyleDefaults(traceIn, traceOut, coerce, default
3232
}
3333

3434
coerce('marker.line.width');
35+
36+
var mo = coerce('marker.opacity');
37+
var moEffective = Array.isArray(mo) ? 1 : mo;
38+
39+
coerce('selected.marker.opacity', moEffective);
40+
coerce('unselected.marker.opacity', DESELECTDIM * moEffective);
41+
42+
coerce('selected.marker.color');
43+
coerce('unselected.marker.color');
3544
};

src/traces/histogram/attributes.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,9 @@ module.exports = {
191191

192192
marker: barAttrs.marker,
193193

194+
selected: barAttrs.selected,
195+
unselected: barAttrs.unselected,
196+
194197
error_y: barAttrs.error_y,
195198
error_x: barAttrs.error_x,
196199

src/traces/histogram/calc.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ var Lib = require('../../lib');
1515
var Axes = require('../../plots/cartesian/axes');
1616

1717
var arraysToCalcdata = require('../bar/arrays_to_calcdata');
18+
var calcSelection = require('../scatter/calc_selection');
1819
var binFunctions = require('./bin_functions');
1920
var normFunctions = require('./norm_functions');
2021
var doAvg = require('./average');
@@ -196,6 +197,7 @@ module.exports = function calc(gd, trace) {
196197
}
197198

198199
arraysToCalcdata(cd, trace);
200+
calcSelection(cd, trace);
199201

200202
return cd;
201203
};

0 commit comments

Comments
 (0)