Skip to content

Commit 19d81d4

Browse files
committed
first pass range selector draw method
1 parent ab6c109 commit 19d81d4

File tree

3 files changed

+156
-0
lines changed

3 files changed

+156
-0
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
/**
2+
* Copyright 2012-2016, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
10+
'use strict';
11+
12+
var d3 = require('d3');
13+
14+
var Plotly = require('../../plotly');
15+
var axisIds = require('../../plots/cartesian/axis_ids');
16+
17+
var width1 = 50;
18+
var height1 = 40;
19+
20+
21+
module.exports = function draw(gd) {
22+
var fullLayout = gd._fullLayout;
23+
24+
var selectors = fullLayout._infolayer.selectAll('.rangeselector')
25+
.data(makeSelectorData(gd), function(d) { return d._id; });
26+
27+
selectors.enter().append('g')
28+
.classed('rangeselector', true);
29+
30+
selectors.exit().remove();
31+
32+
selectors.style({
33+
'pointer-events': 'all',
34+
'cursor': 'pointer'
35+
});
36+
37+
// selector.attr({ 'translate': });
38+
39+
selectors.each(function(d) {
40+
var selector = d3.select(this),
41+
axisLayout = d,
42+
selectorLayout = axisLayout.rangeselector;
43+
44+
var buttons = selector.selectAll('g.button')
45+
.data(selectorLayout.buttons);
46+
47+
buttons.enter().append('g')
48+
.classed('button', true);
49+
50+
buttons.exit().remove();
51+
52+
buttons.each(function(d, i) {
53+
var button = d3.select(this);
54+
55+
button.append('rect')
56+
.attr({
57+
x: width1 * (0.5 + i),
58+
width: width1,
59+
height: height1
60+
})
61+
.style({
62+
fill: 'none',
63+
stroke: '#000',
64+
'stroke-width': 2
65+
});
66+
67+
button.append('text')
68+
.attr({
69+
x: width1 * (1 + i),
70+
y: height1 / 2,
71+
'text-anchor': 'middle'
72+
})
73+
.text(d.label || d.count + ' ' + d.step.charAt(0));
74+
75+
button.on('click', function() {
76+
var update;
77+
78+
if(d.step === 'all') {
79+
update = {
80+
'xaxis.autorange': true,
81+
'xaxis.range': null
82+
};
83+
}
84+
else {
85+
var xrange = getXRange(axisLayout, d);
86+
87+
update = {
88+
'xaxis.range[0]': xrange[0],
89+
'xaxis.range[1]': xrange[1]
90+
};
91+
}
92+
93+
Plotly.relayout(gd, update);
94+
});
95+
96+
97+
});
98+
99+
});
100+
101+
};
102+
103+
function makeSelectorData(gd) {
104+
var axes = axisIds.list(gd, 'x', true);
105+
var data = [];
106+
107+
for(var i = 0; i < axes.length; i++) {
108+
var axis = axes[i];
109+
110+
if(axis.rangeselector.visible) data.push(axis);
111+
}
112+
113+
return data;
114+
}
115+
116+
function getXRange(axisLayout, opts) {
117+
var currentRange = axisLayout.range;
118+
var base = new Date(currentRange[1]);
119+
120+
var range0, range1;
121+
122+
switch(opts.stepmode) {
123+
case 'backward':
124+
range1 = currentRange[1];
125+
range0 = d3.time[opts.step].offset(base, -opts.count).getTime();
126+
break;
127+
128+
case 'to day':
129+
range1 = currentRange[1];
130+
range0 = d3.time[opts.step].floor(base).getTime();
131+
break;
132+
}
133+
134+
return [range0, range1];
135+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/**
2+
* Copyright 2012-2016, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
'use strict';
10+
11+
exports.attributes = require('./attributes');
12+
13+
exports.supplyDefaults = require('./defaults');
14+
15+
exports.draw = require('./draw');

src/plot_api/plot_api.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ var Legend = require('../components/legend');
2828
var RangeSlider = require('../components/rangeslider');
2929
var Shapes = require('../components/shapes');
3030
var Titles = require('../components/titles');
31+
var RangeSelector = require('../components/range_selector');
3132
var manageModeBar = require('../components/modebar/manage');
3233
var xmlnsNamespaces = require('../constants/xmlns_namespaces');
3334

@@ -242,6 +243,11 @@ Plotly.plot = function(gd, data, layout, config) {
242243
}
243244

244245
function drawAxes() {
246+
247+
// TODO is there a better place for this???
248+
RangeSelector.draw(gd);
249+
250+
245251
// draw ticks, titles, and calculate axis scaling (._b, ._m)
246252
RangeSlider.draw(gd);
247253
return Plotly.Axes.doTicks(gd, 'redraw');

0 commit comments

Comments
 (0)