projects
/
dygraphs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Get it under 80 chars per line
[dygraphs.git]
/
extras
/
synchronizer.js
diff --git
a/extras/synchronizer.js
b/extras/synchronizer.js
index
228390e
..
f39209b
100644
(file)
--- a/
extras/synchronizer.js
+++ b/
extras/synchronizer.js
@@
-20,13
+20,16
@@
*
* The default is to synchronize both of these.
*
*
* The default is to synchronize both of these.
*
- * Instead of passing one Dygraph objet as each parameter, you may also pass an
+ * Instead of passing one Dygraph obje
c
t as each parameter, you may also pass an
* array of dygraphs:
*
* var sync = Dygraph.synchronize([g1, g2, g3], {
* selection: false,
* zoom: true
* });
* array of dygraphs:
*
* var sync = Dygraph.synchronize([g1, g2, g3], {
* selection: false,
* zoom: true
* });
+ *
+ * You may also set `range: false` if you wish to only sync the x-axis.
+ * The `range` option has no effect unless `zoom` is true (the default).
*/
(function() {
/* global Dygraph:false */
*/
(function() {
/* global Dygraph:false */
@@
-37,14
+40,20
@@
Dygraph.synchronize = function(/* dygraphs..., opts */) {
throw 'Invalid invocation of Dygraph.synchronize(). Need >= 1 argument.';
}
throw 'Invalid invocation of Dygraph.synchronize(). Need >= 1 argument.';
}
- var OPTIONS = ['selection', 'zoom', '
syncR
ange'];
+ var OPTIONS = ['selection', 'zoom', '
r
ange'];
var opts = {
selection: true,
zoom: true,
var opts = {
selection: true,
zoom: true,
-
syncR
ange: true
+
r
ange: true
};
var dygraphs = [];
};
var dygraphs = [];
+ var prevCallbacks = {
+ draw: null,
+ highlight: null,
+ unhighlight: null
+ };
+
var parseOpts = function(obj) {
if (!(obj instanceof Object)) {
throw 'Last argument must be either Dygraph or Object.';
var parseOpts = function(obj) {
if (!(obj instanceof Object)) {
throw 'Last argument must be either Dygraph or Object.';
@@
-94,16
+103,11
@@
Dygraph.synchronize = function(/* dygraphs..., opts */) {
// Listen for draw, highlight, unhighlight callbacks.
if (opts.zoom) {
// Listen for draw, highlight, unhighlight callbacks.
if (opts.zoom) {
- if (opts.syncRange) {
- attachZoomHandlers(dygraphs,true);
- }
- else {
- attachZoomHandlers(dygraphs,false);
- }
+ attachZoomHandlers(dygraphs, opts, prevCallbacks);
}
if (opts.selection) {
}
if (opts.selection) {
- attachSelectionHandlers(dygraphs);
+ attachSelectionHandlers(dygraphs
, prevCallbacks
);
}
return {
}
return {
@@
-111,46
+115,41
@@
Dygraph.synchronize = function(/* dygraphs..., opts */) {
for (var i = 0; i < dygraphs.length; i++) {
var g = dygraphs[i];
if (opts.zoom) {
for (var i = 0; i < dygraphs.length; i++) {
var g = dygraphs[i];
if (opts.zoom) {
- g.updateOptions({drawCallback:
null
});
+ g.updateOptions({drawCallback:
prevCallbacks.draw
});
}
if (opts.selection) {
g.updateOptions({
}
if (opts.selection) {
g.updateOptions({
- highlightCallback:
null
,
- unhighlightCallback:
null
+ highlightCallback:
prevCallbacks.highlight
,
+ unhighlightCallback:
prevCallbacks.unhighlight
});
}
}
// release references & make subsequent calls throw.
dygraphs = null;
opts = null;
});
}
}
// release references & make subsequent calls throw.
dygraphs = null;
opts = null;
+ prevCallbacks = null;
}
};
};
}
};
};
-// TODO: call any `drawCallback`s that were set before this.
-function attachZoomHandlers(gs,syncRange) {
+function attachZoomHandlers(gs, syncOpts, prevCallbacks) {
var block = false;
for (var i = 0; i < gs.length; i++) {
var g = gs[i];
var block = false;
for (var i = 0; i < gs.length; i++) {
var g = gs[i];
+ prevCallbacks.draw = g.getFunctionOption('drawCallback');
g.updateOptions({
drawCallback: function(me, initial) {
g.updateOptions({
drawCallback: function(me, initial) {
+ if (prevCallbacks.draw) prevCallbacks.draw(me, initial);
if (block || initial) return;
block = true;
if (block || initial) return;
block = true;
- var range = me.xAxisRange();
- var yrange = me.yAxisRange();
+ var opts = {
+ dateWindow: me.xAxisRange()
+ };
+ if (syncOpts.range) opts.valueRange = me.yAxisRange();
+
for (var j = 0; j < gs.length; j++) {
if (gs[j] == me) continue;
for (var j = 0; j < gs.length; j++) {
if (gs[j] == me) continue;
- if (syncRange) {
- gs[j].updateOptions( {
- dateWindow: range,
- valueRange: yrange
- });
- }
- else {
- gs[j].updateOptions( {
- dateWindow: range
- });
- }
+ gs[j].updateOptions(opts);
}
block = false;
}
}
block = false;
}
@@
-158,12
+157,17
@@
function attachZoomHandlers(gs,syncRange) {
}
}
}
}
-function attachSelectionHandlers(gs) {
+function attachSelectionHandlers(gs
, prevCallbacks
) {
var block = false;
for (var i = 0; i < gs.length; i++) {
var g = gs[i];
var block = false;
for (var i = 0; i < gs.length; i++) {
var g = gs[i];
+ prevCallbacks.highlight = g.getFunctionOption('highlightCallback');
+ prevCallbacks.unhighlight = g.getFunctionOption('unhighlightCallback');
g.updateOptions({
highlightCallback: function(event, x, points, row, seriesName) {
g.updateOptions({
highlightCallback: function(event, x, points, row, seriesName) {
+ if (prevCallbacks.highlight) {
+ prevCallbacks.highlight(event, x, points, row, seriesName);
+ }
if (block) return;
block = true;
var me = this;
if (block) return;
block = true;
var me = this;
@@
-177,6
+181,7
@@
function attachSelectionHandlers(gs) {
block = false;
},
unhighlightCallback: function(event) {
block = false;
},
unhighlightCallback: function(event) {
+ if (prevCallbacks.unhighlight) prevCallbacks.unhighlight(event);
if (block) return;
block = true;
var me = this;
if (block) return;
block = true;
var me = this;