Skip to content

Commit 6e0f7bd

Browse files
etpinardmdtusz
authored andcommitted
(wip) factor out 'get-autorange' algo from doAutorange,
- so that range slider can use it without resetting gd.layout.xaxis.range
1 parent 486b01c commit 6e0f7bd

File tree

2 files changed

+94
-70
lines changed

2 files changed

+94
-70
lines changed

src/components/rangeslider/create_slider.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111

1212
var Plotly = require('../../plotly');
13+
var Axes = require('../../plots/cartesian/axes');
1314
var Lib = require('../../lib');
1415

1516
var svgNS = require('../../constants/xmlns_namespaces').svg;
@@ -129,6 +130,10 @@ module.exports = function createSlider(gd, minStart, maxStart) {
129130
});
130131

131132

133+
console.log('in create slider')
134+
console.log(Axes.getAutoRange(fullLayout.xaxis))
135+
console.log(fullLayout.xaxis.range)
136+
132137
slider.addEventListener('mousedown', function(event) {
133138
var target = event.target,
134139
startX = event.clientX,

src/plots/cartesian/axes.js

Lines changed: 89 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -110,91 +110,108 @@ axes.minDtick = function(ax,newDiff,newFirst,allow) {
110110
}
111111
};
112112

113-
axes.doAutoRange = function(ax) {
114-
if(!ax._length) ax.setScale();
113+
axes.getAutoRange = function(ax) {
114+
var newRange = [];
115115

116-
if(ax.autorange && ax._min && ax._max &&
117-
ax._min.length && ax._max.length) {
118-
var minmin = ax._min[0].val,
119-
maxmax = ax._max[0].val,
120-
i;
121-
122-
for(i = 1; i < ax._min.length; i++) {
123-
if(minmin !== maxmax) break;
124-
minmin = Math.min(minmin, ax._min[i].val);
125-
}
126-
for(i = 1; i < ax._max.length; i++) {
127-
if(minmin !== maxmax) break;
128-
maxmax = Math.max(maxmax, ax._max[i].val);
129-
}
130-
131-
var j,minpt,maxpt,minbest,maxbest,dp,dv,
132-
mbest = 0,
133-
axReverse = (ax.range && ax.range[1]<ax.range[0]);
134-
// one-time setting to easily reverse the axis
135-
// when plotting from code
136-
if(ax.autorange==='reversed') {
137-
axReverse = true;
138-
ax.autorange = true;
139-
}
140-
for(i=0; i<ax._min.length; i++) {
141-
minpt = ax._min[i];
142-
for(j=0; j<ax._max.length; j++) {
143-
maxpt = ax._max[j];
144-
dv = maxpt.val-minpt.val;
145-
dp = ax._length-minpt.pad-maxpt.pad;
146-
if(dv>0 && dp>0 && dv/dp > mbest) {
147-
minbest = minpt;
148-
maxbest = maxpt;
149-
mbest = dv/dp;
150-
}
116+
var minmin = ax._min[0].val,
117+
maxmax = ax._max[0].val,
118+
i;
119+
120+
for(i = 1; i < ax._min.length; i++) {
121+
if(minmin !== maxmax) break;
122+
minmin = Math.min(minmin, ax._min[i].val);
123+
}
124+
for(i = 1; i < ax._max.length; i++) {
125+
if(minmin !== maxmax) break;
126+
maxmax = Math.max(maxmax, ax._max[i].val);
127+
}
128+
129+
var j,minpt,maxpt,minbest,maxbest,dp,dv,
130+
mbest = 0,
131+
axReverse = (ax.range && ax.range[1]<ax.range[0]);
132+
133+
// one-time setting to easily reverse the axis
134+
// when plotting from code
135+
if(ax.autorange === 'reversed') {
136+
axReverse = true;
137+
ax.autorange = true;
138+
}
139+
140+
for(i=0; i<ax._min.length; i++) {
141+
minpt = ax._min[i];
142+
for(j=0; j<ax._max.length; j++) {
143+
maxpt = ax._max[j];
144+
dv = maxpt.val-minpt.val;
145+
dp = ax._length-minpt.pad-maxpt.pad;
146+
if(dv>0 && dp>0 && dv/dp > mbest) {
147+
minbest = minpt;
148+
maxbest = maxpt;
149+
mbest = dv/dp;
151150
}
152151
}
153-
if(minmin===maxmax) {
154-
ax.range = axReverse ?
155-
[minmin+1, ax.rangemode!=='normal' ? 0 : minmin-1] :
156-
[ax.rangemode!=='normal' ? 0 : minmin-1, minmin+1];
157-
}
158-
else if(mbest) {
159-
if(ax.type==='linear' || ax.type==='-') {
160-
if(ax.rangemode==='tozero' && minbest.val>=0) {
152+
}
153+
154+
if(minmin === maxmax) {
155+
newRange = axReverse ?
156+
[minmin+1, ax.rangemode!=='normal' ? 0 : minmin-1] :
157+
[ax.rangemode!=='normal' ? 0 : minmin-1, minmin+1];
158+
}
159+
else if(mbest) {
160+
if(ax.type==='linear' || ax.type==='-') {
161+
if(ax.rangemode==='tozero' && minbest.val>=0) {
162+
minbest = {val: 0, pad: 0};
163+
}
164+
else if(ax.rangemode==='nonnegative') {
165+
if(minbest.val - mbest*minbest.pad<0) {
161166
minbest = {val: 0, pad: 0};
162167
}
163-
else if(ax.rangemode==='nonnegative') {
164-
if(minbest.val - mbest*minbest.pad<0) {
165-
minbest = {val: 0, pad: 0};
166-
}
167-
if(maxbest.val<0) {
168-
maxbest = {val: 1, pad: 0};
169-
}
168+
if(maxbest.val<0) {
169+
maxbest = {val: 1, pad: 0};
170170
}
171-
172-
// in case it changed again...
173-
mbest = (maxbest.val-minbest.val) /
174-
(ax._length-minbest.pad-maxbest.pad);
175171
}
176172

177-
ax.range = [
178-
minbest.val - mbest*minbest.pad,
179-
maxbest.val + mbest*maxbest.pad
180-
];
173+
// in case it changed again...
174+
mbest = (maxbest.val-minbest.val) /
175+
(ax._length-minbest.pad-maxbest.pad);
176+
}
181177

182-
// don't let axis have zero size
183-
if(ax.range[0]===ax.range[1]) {
184-
ax.range = [ax.range[0]-1, ax.range[0]+1];
185-
}
178+
newRange = [
179+
minbest.val - mbest*minbest.pad,
180+
maxbest.val + mbest*maxbest.pad
181+
];
186182

187-
// maintain reversal
188-
if(axReverse) {
189-
ax.range.reverse();
190-
}
183+
// don't let axis have zero size
184+
if(newRange[0] === newRange[1]) {
185+
newRange = [newRange[0]-1, newRange[0]+1];
191186
}
192187

188+
// maintain reversal
189+
if(axReverse) {
190+
newRange.reverse();
191+
}
192+
}
193+
194+
return newRange;
195+
};
196+
197+
axes.doAutoRange = function(ax) {
198+
if(!ax._length) ax.setScale();
199+
200+
// TODO do we really need this?
201+
var hasDeps = (ax._min && ax._max && ax._min.length && ax._max.length);
202+
203+
console.log('in do autorange')
204+
205+
if(ax.autorange && hasDeps) {
206+
ax.range = axes.getAutoRange(ax);
207+
193208
// doAutoRange will get called on fullLayout,
194209
// but we want to report its results back to layout
195210
var axIn = ax._gd.layout[ax._name];
211+
196212
if(!axIn) ax._gd.layout[ax._name] = axIn = {};
197-
if(axIn!==ax) {
213+
214+
if(axIn !== ax) {
198215
axIn.range = ax.range.slice();
199216
axIn.autorange = ax.autorange;
200217
}
@@ -241,12 +258,14 @@ axes.saveRangeInitial = function(gd, overwrite) {
241258
// and make it a tight bound if possible
242259
var FP_SAFE = Number.MAX_VALUE/2;
243260
axes.expand = function(ax, data, options) {
244-
if(!ax.autorange || !data) return;
261+
if(!(ax.autorange || (ax.rangeslider || {}).visible) || !data) return;
245262
if(!ax._min) ax._min = [];
246263
if(!ax._max) ax._max = [];
247264
if(!options) options = {};
248265
if(!ax._m) ax.setScale();
249266

267+
console.log('in exapnd', ax._name)
268+
250269
var len = data.length,
251270
extrappad = options.padded ? ax._length*0.05 : 0,
252271
tozero = options.tozero && (ax.type==='linear' || ax.type==='-'),

0 commit comments

Comments
 (0)