- Fix vertical zoom problem where a data update would cause the zoom to be lost.
authorNeal Nelson <neal@makalumedia.com>
Tue, 2 Nov 2010 09:56:45 +0000 (10:56 +0100)
committerNeal Nelson <neal@makalumedia.com>
Tue, 2 Nov 2010 09:56:45 +0000 (10:56 +0100)
- Added zoomed indicator flags.

dygraph.js
tests/zoom.html

index b909aa7..0fcb57f 100644 (file)
@@ -182,6 +182,11 @@ Dygraph.prototype.__init__ = function(div, file, attrs) {
   this.is_initial_draw_ = true;
   this.annotations_ = [];
 
+  // Zoomed indicators - These indicate when the graph has been zoomed and on what axis.
+  this.zoomed = false;
+  this.zoomedX = false;
+  this.zoomedY = false;
+
   // Clear the div. This ensure that, if multiple dygraphs are passed the same
   // div, then only one will be drawn.
   div.innerHTML = "";
@@ -1074,6 +1079,8 @@ Dygraph.prototype.doZoomX_ = function(lowX, highX) {
  */
 Dygraph.prototype.doZoomXDates_ = function(minDate, maxDate) {
   this.dateWindow_ = [minDate, maxDate];
+  this.zoomed = true;
+  this.zoomedX = true;
   this.drawGraph_();
   if (this.attr_("zoomCallback")) {
     var yRange = this.yAxisRange();
@@ -1102,10 +1109,13 @@ Dygraph.prototype.doZoomY_ = function(lowY, highY) {
     valueRanges.push([low[1], hi[1]]);
   }
 
+  this.zoomed = true;
+  this.zoomedY = true;
   this.drawGraph_();
   if (this.attr_("zoomCallback")) {
     var xRange = this.xAxisRange();
-    this.attr_("zoomCallback")(xRange[0], xRange[1], this.yAxisRanges());
+    var yRange = this.yAxisRange();
+    this.attr_("zoomCallback")(xRange[0], xRange[1], yRange[0], yRange[1]);
   }
 };
 
@@ -1132,6 +1142,9 @@ Dygraph.prototype.doUnzoom_ = function() {
   if (dirty) {
     // Putting the drawing operation before the callback because it resets
     // yAxisRange.
+    this.zoomed = false;
+    this.zoomedX = false;
+    this.zoomedY = false;
     this.drawGraph_();
     if (this.attr_("zoomCallback")) {
       var minDate = this.rawData_[0][0];
@@ -1970,6 +1983,15 @@ Dygraph.prototype.drawGraph_ = function() {
  *   indices are into the axes_ array.
  */
 Dygraph.prototype.computeYAxes_ = function() {
+  var valueWindow;
+  if (this.axes_ != undefined) {
+    // Preserve valueWindow settings.
+    valueWindow = [];
+    for (var index = 0; index < this.axes_.length; index++) {
+      valueWindow.push(this.axes_[index].valueWindow);
+    }
+  }
+
   this.axes_ = [{}];  // always have at least one y-axis.
   this.seriesToAxisMap_ = {};
 
@@ -2042,6 +2064,13 @@ Dygraph.prototype.computeYAxes_ = function() {
     if (vis[i - 1]) seriesToAxisFiltered[s] = this.seriesToAxisMap_[s];
   }
   this.seriesToAxisMap_ = seriesToAxisFiltered;
+
+  if (valueWindow != undefined) {
+    // Restore valueWindow settings.
+    for (var index = 0; index < valueWindow.length; index++) {
+      this.axes_[index].valueWindow = valueWindow[index];
+    }
+  }
 };
 
 /**
index 62252a1..8c9e641 100644 (file)
     buttons are useful for testing.</h3>
     <h4>Window coordinates (in dates and values):</h4>
     <div id="xdimensions"></div> <div id="ydimensions"></div>
+    <div style="float: right">
+        <p>Zoomed: <span id="zoomed">False</span><p/>
+        <p>Zoomed X: <span id="zoomedX">False</span><p/>
+        <p>Zoomed Y: <span id="zoomedY">False</span><p/>
+    </div>
     <div id="div_g" style="width:600px; height:300px;"></div>
 
+
     <p><b>Zoom operations:</b></p>
     <p>
       <input type="button" value="Y (3,5)" onclick="zoomGraphY(3,5)">&nbsp;
             document.getElementById("div_g"),
             NoisyData, {
               errorBars: true,
-              zoomCallback : function(a,b,c,d) { showDimensions(a,b,c,d); }
+              zoomCallback : function(a,b,c,d) {
+                showDimensions(a,b,c,d);
+              },
+              drawCallback: function(me, initial) {
+                document.getElementById("zoomed").innerHTML = me.zoomed ? "True" : "False";
+                document.getElementById("zoomedX").innerHTML = me.zoomedX ? "True" : "False";
+                document.getElementById("zoomedY").innerHTML = me.zoomedY ? "True" : "False";
+              }
             }
           );