Skip to content

Commit ebca01b

Browse files
committed
fix axis breaks + rangeslider behavior
- pass axis breaks to mock rangeslider figures - consider axis breaks in rangeslider d2p & p2d - add mocks + drag test
1 parent 187c93a commit ebca01b

File tree

4 files changed

+2783
-6
lines changed

4 files changed

+2783
-6
lines changed

src/components/rangeslider/draw.js

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -123,19 +123,68 @@ module.exports = function(gd) {
123123

124124
// update data <--> pixel coordinate conversion methods
125125

126-
var range0 = axisOpts.r2l(opts.range[0]);
127-
var range1 = axisOpts.r2l(opts.range[1]);
128-
var dist = range1 - range0;
126+
opts._rl = Lib.simpleMap(opts.range, axisOpts.r2l);
127+
var rl0 = opts._rl[0];
128+
var rl1 = opts._rl[1];
129+
var drl = rl1 - rl0;
129130

130131
opts.p2d = function(v) {
131-
return (v / opts._width) * dist + range0;
132+
return (v / opts._width) * drl + rl0;
132133
};
133134

134135
opts.d2p = function(v) {
135-
return (v - range0) / dist * opts._width;
136+
return (v - rl0) / drl * opts._width;
136137
};
137138

138-
opts._rl = [range0, range1];
139+
if(axisOpts.breaks) {
140+
var rsBreaks = axisOpts.locateBreaks(rl0, rl1);
141+
142+
if(rsBreaks.length) {
143+
var j, brk;
144+
145+
var lBreaks = 0;
146+
for(j = 0; j < rsBreaks.length; j++) {
147+
brk = rsBreaks[j];
148+
lBreaks += (brk.max - brk.min);
149+
}
150+
151+
// compute slope and piecewise offsets
152+
var m2 = opts._width / (rl1 - rl0 - lBreaks);
153+
var _B = [-m2 * rl0];
154+
for(j = 0; j < rsBreaks.length; j++) {
155+
brk = rsBreaks[j];
156+
_B.push(_B[_B.length - 1] - m2 * (brk.max - brk.min));
157+
}
158+
159+
opts.d2p = function(v) {
160+
var b = _B[0];
161+
for(var j = 0; j < rsBreaks.length; j++) {
162+
var brk = rsBreaks[j];
163+
if(v >= brk.max) b = _B[j + 1];
164+
else if(v < brk.min) break;
165+
}
166+
return b + m2 * v;
167+
};
168+
169+
// fill pixel (i.e. 'p') min/max here,
170+
// to not have to loop through the _breaks twice during `p2d`
171+
for(j = 0; j < rsBreaks.length; j++) {
172+
brk = rsBreaks[j];
173+
brk.pmin = opts.d2p(brk.min);
174+
brk.pmax = opts.d2p(brk.max);
175+
}
176+
177+
opts.p2d = function(v) {
178+
var b = _B[0];
179+
for(var j = 0; j < rsBreaks.length; j++) {
180+
var brk = rsBreaks[j];
181+
if(v >= brk.pmax) b = _B[j + 1];
182+
else if(v < brk.pmin) break;
183+
}
184+
return (v - b) / m2;
185+
};
186+
}
187+
}
139188

140189
if(oppAxisRangeOpts.rangemode !== 'match') {
141190
var range0OppAxis = oppAxisOpts.r2l(oppAxisRangeOpts.range[0]);
@@ -404,13 +453,21 @@ function drawRangePlot(rangeSlider, gd, axisOpts, opts) {
404453
_context: gd._context
405454
};
406455

456+
if(axisOpts.breaks) {
457+
mockFigure.layout.xaxis.breaks = axisOpts.breaks;
458+
}
459+
407460
mockFigure.layout[oppAxisName] = {
408461
type: oppAxisOpts.type,
409462
domain: [0, 1],
410463
range: oppAxisRangeOpts.rangemode !== 'match' ? oppAxisRangeOpts.range.slice() : oppAxisOpts.range.slice(),
411464
calendar: oppAxisOpts.calendar
412465
};
413466

467+
if(oppAxisOpts.breaks) {
468+
mockFigure.layout[oppAxisName].breaks = oppAxisOpts.breaks;
469+
}
470+
414471
Plots.supplyDefaults(mockFigure);
415472

416473
var xa = mockFigure._fullLayout.xaxis;
59.1 KB
Loading

0 commit comments

Comments
 (0)