X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;ds=sidebyside;f=plugins%2Flegend.js;h=71dd7f1bc4ef55ccda9d700fcb1a96684a0c0d0d;hb=9901b0c18bb8762ae600fa1178d7d38eefbaf45e;hp=2ff939879e74a2c55aa064faddad4c8b703f49b5;hpb=f0fa05e0157961128892a50fe022d94fa682e89c;p=dygraphs.git diff --git a/plugins/legend.js b/plugins/legend.js index 2ff9398..71dd7f1 100644 --- a/plugins/legend.js +++ b/plugins/legend.js @@ -7,17 +7,14 @@ Dygraph.Plugins.Legend = (function() { /* - Current bits of jankiness: - Uses two private APIs: 1. Dygraph.optionsViewForAxis_ 2. dygraph.plotter_.area - Registers for a "predraw" event, which should be renamed. - I call calculateEmWidthInDiv more often than needed. - */ -/*jshint globalstrict: true */ /*global Dygraph:false */ "use strict"; @@ -38,7 +35,7 @@ legend.prototype.toString = function() { }; // (defined below) -var generateLegendHTML, generateLegendDashHTML; +var generateLegendDashHTML; /** * This is called during the dygraph constructor, after options have been set @@ -88,7 +85,7 @@ legend.prototype.activate = function(g) { try { div.style[name] = messagestyle[name]; } catch (e) { - Dygraph.warn("You are using unsupported css properties for your " + + console.warn("You are using unsupported css properties for your " + "browser in labelsDivStyles"); } } @@ -128,16 +125,51 @@ legend.prototype.select = function(e) { var xValue = e.selectedX; var points = e.selectedPoints; - var html = generateLegendHTML(e.dygraph, xValue, points, this.one_em_width_); + var legendMode = e.dygraph.getOption('legend'); + if (legendMode === 'never') { + this.legend_div_.style.display = 'none'; + return; + } + + if (legendMode === 'follow') { + // create floating legend div + var area = e.dygraph.plotter_.area; + var labelsDivWidth = e.dygraph.getOption('labelsDivWidth'); + var yAxisLabelWidth = e.dygraph.getOptionForAxis('axisLabelWidth', 'y'); + // determine floating [left, top] coordinates of the legend div + // within the plotter_ area + // offset 20 px to the right and down from the first selection point + // 20 px is guess based on mouse cursor size + var leftLegend = points[0].x * area.w + 20; + var topLegend = points[0].y * area.h - 20; + + // if legend floats to end of the window area, it flips to the other + // side of the selection point + if ((leftLegend + labelsDivWidth + 1) > (window.scrollX + window.innerWidth)) { + leftLegend = leftLegend - 2 * 20 - labelsDivWidth - (yAxisLabelWidth - area.x); + } + + e.dygraph.graphDiv.appendChild(this.legend_div_); + this.legend_div_.style.left = yAxisLabelWidth + leftLegend + "px"; + this.legend_div_.style.top = topLegend + "px"; + } + + var html = legend.generateLegendHTML(e.dygraph, xValue, points, this.one_em_width_); this.legend_div_.innerHTML = html; + this.legend_div_.style.display = ''; }; legend.prototype.deselect = function(e) { + var legendMode = e.dygraph.getOption('legend'); + if (legendMode !== 'always') { + this.legend_div_.style.display = "none"; + } + // Have to do this every time, since styles might have changed. var oneEmWidth = calculateEmWidthInDiv(this.legend_div_); this.one_em_width_ = oneEmWidth; - var html = generateLegendHTML(e.dygraph, undefined, undefined, oneEmWidth); + var html = legend.generateLegendHTML(e.dygraph, undefined, undefined, oneEmWidth); this.legend_div_.innerHTML = html; }; @@ -187,7 +219,7 @@ legend.prototype.destroy = function() { * relevant when displaying a legend with no selection (i.e. {legend: * 'always'}) and with dashed lines. */ -generateLegendHTML = function(g, x, sel_points, oneEmWidth) { +legend.generateLegendHTML = function(g, x, sel_points, oneEmWidth) { // TODO(danvk): deprecate this option in place of {legend: 'never'} if (g.getOption('showLabelsOnHighlight') !== true) return ''; @@ -249,7 +281,7 @@ generateLegendHTML = function(g, x, sel_points, oneEmWidth) { // TODO(danvk): use a template string here and make it an attribute. html += "" + " " + - escapeHTML(pt.name) + ": " + yval + ""; + escapeHTML(pt.name) + ": " + yval + ""; } return html; }; @@ -267,10 +299,6 @@ generateLegendHTML = function(g, x, sel_points, oneEmWidth) { * @private */ generateLegendDashHTML = function(strokePattern, color, oneEmWidth) { - // IE 7,8 fail at these divs, so they get boring legend, have not tested 9. - var isIE = (/MSIE/.test(navigator.userAgent) && !window.opera); - if (isIE) return "—"; - // Easy, common case: a solid line if (!strokePattern || strokePattern.length <= 1) { return "