X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph.js;h=d95f9be544626dc3acc9f1007a9857c5a7f098ff;hb=11ce506e365f0dfb3a2b489847b5a24d27fe1f9d;hp=07f2a22f3987b5c1eac82e1d7d7048351d94d06b;hpb=1bc8821664d275b8aaeceaa5a3281c90724b7b4c;p=dygraphs.git diff --git a/dygraph.js b/dygraph.js index 07f2a22..d95f9be 100644 --- a/dygraph.js +++ b/dygraph.js @@ -288,6 +288,7 @@ Dygraph.DEFAULT_ATTRS = { // TODO(danvk): support 'onmouseover' and 'never', and remove synonyms. legend: 'onmouseover', // the only relevant value at the moment is 'always'. + legendFollow: false, stepPlot: false, avoidMinZero: false, @@ -585,6 +586,22 @@ Dygraph.prototype.cascadeEvents_ = function(name, extra_props) { }; /** + * Fetch a plugin instance of a particular class. Only for testing. + * @private + * @param {!Class} type The type of the plugin. + * @return {Object} Instance of the plugin, or null if there is none. + */ +Dygraph.prototype.getPluginInstance_ = function(type) { + for (var i = 0; i < this.plugins_.length; i++) { + var p = this.plugins_[i]; + if (p.plugin instanceof type) { + return p.plugin; + } + } + return null; +}; + +/** * Returns the zoomed status of the chart for one or both axes. * * Axis is an optional parameter. Can be set to 'x' or 'y'. @@ -1042,11 +1059,11 @@ Dygraph.prototype.createInterface_ = function() { // ... and for static parts of the chart. this.hidden_ = this.createPlotKitCanvas_(this.canvas_); - this.resizeElements_(); - this.canvas_ctx_ = Dygraph.getContext(this.canvas_); this.hidden_ctx_ = Dygraph.getContext(this.hidden_); + this.resizeElements_(); + // The interactive parts of the graph are drawn on top of the chart. this.graphDiv.appendChild(this.hidden_); this.graphDiv.appendChild(this.canvas_); @@ -1092,14 +1109,24 @@ Dygraph.prototype.createInterface_ = function() { Dygraph.prototype.resizeElements_ = function() { this.graphDiv.style.width = this.width_ + "px"; this.graphDiv.style.height = this.height_ + "px"; - this.canvas_.width = this.width_; - this.canvas_.height = this.height_; + + var canvasScale = Dygraph.getContextPixelRatio(this.canvas_ctx_); + this.canvas_.width = this.width_ * canvasScale; + this.canvas_.height = this.height_ * canvasScale; this.canvas_.style.width = this.width_ + "px"; // for IE this.canvas_.style.height = this.height_ + "px"; // for IE - this.hidden_.width = this.width_; - this.hidden_.height = this.height_; + if (canvasScale !== 1) { + this.canvas_ctx_.scale(canvasScale, canvasScale); + } + + var hiddenScale = Dygraph.getContextPixelRatio(this.hidden_ctx_); + this.hidden_.width = this.width_ * hiddenScale; + this.hidden_.height = this.height_ * hiddenScale; this.hidden_.style.width = this.width_ + "px"; // for IE this.hidden_.style.height = this.height_ + "px"; // for IE + if (hiddenScale !== 1) { + this.hidden_ctx_.scale(hiddenScale, hiddenScale); + } }; /** @@ -1231,7 +1258,7 @@ Dygraph.prototype.setColors_ = function() { * Return the list of colors. This is either the list of colors passed in the * attributes or the autogenerated list of rgb(r,g,b) strings. * This does not return colors for invisible series. - * @return {Array} The list of colors. + * @return {Array.} The list of colors. */ Dygraph.prototype.getColors = function() { return this.colors_; @@ -2011,7 +2038,7 @@ Dygraph.prototype.updateSelection_ = function(opt_animFraction) { ctx.lineWidth = this.getNumericOption('strokeWidth', pt.name); ctx.strokeStyle = color; ctx.fillStyle = color; - callback(this.g, pt.name, ctx, canvasx, pt.canvasy, + callback(this, pt.name, ctx, canvasx, pt.canvasy, color, circleSize, pt.idx); } ctx.restore(); @@ -2350,18 +2377,22 @@ Dygraph.stackPoints_ = function( var actualYval = point.yval; if (isNaN(actualYval) || actualYval === null) { - // Interpolate/extend for stacking purposes if possible. - updateNextPoint(i); - if (prevPoint && nextPoint && fillMethod != 'none') { - // Use linear interpolation between prevPoint and nextPoint. - actualYval = prevPoint.yval + (nextPoint.yval - prevPoint.yval) * - ((xval - prevPoint.xval) / (nextPoint.xval - prevPoint.xval)); - } else if (prevPoint && fillMethod == 'all') { - actualYval = prevPoint.yval; - } else if (nextPoint && fillMethod == 'all') { - actualYval = nextPoint.yval; - } else { + if(fillMethod == 'none') { actualYval = 0; + } else { + // Interpolate/extend for stacking purposes if possible. + updateNextPoint(i); + if (prevPoint && nextPoint && fillMethod != 'none') { + // Use linear interpolation between prevPoint and nextPoint. + actualYval = prevPoint.yval + (nextPoint.yval - prevPoint.yval) * + ((xval - prevPoint.xval) / (nextPoint.xval - prevPoint.xval)); + } else if (prevPoint && fillMethod == 'all') { + actualYval = prevPoint.yval; + } else if (nextPoint && fillMethod == 'all') { + actualYval = nextPoint.yval; + } else { + actualYval = 0; + } } } else { prevPoint = point; @@ -3050,12 +3081,12 @@ Dygraph.prototype.parseCSV_ = function(data) { }; /** - * @private * The user has provided their data as a pre-packaged JS array. If the x values * are numeric, this is the same as dygraphs' internal format. If the x values * are dates, we need to convert them from Date objects to ms since epoch. - * @param {[Object]} data - * @return {[Object]} data with numeric x values. + * @param {!Array} data + * @return {Object} data with numeric x values. + * @private */ Dygraph.prototype.parseArray_ = function(data) { // Peek at the first x value to see if it's numeric. @@ -3324,12 +3355,13 @@ Dygraph.prototype.start_ = function() { * There's a huge variety of options that can be passed to this method. For a * full list, see http://dygraphs.com/options.html. * - * @param {Object} attrs The new properties and values - * @param {Boolean} [block_redraw] Usually the chart is redrawn after every - * call to updateOptions(). If you know better, you can pass true to explicitly - * block the redraw. This can be useful for chaining updateOptions() calls, - * avoiding the occasional infinite loop and preventing redraws when it's not - * necessary (e.g. when updating a callback). + * @param {Object} input_attrs The new properties and values + * @param {boolean} block_redraw Usually the chart is redrawn after every + * call to updateOptions(). If you know better, you can pass true to + * explicitly block the redraw. This can be useful for chaining + * updateOptions() calls, avoiding the occasional infinite loop and + * preventing redraws when it's not necessary (e.g. when updating a + * callback). */ Dygraph.prototype.updateOptions = function(input_attrs, block_redraw) { if (typeof(block_redraw) == 'undefined') block_redraw = false;