From 8518ee95f45b00205c9132e286b94e1aa041cebf Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Tue, 20 Dec 2016 23:48:15 -0500 Subject: [PATCH 01/12] refactor annotations.draw, add standoff and anchor with arrow --- .../annotations/annotation_defaults.js | 3 +- src/components/annotations/arrow_paths.js | 5 +- src/components/annotations/attributes.js | 27 +- src/components/annotations/calc_autorange.js | 64 +-- src/components/annotations/draw.js | 366 +++++++++--------- src/components/annotations/draw_arrow_head.js | 27 +- .../image/baselines/annotations-autorange.png | Bin 31636 -> 33494 bytes test/image/mocks/annotations-autorange.json | 10 +- test/image/mocks/annotations.json | 10 +- test/jasmine/tests/transition_test.js | 3 +- 10 files changed, 290 insertions(+), 225 deletions(-) diff --git a/src/components/annotations/annotation_defaults.js b/src/components/annotations/annotation_defaults.js index ecdb1edf547..84f287463e7 100644 --- a/src/components/annotations/annotation_defaults.js +++ b/src/components/annotations/annotation_defaults.js @@ -75,7 +75,7 @@ module.exports = function handleAnnotationDefaults(annIn, annOut, fullLayout, op } // xanchor, yanchor - else coerce(axLetter + 'anchor'); + coerce(axLetter + 'anchor'); } // if you have one coordinate you should have both @@ -86,6 +86,7 @@ module.exports = function handleAnnotationDefaults(annIn, annOut, fullLayout, op coerce('arrowhead'); coerce('arrowsize'); coerce('arrowwidth', ((borderOpacity && borderWidth) || 1) * 2); + coerce('standoff'); // if you have one part of arrow length you should have both Lib.noneOrAll(annIn, annOut, ['ax', 'ay']); diff --git a/src/components/annotations/arrow_paths.js b/src/components/annotations/arrow_paths.js index 47245af49e5..2454db7e209 100644 --- a/src/components/annotations/arrow_paths.js +++ b/src/components/annotations/arrow_paths.js @@ -21,7 +21,10 @@ module.exports = [ // no arrow - '', + { + path: '', + backoff: 0 + }, // wide with flat back { path: 'M-2.4,-3V3L0.6,0Z', diff --git a/src/components/annotations/attributes.js b/src/components/annotations/attributes.js index 8097575cf40..05f38c232b9 100644 --- a/src/components/annotations/attributes.js +++ b/src/components/annotations/attributes.js @@ -140,6 +140,17 @@ module.exports = { role: 'style', description: 'Sets the width (in px) of annotation arrow.' }, + standoff: { + valType: 'number', + min: 0, + dflt: 0, + role: 'style', + description: [ + 'Sets a distance, in pixels, to move the arrowhead away from the', + 'position it is pointing at, for example to point at the edge of', + 'a marker independent of zoom.' + ].join(' ') + }, ax: { valType: 'any', role: 'info', @@ -236,7 +247,7 @@ module.exports = { dflt: 'auto', role: 'info', description: [ - 'Sets the annotation\'s horizontal position anchor', + 'Sets the text box\'s horizontal position anchor', 'This anchor binds the `x` position to the *left*, *center*', 'or *right* of the annotation.', 'For example, if `x` is set to 1, `xref` to *paper* and', @@ -244,9 +255,9 @@ module.exports = { 'annotation lines up with the right-most edge of the', 'plotting area.', 'If *auto*, the anchor is equivalent to *center* for', - 'data-referenced annotations', - 'whereas for paper-referenced, the anchor picked corresponds', - 'to the closest side.' + 'data-referenced annotations or if there is an arrow,', + 'whereas for paper-referenced with no arrow, the anchor picked', + 'corresponds to the closest side.' ].join(' ') }, yref: { @@ -286,7 +297,7 @@ module.exports = { dflt: 'auto', role: 'info', description: [ - 'Sets the annotation\'s vertical position anchor', + 'Sets the text box\'s vertical position anchor', 'This anchor binds the `y` position to the *top*, *middle*', 'or *bottom* of the annotation.', 'For example, if `y` is set to 1, `yref` to *paper* and', @@ -294,9 +305,9 @@ module.exports = { 'annotation lines up with the top-most edge of the', 'plotting area.', 'If *auto*, the anchor is equivalent to *middle* for', - 'data-referenced annotations', - 'whereas for paper-referenced, the anchor picked corresponds', - 'to the closest side.' + 'data-referenced annotations or if there is an arrow,', + 'whereas for paper-referenced with no arrow, the anchor picked', + 'corresponds to the closest side.' ].join(' ') }, diff --git a/src/components/annotations/calc_autorange.js b/src/components/annotations/calc_autorange.js index 9046863bf81..1926732cf35 100644 --- a/src/components/annotations/calc_autorange.js +++ b/src/components/annotations/calc_autorange.js @@ -47,39 +47,47 @@ function annAutorange(gd) { // as the whole anno may include hidden text in its bbox fullLayout.annotations.forEach(function(ann) { var xa = Axes.getFromId(gd, ann.xref), - ya = Axes.getFromId(gd, ann.yref); - - if(!(xa || ya)) return; - - var halfWidth = (ann._xsize || 0) / 2, - xShift = ann._xshift || 0, - halfHeight = (ann._ysize || 0) / 2, - yShift = ann._yshift || 0, - leftSize = halfWidth - xShift, - rightSize = halfWidth + xShift, - topSize = halfHeight - yShift, - bottomSize = halfHeight + yShift; - - if(ann.showarrow) { - var headSize = 3 * ann.arrowsize * ann.arrowwidth; - leftSize = Math.max(leftSize, headSize); - rightSize = Math.max(rightSize, headSize); - topSize = Math.max(topSize, headSize); - bottomSize = Math.max(bottomSize, headSize); - } + ya = Axes.getFromId(gd, ann.yref), + headSize = 3 * ann.arrowsize * ann.arrowwidth || 0; if(xa && xa.autorange) { - Axes.expand(xa, [xa.r2c(ann.x)], { - ppadplus: rightSize, - ppadminus: leftSize - }); + if(ann.axref === ann.xref) { + // expand for the arrowhead (padded by arrowhead) + Axes.expand(xa, [xa.r2c(ann.x)], { + ppadplus: headSize, + ppadminus: headSize + }); + // again for the textbox (padded by textbox) + Axes.expand(xa, [xa.r2c(ann.ax)], { + ppadplus: ann._xpadplus, + ppadminus: ann._xpadminus + }); + } + else { + Axes.expand(xa, [xa.r2c(ann.x)], { + ppadplus: Math.max(ann._xpadplus, headSize), + ppadminus: Math.max(ann._xpadminus, headSize) + }); + } } if(ya && ya.autorange) { - Axes.expand(ya, [ya.r2c(ann.y)], { - ppadplus: bottomSize, - ppadminus: topSize - }); + if(ann.ayref === ann.yref) { + Axes.expand(ya, [ya.r2c(ann.y)], { + ppadplus: headSize, + ppadminus: headSize + }); + Axes.expand(ya, [ya.r2c(ann.ay)], { + ppadplus: ann._ypadplus, + ppadminus: ann._ypadminus + }); + } + else { + Axes.expand(ya, [ya.r2c(ann.y)], { + ppadplus: Math.max(ann._ypadplus, headSize), + ppadminus: Math.max(ann._ypadminus, headSize) + }); + } } }); } diff --git a/src/components/annotations/draw.js b/src/components/annotations/draw.js index e9496af0d3f..01705f89c27 100644 --- a/src/components/annotations/draw.js +++ b/src/components/annotations/draw.js @@ -24,7 +24,7 @@ var dragElement = require('../dragelement'); var handleAnnotationDefaults = require('./annotation_defaults'); var supplyLayoutDefaults = require('./defaults'); -var arrowhead = require('./draw_arrow_head'); +var drawArrowHead = require('./draw_arrow_head'); // Annotations are stored in gd.layout.annotations, an array of objects @@ -248,14 +248,17 @@ function drawOne(gd, index, opt, value) { var xa = Axes.getFromId(gd, options.xref), ya = Axes.getFromId(gd, options.yref), - annPosPx = {x: 0, y: 0}, + + // calculated pixel positions + // x & y each will get text, head, and tail as appropriate + annPosPx = {x: {}, y: {}}, textangle = +options.textangle || 0; // create the components // made a single group to contain all, so opacity can work right // with border/arrow together this could handle a whole bunch of // cleanup at this point, but works for now - var anngroup = fullLayout._infolayer.append('g') + var annGroup = fullLayout._infolayer.append('g') .classed('annotation', true) .attr('data-index', String(index)) .style('opacity', options.opacity) @@ -269,17 +272,17 @@ function drawOne(gd, index, opt, value) { }); // another group for text+background so that they can rotate together - var anng = anngroup.append('g') + var annTextGroup = annGroup.append('g') .classed('annotation-text-g', true) .attr('data-index', String(index)); - var ann = anng.append('g'); + var annTextGroupInner = annTextGroup.append('g'); var borderwidth = options.borderwidth, borderpad = options.borderpad, borderfull = borderwidth + borderpad; - var annbg = ann.append('rect') + var annTextBG = annTextGroupInner.append('rect') .attr('class', 'bg') .style('stroke-width', borderwidth + 'px') .call(Color.stroke, options.bordercolor) @@ -287,7 +290,7 @@ function drawOne(gd, index, opt, value) { var font = options.font; - var anntext = ann.append('text') + var annText = annTextGroupInner.append('text') .classed('annotation', true) .attr('data-unformatted', options.text) .text(options.text); @@ -309,12 +312,12 @@ function drawOne(gd, index, opt, value) { // make sure lines are aligned the way they will be // at the end, even if their position changes - anntext.selectAll('tspan.line').attr({y: 0, x: 0}); + annText.selectAll('tspan.line').attr({y: 0, x: 0}); - var mathjaxGroup = ann.select('.annotation-math-group'), + var mathjaxGroup = annTextGroupInner.select('.annotation-math-group'), hasMathjax = !mathjaxGroup.empty(), anntextBB = Drawing.bBox( - (hasMathjax ? mathjaxGroup : anntext).node()), + (hasMathjax ? mathjaxGroup : annText).node()), annwidth = anntextBB.width, annheight = anntextBB.height, outerwidth = Math.round(annwidth + 2 * borderfull), @@ -344,22 +347,37 @@ function drawOne(gd, index, opt, value) { var annotationIsOffscreen = false; ['x', 'y'].forEach(function(axLetter) { var axRef = options[axLetter + 'ref'] || axLetter, + tailRef = options['a' + axLetter + 'ref'], ax = Axes.getFromId(gd, axRef), - dimAngle = (textangle + (axLetter === 'x' ? 0 : 90)) * Math.PI / 180, - annSize = outerwidth * Math.abs(Math.cos(dimAngle)) + - outerheight * Math.abs(Math.sin(dimAngle)), + dimAngle = (textangle + (axLetter === 'x' ? 0 : -90)) * Math.PI / 180, + // note that these two can be either positive or negative + annSizeFromWidth = outerwidth * Math.cos(dimAngle), + annSizeFromHeight = outerheight * Math.sin(dimAngle), + // but this one is the positive total size + annSize = Math.abs(annSizeFromWidth) + Math.abs(annSizeFromHeight), anchor = options[axLetter + 'anchor'], - alignPosition; - - // calculate pixel position + posPx = annPosPx[axLetter], + basePx, + textPadShift, + alignPosition, + autoAlignFraction, + textShift; + + /* + * calculate the *primary* pixel position + * which is the arrowhead if there is one, + * otherwise the text anchor point + */ if(ax) { - // hide the annotation if it's pointing - // outside the visible plot (as long as the axis - // isn't autoranged - then we need to draw it - // anyway to get its bounding box) + /* + * hide the annotation if it's pointing + * outside the visible plot (as long as the axis + * isn't autoranged - then we need to draw it + * anyway to get its bounding box) + */ var posFraction = ax.r2fraction(options[axLetter]); if(!ax.autorange && (posFraction < 0 || posFraction > 1)) { - if(options['a' + axLetter + 'ref'] === axRef) { + if(tailRef === axRef) { posFraction = ax.r2fraction(options['a' + axLetter]); if(posFraction < 0 || posFraction > 1) { annotationIsOffscreen = true; @@ -371,139 +389,139 @@ function drawOne(gd, index, opt, value) { if(annotationIsOffscreen) return; } - annPosPx[axLetter] = ax._offset + ax.r2p(options[axLetter]); - alignPosition = 0.5; + basePx = ax._offset + ax.r2p(options[axLetter]); + autoAlignFraction = 0.5; } else { - alignPosition = options[axLetter]; - if(axLetter === 'y') alignPosition = 1 - alignPosition; - annPosPx[axLetter] = (axLetter === 'x') ? - (gs.l + gs.w * alignPosition) : - (gs.t + gs.h * alignPosition); + if(axLetter === 'x') { + alignPosition = options[axLetter]; + basePx = gs.l + gs.w * alignPosition; + } + else { + alignPosition = 1 - options[axLetter]; + basePx = gs.t + gs.h * alignPosition; + } + autoAlignFraction = options.showarrow ? 0.5 : alignPosition; } - var alignShift = 0; - if(options['a' + axLetter + 'ref'] === axRef) { - annPosPx['aa' + axLetter] = ax._offset + ax.r2p(options['a' + axLetter]); - } else { - if(options.showarrow) { - alignShift = options['a' + axLetter]; + // now translate this into pixel positions of head, tail, and text + // as well as paddings for autorange + if(options.showarrow) { + posPx.head = basePx; + + var arrowLength = options['a' + axLetter]; + + // with an arrow, the text rotates around the anchor point + textShift = annSizeFromWidth * shiftFraction(0.5, options.xanchor) - + annSizeFromHeight * shiftFraction(0.5, options.yanchor); + + if(tailRef === axRef) { + posPx.tail = ax._offset + ax.r2p(arrowLength); + // tail is data-referenced: autorange pads the text in px from the tail + textPadShift = textShift; } else { - alignShift = annSize * shiftFraction(alignPosition, anchor); + posPx.tail = basePx + arrowLength; + // tail is specified in px from head, so autorange also pads vs head + textPadShift = textShift + arrowLength; + } + + posPx.text = posPx.tail + textShift; + + // constrain pixel/paper referenced so the draggers are at least + // partially visible + var maxPx = fullLayout[(axLetter === 'x') ? 'width' : 'height']; + if(axRef === 'paper') { + posPx.head = Lib.constrain(posPx.head, 1, maxPx - 1); + } + if(tailRef === 'pixel') { + var shiftPlus = -Math.max(posPx.tail - 3, posPx.text), + shiftMinus = Math.min(posPx.tail + 3, posPx.text) - maxPx; + if(shiftPlus > 0) { + posPx.tail += shiftPlus; + posPx.text += shiftPlus; + } + else if(shiftMinus > 0) { + posPx.tail -= shiftMinus; + posPx.text -= shiftMinus; + } } - annPosPx[axLetter] += alignShift; + } + else { + // with no arrow, the text rotates and *then* we put the anchor + // relative to the new bounding box + textShift = annSize * shiftFraction(autoAlignFraction, anchor); + textPadShift = textShift; + posPx.text = basePx + textShift; } + options['_' + axLetter + 'padplus'] = (annSize / 2) + textPadShift; + options['_' + axLetter + 'padminus'] = (annSize / 2) - textPadShift; + // save the current axis type for later log/linear changes options['_' + axLetter + 'type'] = ax && ax.type; - - // save the size and shift in this dim for autorange - options['_' + axLetter + 'size'] = annSize; - options['_' + axLetter + 'shift'] = alignShift; }); if(annotationIsOffscreen) { - ann.remove(); + annTextGroupInner.remove(); return; } - var arrowX, arrowY; - - // make sure the arrowhead (if there is one) - // and the annotation center are visible - if(options.showarrow) { - if(options.axref === options.xref) { - // we don't want to constrain if the tail is absolute - // or the slope (which is meaningful) will change. - arrowX = annPosPx.x; - } else { - arrowX = Lib.constrain(annPosPx.x - options.ax, 1, fullLayout.width - 1); - } - - if(options.ayref === options.yref) { - // we don't want to constrain if the tail is absolute - // or the slope (which is meaningful) will change. - arrowY = annPosPx.y; - } else { - arrowY = Lib.constrain(annPosPx.y - options.ay, 1, fullLayout.height - 1); - } - } - annPosPx.x = Lib.constrain(annPosPx.x, 1, fullLayout.width - 1); - annPosPx.y = Lib.constrain(annPosPx.y, 1, fullLayout.height - 1); - - var texty = borderfull - anntextBB.top, - textx = borderfull - anntextBB.left; - if(hasMathjax) { mathjaxGroup.select('svg').attr({x: borderfull - 1, y: borderfull}); } else { - anntext.attr({x: textx, y: texty}); - anntext.selectAll('tspan.line').attr({y: texty, x: textx}); + var texty = borderfull - anntextBB.top, + textx = borderfull - anntextBB.left; + annText.attr({x: textx, y: texty}); + annText.selectAll('tspan.line').attr({y: texty, x: textx}); } - annbg.call(Drawing.setRect, borderwidth / 2, borderwidth / 2, + annTextBG.call(Drawing.setRect, borderwidth / 2, borderwidth / 2, outerwidth - borderwidth, outerheight - borderwidth); - var annX = 0, annY = 0; - if(options.axref === options.xref) { - annX = Math.round(annPosPx.aax - outerwidth / 2); - } else { - annX = Math.round(annPosPx.x - outerwidth / 2); - } - - if(options.ayref === options.yref) { - annY = Math.round(annPosPx.aay - outerheight / 2); - } else { - annY = Math.round(annPosPx.y - outerheight / 2); - } - - ann.call(Lib.setTranslate, annX, annY); + annTextGroupInner.call(Lib.setTranslate, + Math.round(annPosPx.x.text - outerwidth / 2), + Math.round(annPosPx.y.text - outerheight / 2)); var annbase = 'annotations[' + index + ']'; - // add the arrow - // uses options[arrowwidth,arrowcolor,arrowhead] for styling + /* + * add the arrow + * uses options[arrowwidth,arrowcolor,arrowhead] for styling + * dx and dy are normally zero, but when you are dragging the textbox + * while the head stays put, dx and dy are the pixel offsets + */ var drawArrow = function(dx, dy) { d3.select(gd) .selectAll('.annotation-arrow-g[data-index="' + index + '"]') .remove(); - // find where to start the arrow: - // at the border of the textbox, if that border is visible, - // or at the edge of the lines of text, if the border is hidden - // TODO: tspan bounding box fails in chrome - // looks like there may be a cross-browser solution, see - // http://stackoverflow.com/questions/5364980/ - // how-to-get-the-width-of-an-svg-tspan-element - var arrowX0, arrowY0; - - if(options.axref === options.xref) { - arrowX0 = annPosPx.aax + dx; - } else { - arrowX0 = annPosPx.x + dx; - } - if(options.ayref === options.yref) { - arrowY0 = annPosPx.aay + dy; - } else { - arrowY0 = annPosPx.y + dy; - } + var headX = annPosPx.x.head, + headY = annPosPx.y.head, + tailX = annPosPx.x.tail + dx, + tailY = annPosPx.y.tail + dy, + textX = annPosPx.x.text + dx, + textY = annPosPx.y.text + dy, - // create transform matrix and related functions - var transform = - Lib.rotationXYMatrix(textangle, arrowX0, arrowY0), + // find the edge of the text box, where we'll start the arrow: + // create transform matrix to rotate the text box corners + transform = Lib.rotationXYMatrix(textangle, textX, textY), applyTransform = Lib.apply2DTransform(transform), applyTransform2 = Lib.apply2DTransform2(transform), // calculate and transform bounding box - xHalf = annbg.attr('width') / 2, - yHalf = annbg.attr('height') / 2, + width = +annTextBG.attr('width'), + height = +annTextBG.attr('height'), + xLeft = textX - 0.5 * width, + xRight = xLeft + width, + yTop = textY - 0.5 * height, + yBottom = yTop + height, edges = [ - [arrowX0 - xHalf, arrowY0 - yHalf, arrowX0 - xHalf, arrowY0 + yHalf], - [arrowX0 - xHalf, arrowY0 + yHalf, arrowX0 + xHalf, arrowY0 + yHalf], - [arrowX0 + xHalf, arrowY0 + yHalf, arrowX0 + xHalf, arrowY0 - yHalf], - [arrowX0 + xHalf, arrowY0 - yHalf, arrowX0 - xHalf, arrowY0 - yHalf] + [xLeft, yTop, xLeft, yBottom], + [xLeft, yBottom, xRight, yBottom], + [xRight, yBottom, xRight, yTop], + [xRight, yTop, xLeft, yTop] ].map(applyTransform2); // Remove the line if it ends inside the box. Use ray @@ -512,7 +530,7 @@ function drawOne(gd, index, opt, value) { // to get the parity of the number of intersections. if(edges.reduce(function(a, x) { return a ^ - !!lineIntersect(arrowX, arrowY, arrowX + 1e6, arrowY + 1e6, + !!lineIntersect(headX, headY, headX + 1e6, headY + 1e6, x[0], x[1], x[2], x[3]); }, false)) { // no line or arrow - so quit drawArrow now @@ -520,50 +538,61 @@ function drawOne(gd, index, opt, value) { } edges.forEach(function(x) { - var p = lineIntersect(arrowX0, arrowY0, arrowX, arrowY, + var p = lineIntersect(tailX, tailY, headX, headY, x[0], x[1], x[2], x[3]); if(p) { - arrowX0 = p.x; - arrowY0 = p.y; + tailX = p.x; + tailY = p.y; } }); var strokewidth = options.arrowwidth, arrowColor = options.arrowcolor; - var arrowgroup = anngroup.append('g') + var arrowGroup = annGroup.append('g') .style({opacity: Color.opacity(arrowColor)}) .classed('annotation-arrow-g', true) .attr('data-index', String(index)); - var arrow = arrowgroup.append('path') - .attr('d', 'M' + arrowX0 + ',' + arrowY0 + 'L' + arrowX + ',' + arrowY) + var arrow = arrowGroup.append('path') + .attr('d', 'M' + tailX + ',' + tailY + 'L' + headX + ',' + headY) .style('stroke-width', strokewidth + 'px') .call(Color.stroke, Color.rgb(arrowColor)); - arrowhead(arrow, options.arrowhead, 'end', options.arrowsize); - - var arrowdrag = arrowgroup.append('path') - .classed('annotation', true) - .classed('anndrag', true) - .attr({ - 'data-index': String(index), - d: 'M3,3H-3V-3H3ZM0,0L' + (arrowX0 - arrowX) + ',' + (arrowY0 - arrowY), - transform: 'translate(' + arrowX + ',' + arrowY + ')' - }) - .style('stroke-width', (strokewidth + 6) + 'px') - .call(Color.stroke, 'rgba(0,0,0,0)') - .call(Color.fill, 'rgba(0,0,0,0)'); - - if(gd._context.editable) { + drawArrowHead(arrow, options.arrowhead, 'end', options.arrowsize, options.standoff); + + // the arrow dragger is a small square right at the head, then a line to the tail, + // all expanded by a stroke width of 6px plus the arrow line width + if(gd._context.editable && arrow.node().parentNode) { + var arrowDragHeadX = headX; + var arrowDragHeadY = headY; + if(options.standoff) { + var arrowLength = Math.sqrt(Math.pow(headX - tailX, 2) + Math.pow(headY - tailY, 2)); + arrowDragHeadX += options.standoff * (tailX - headX) / arrowLength; + arrowDragHeadY += options.standoff * (tailY - headY) / arrowLength; + } + var arrowDrag = arrowGroup.append('path') + .classed('annotation', true) + .classed('anndrag', true) + .attr({ + 'data-index': String(index), + d: 'M3,3H-3V-3H3ZM0,0L' + (tailX - arrowDragHeadX) + ',' + (tailY - arrowDragHeadY), + transform: 'translate(' + arrowDragHeadX + ',' + arrowDragHeadY + ')' + }) + .style('stroke-width', (strokewidth + 6) + 'px') + .call(Color.stroke, 'rgba(0,0,0,0)') + .call(Color.fill, 'rgba(0,0,0,0)'); + var update, annx0, anny0; + // dragger for the arrow & head: translates the whole thing + // (head/tail/text) all together dragElement.init({ - element: arrowdrag.node(), + element: arrowDrag.node(), prepFn: function() { - var pos = Lib.getTranslate(ann); + var pos = Lib.getTranslate(annTextGroupInner); annx0 = pos.x; anny0 = pos.y; @@ -576,33 +605,32 @@ function drawOne(gd, index, opt, value) { } }, moveFn: function(dx, dy) { - arrowgroup.attr('transform', 'translate(' + dx + ',' + dy + ')'); - var annxy0 = applyTransform(annx0, anny0), xcenter = annxy0[0] + dx, ycenter = annxy0[1] + dy; - ann.call(Lib.setTranslate, xcenter, ycenter); + annTextGroupInner.call(Lib.setTranslate, xcenter, ycenter); update[annbase + '.x'] = xa ? xa.p2r(xa.r2p(options.x) + dx) : - ((arrowX + dx - gs.l) / gs.w); + ((headX + dx - gs.l) / gs.w); update[annbase + '.y'] = ya ? ya.p2r(ya.r2p(options.y) + dy) : - (1 - ((arrowY + dy - gs.t) / gs.h)); + (1 - ((headY + dy - gs.t) / gs.h)); if(options.axref === options.xref) { update[annbase + '.ax'] = xa ? xa.p2r(xa.r2p(options.ax) + dx) : - ((arrowX + dx - gs.l) / gs.w); + ((headX + dx - gs.l) / gs.w); } if(options.ayref === options.yref) { update[annbase + '.ay'] = ya ? ya.p2r(ya.r2p(options.ay) + dy) : - (1 - ((arrowY + dy - gs.t) / gs.h)); + (1 - ((headY + dy - gs.t) / gs.h)); } - anng.attr({ + arrowGroup.attr('transform', 'translate(' + dx + ',' + dy + ')'); + annTextGroup.attr({ transform: 'rotate(' + textangle + ',' + xcenter + ',' + ycenter + ')' }); @@ -620,28 +648,20 @@ function drawOne(gd, index, opt, value) { if(options.showarrow) drawArrow(0, 0); - // create transform matrix and related functions - var transform = Lib.rotationXYMatrix(textangle, - annPosPx.x, annPosPx.y), - applyTransform = Lib.apply2DTransform(transform); - // user dragging the annotation (text, not arrow) if(gd._context.editable) { - var x0, - y0, - update; + var update, + baseTextTransform; + // dragger for the textbox: if there's an arrow, just drag the + // textbox and tail, leave the head untouched dragElement.init({ - element: ann.node(), + element: annTextGroupInner.node(), prepFn: function() { - var pos = Lib.getTranslate(ann); - - x0 = pos.x; - y0 = pos.y; + baseTextTransform = annTextGroup.attr('transform'); update = {}; }, moveFn: function(dx, dy) { - ann.call(Lib.setTranslate, x0 + dx, y0 + dy); var csr = 'pointer'; if(options.showarrow) { if(options.axref === options.xref) { @@ -685,21 +705,14 @@ function drawOne(gd, index, opt, value) { } } - var xy1 = applyTransform(x0, y0), - x1 = xy1[0] + dx, - y1 = xy1[1] + dy; - - ann.call(Lib.setTranslate, x0 + dx, y0 + dy); - - anng.attr({ - transform: 'rotate(' + textangle + ',' + - x1 + ',' + y1 + ')' + annTextGroup.attr({ + transform: 'translate(' + dx + ',' + dy + ')' + baseTextTransform }); - setCursor(ann, csr); + setCursor(annTextGroupInner, csr); }, doneFn: function(dragged) { - setCursor(ann); + setCursor(annTextGroupInner); if(dragged) { Plotly.relayout(gd, update); var notesBox = document.querySelector('.js-notes-box-panel'); @@ -711,7 +724,7 @@ function drawOne(gd, index, opt, value) { } if(gd._context.editable) { - anntext.call(svgTextUtils.makeEditable, ann) + annText.call(svgTextUtils.makeEditable, annTextGroupInner) .call(textLayout) .on('edit', function(_text) { options.text = _text; @@ -728,12 +741,11 @@ function drawOne(gd, index, opt, value) { Plotly.relayout(gd, update); }); } - else anntext.call(textLayout); + else annText.call(textLayout); // rotate and position text and background - anng.attr({transform: 'rotate(' + textangle + ',' + - annPosPx.x + ',' + annPosPx.y + ')'}) - .call(Drawing.setPosition, annPosPx.x, annPosPx.y); + annTextGroup.attr({transform: 'rotate(' + textangle + ',' + + annPosPx.x.text + ',' + annPosPx.y.text + ')'}); } // look for intersection of two line segments diff --git a/src/components/annotations/draw_arrow_head.js b/src/components/annotations/draw_arrow_head.js index 3a42b712dbf..191faa6c2b6 100644 --- a/src/components/annotations/draw_arrow_head.js +++ b/src/components/annotations/draw_arrow_head.js @@ -22,11 +22,10 @@ var ARROWPATHS = require('./arrow_paths'); // ends is 'start', 'end' (default), 'start+end' // mag is magnification vs. default (default 1) -module.exports = function drawArrowHead(el3, style, ends, mag) { +module.exports = function drawArrowHead(el3, style, ends, mag, standoff) { if(!isNumeric(mag)) mag = 1; var el = el3.node(), headStyle = ARROWPATHS[style||0]; - if(!headStyle) return; if(typeof ends !== 'string' || !ends) ends = 'end'; @@ -35,7 +34,7 @@ module.exports = function drawArrowHead(el3, style, ends, mag) { opacity = el3.style('stroke-opacity') || 1, doStart = ends.indexOf('start') >= 0, doEnd = ends.indexOf('end') >= 0, - backOff = headStyle.backoff * scale, + backOff = headStyle.backoff * scale + standoff, start, end, startRot, @@ -44,9 +43,17 @@ module.exports = function drawArrowHead(el3, style, ends, mag) { if(el.nodeName === 'line') { start = {x: +el3.attr('x1'), y: +el3.attr('y1')}; end = {x: +el3.attr('x2'), y: +el3.attr('y2')}; - startRot = Math.atan2(start.y - end.y, start.x - end.x); + + var dx = start.x - end.x, + dy = start.y - end.y; + + startRot = Math.atan2(dy, dx); endRot = startRot + Math.PI; if(backOff) { + if(backOff * backOff > dx * dx + dy * dy) { + hideLine(); + return; + } var backOffX = backOff * Math.cos(startRot), backOffY = backOff * Math.sin(startRot); @@ -70,6 +77,11 @@ module.exports = function drawArrowHead(el3, style, ends, mag) { // combine the two dashArray = ''; + if(pathlen < backOff) { + hideLine(); + return; + } + if(doStart) { var start0 = el.getPointAtLength(0), dstart = el.getPointAtLength(0.1); @@ -94,7 +106,10 @@ module.exports = function drawArrowHead(el3, style, ends, mag) { if(dashArray) el3.style('stroke-dasharray', dashArray); } - var drawhead = function(p, rot) { + function hideLine() { el3.style('stroke-dasharray', '0px,100px'); } + + function drawhead(p, rot) { + if(!headStyle.path) return; if(style > 5) rot = 0; // don't rotate square or circle d3.select(el.parentElement).append('path') .attr({ @@ -110,7 +125,7 @@ module.exports = function drawArrowHead(el3, style, ends, mag) { opacity: opacity, 'stroke-width': 0 }); - }; + } if(doStart) drawhead(start, startRot); if(doEnd) drawhead(end, endRot); diff --git a/test/image/baselines/annotations-autorange.png b/test/image/baselines/annotations-autorange.png index 07df4be6243d01cad1669b39d6126bedbaab4065..cab99da4b8d66a1712e7de018fdb17a43a10a520 100644 GIT binary patch literal 33494 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 Q$>2Y24L$W@RXgJU03pktBme*a literal 31636 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%0Dl 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
arrow","y":1.5,"x":1,"showarrow":false}, {"xref":"x3","yref":"y3","text":"Right
no
arrow","y":1.5,"x":2,"showarrow":false}, diff --git a/test/image/mocks/annotations.json b/test/image/mocks/annotations.json index 2bf9989b306..33f1a01e31f 100644 --- a/test/image/mocks/annotations.json +++ b/test/image/mocks/annotations.json @@ -44,7 +44,15 @@ "arrowcolor":"rgb(166, 28, 0)","borderpad":3,"textangle":50,"x":5,"y":1 }, {"text":"","showarrow":true,"borderwidth":1.2,"arrowhead":2,"axref":"x","ayref":"y","x":5,"y":3,"ax":4,"ay":5}, - {"text":"","showarrow":true,"borderwidth":1.2,"arrowhead":2,"axref":"x","ayref":"y","x":6,"y":2,"ax":3,"ay":3} + {"text":"","showarrow":true,"borderwidth":1.2,"arrowhead":2,"axref":"x","ayref":"y","x":6,"y":2,"ax":3,"ay":3}, + { + "text": "arrow BL
+standoff", "x": 2, "y": 2, "ax": 20, "ay": 20, + "xanchor": "left", "yanchor": "bottom", "standoff": 5 + }, + { + "text": "angle, arrow TM
box+standoff", "x": 2, "y": 2, "ax": -20, "ay": -20, + "xanchor": "right", "yanchor": "top", "standoff": 5, "textangle": 45, "bordercolor": "#444" + } ] } } diff --git a/test/jasmine/tests/transition_test.js b/test/jasmine/tests/transition_test.js index 36c7ec0f045..949aaaa14c3 100644 --- a/test/jasmine/tests/transition_test.js +++ b/test/jasmine/tests/transition_test.js @@ -68,7 +68,8 @@ function runTests(transitionDuration) { it('transitions an annotation', function(done) { function annotationPosition() { var g = gd._fullLayout._infolayer.select('.annotation').select('.annotation-text-g'); - return [parseInt(g.attr('x')), parseInt(g.attr('y'))]; + var bBox = g.node().getBoundingClientRect(); + return [bBox.left, bBox.top]; } var p1, p2; From 45bc0e3e6c52187d8e7c8e15e4dcb126dcfbdb02 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Wed, 21 Dec 2016 23:19:27 -0500 Subject: [PATCH 02/12] build (and tweak) annotations baseline image --- test/image/baselines/annotations.png | Bin 48541 -> 54060 bytes test/image/mocks/annotations.json | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/image/baselines/annotations.png b/test/image/baselines/annotations.png index 056e5c862682c45cbae0f1bf8284891516530cf5..8d922009c72450207bece9807e9fbdf191dbd97f 100644 GIT binary patch literal 54060 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 LRisKKjGzA>WZW^_ literal 48541 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

6OEzEFGgx$?g0!`B-fr%cw6a3mDFA`3W4 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:d^fF~T&oW4it=n0&x;2(PXG4Y%#j(H$ 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 diff --git a/test/image/mocks/annotations.json b/test/image/mocks/annotations.json index 33f1a01e31f..3033c2bf297 100644 --- a/test/image/mocks/annotations.json +++ b/test/image/mocks/annotations.json @@ -46,11 +46,11 @@ {"text":"","showarrow":true,"borderwidth":1.2,"arrowhead":2,"axref":"x","ayref":"y","x":5,"y":3,"ax":4,"ay":5}, {"text":"","showarrow":true,"borderwidth":1.2,"arrowhead":2,"axref":"x","ayref":"y","x":6,"y":2,"ax":3,"ay":3}, { - "text": "arrow BL
+standoff", "x": 2, "y": 2, "ax": 20, "ay": 20, - "xanchor": "left", "yanchor": "bottom", "standoff": 5 + "text": "arrow ML
+standoff", "x": 2, "y": 2, "ax": 20, "ay": 20, + "xanchor": "left", "yanchor": "middle", "standoff": 5 }, { - "text": "angle, arrow TM
box+standoff", "x": 2, "y": 2, "ax": -20, "ay": -20, + "text": "angle, arrow TR
box+standoff", "x": 2, "y": 2, "ax": -20, "ay": -20, "xanchor": "right", "yanchor": "top", "standoff": 5, "textangle": 45, "bordercolor": "#444" } ] From d69ed98d19f98cc87a88825879d9d55692c1d23d Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Thu, 22 Dec 2016 13:00:11 -0500 Subject: [PATCH 03/12] fix annotation drawing when dragging off plot --- src/components/annotations/draw.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/components/annotations/draw.js b/src/components/annotations/draw.js index 01705f89c27..1bbfedef4f5 100644 --- a/src/components/annotations/draw.js +++ b/src/components/annotations/draw.js @@ -370,13 +370,13 @@ function drawOne(gd, index, opt, value) { */ if(ax) { /* - * hide the annotation if it's pointing - * outside the visible plot (as long as the axis - * isn't autoranged - then we need to draw it - * anyway to get its bounding box) + * hide the annotation if it's pointing outside the visible plot + * as long as the axis isn't autoranged - then we need to draw it + * anyway to get its bounding box. When we're dragging, an axis can + * still look autoranged even though it won't be when the drag finishes. */ var posFraction = ax.r2fraction(options[axLetter]); - if(!ax.autorange && (posFraction < 0 || posFraction > 1)) { + if((gd._dragging || !ax.autorange) && (posFraction < 0 || posFraction > 1)) { if(tailRef === axRef) { posFraction = ax.r2fraction(options['a' + axLetter]); if(posFraction < 0 || posFraction > 1) { @@ -484,6 +484,15 @@ function drawOne(gd, index, opt, value) { Math.round(annPosPx.x.text - outerwidth / 2), Math.round(annPosPx.y.text - outerheight / 2)); + /* + * rotate text and background + * we already calculated the text center position *as rotated* + * because we needed that for autoranging anyway, so now whether + * we have an arrow or not, we rotate about the text center. + */ + annTextGroup.attr({transform: 'rotate(' + textangle + ',' + + annPosPx.x.text + ',' + annPosPx.y.text + ')'}); + var annbase = 'annotations[' + index + ']'; /* @@ -742,10 +751,6 @@ function drawOne(gd, index, opt, value) { }); } else annText.call(textLayout); - - // rotate and position text and background - annTextGroup.attr({transform: 'rotate(' + textangle + ',' + - annPosPx.x.text + ',' + annPosPx.y.text + ')'}); } // look for intersection of two line segments From 8f0038dc14115a645fb817fca30a3620d93b325d Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Thu, 22 Dec 2016 13:26:25 -0500 Subject: [PATCH 04/12] add some off-plot annotations to the test mock --- test/image/mocks/annotations.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/image/mocks/annotations.json b/test/image/mocks/annotations.json index 3033c2bf297..b0d878ba684 100644 --- a/test/image/mocks/annotations.json +++ b/test/image/mocks/annotations.json @@ -52,7 +52,9 @@ { "text": "angle, arrow TR
box+standoff", "x": 2, "y": 2, "ax": -20, "ay": -20, "xanchor": "right", "yanchor": "top", "standoff": 5, "textangle": 45, "bordercolor": "#444" - } + }, + {"text": "off-plot, do not show!", "x": 5.1, "y": 3.5, "showarrow": false}, + {"text": "off-plot 2", "x": 3, "y": 5.1, "showarrow": true, "ax": 0, "ay": 100} ] } } From 83482fbac17ba6070c063119ed3d3557b8c9a3f5 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 23 Dec 2016 15:46:42 -0500 Subject: [PATCH 05/12] only autorange on visible annotations --- src/components/annotations/calc_autorange.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/annotations/calc_autorange.js b/src/components/annotations/calc_autorange.js index 1926732cf35..184aed6f1f8 100644 --- a/src/components/annotations/calc_autorange.js +++ b/src/components/annotations/calc_autorange.js @@ -45,7 +45,7 @@ function annAutorange(gd) { // relative to their anchor points // use the arrow and the text bg rectangle, // as the whole anno may include hidden text in its bbox - fullLayout.annotations.forEach(function(ann) { + Lib.filterVisible(fullLayout.annotations).forEach(function(ann) { var xa = Axes.getFromId(gd, ann.xref), ya = Axes.getFromId(gd, ann.yref), headSize = 3 * ann.arrowsize * ann.arrowwidth || 0; From 9efa9b7e7c61017eab6b18eef474af12a66492e2 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 23 Dec 2016 15:47:13 -0500 Subject: [PATCH 06/12] tweak Plotly.update logic --- src/plot_api/plot_api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plot_api/plot_api.js b/src/plot_api/plot_api.js index 70f15d97dcf..e899b2790f4 100644 --- a/src/plot_api/plot_api.js +++ b/src/plot_api/plot_api.js @@ -2093,7 +2093,7 @@ Plotly.update = function update(gd, traceUpdate, layoutUpdate, traces) { // fill in redraw sequence var seq = []; - if(restyleFlags.fullReplot && relayoutFlags.layoutReplot) { + if(restyleFlags.fullReplot || relayoutFlags.layoutReplot) { var data = gd.data, layout = gd.layout; From 9cf04b6d4a4fe6aa63197a9ca3146d1699557511 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Fri, 23 Dec 2016 15:48:50 -0500 Subject: [PATCH 07/12] add clicktoshow for annotations --- .../annotations/annotation_defaults.js | 13 +- src/components/annotations/attributes.js | 36 +++++ src/components/annotations/click.js | 121 ++++++++++++++++ src/components/annotations/index.js | 6 +- src/lib/override_cursor.js | 43 ++++++ src/plots/cartesian/graph_interact.js | 19 ++- test/jasmine/tests/annotations_test.js | 131 +++++++++++++++++- 7 files changed, 365 insertions(+), 4 deletions(-) create mode 100644 src/components/annotations/click.js create mode 100644 src/lib/override_cursor.js diff --git a/src/components/annotations/annotation_defaults.js b/src/components/annotations/annotation_defaults.js index 84f287463e7..c831a6f585b 100644 --- a/src/components/annotations/annotation_defaults.js +++ b/src/components/annotations/annotation_defaults.js @@ -25,8 +25,9 @@ module.exports = function handleAnnotationDefaults(annIn, annOut, fullLayout, op } var visible = coerce('visible', !itemOpts.itemIsNotPlainObject); + var clickToShow = coerce('clicktoshow'); - if(!visible) return annOut; + if(!(visible || clickToShow)) return annOut; coerce('opacity'); coerce('align'); @@ -92,5 +93,15 @@ module.exports = function handleAnnotationDefaults(annIn, annOut, fullLayout, op Lib.noneOrAll(annIn, annOut, ['ax', 'ay']); } + if(clickToShow) { + var xClick = coerce('xclick'); + var yClick = coerce('yclick'); + + // put the actual click data to bind to into private attributes + // so we don't have to do this little bit of logic on every hover event + annOut._xclick = (xClick === undefined) ? annOut.x : xClick; + annOut._yclick = (yClick === undefined) ? annOut.y : yClick; + } + return annOut; }; diff --git a/src/components/annotations/attributes.js b/src/components/annotations/attributes.js index 05f38c232b9..a4e888b987b 100644 --- a/src/components/annotations/attributes.js +++ b/src/components/annotations/attributes.js @@ -310,6 +310,42 @@ module.exports = { 'corresponds to the closest side.' ].join(' ') }, + clicktoshow: { + valType: 'enumerated', + values: [false, 'onoff', 'onout'], + dflt: false, + role: 'style', + description: [ + 'Makes this annotation respond to clicks on the plot.', + 'If you click a data point that exactly matches the `x` and `y`', + 'values of this annotation, and it is hidden (visible: false),', + 'it will appear. In *onoff* mode, you must click the same point', + 'again to make it disappear, so if you click multiple points,', + 'you can show multiple annotations. In *onout* mode, a click', + 'anywhere else in the plot (on another data point or not) will', + 'hide this annotation.', + 'If you need to show/hide this annotation in response to different', + '`x` or `y` values, you can set `xclick` and/or `yclick`. This is', + 'useful for example to label the side of a bar. To label markers', + 'though, `standoff` is preferred over `xclick` and `yclick`.' + ].join(' ') + }, + xclick: { + valType: 'any', + role: 'info', + description: [ + 'Toggle this annotation when clicking a data point whose `x` value', + 'is `xclick` rather than the annotation\'s `x` value.' + ].join(' ') + }, + yclick: { + valType: 'any', + role: 'info', + description: [ + 'Toggle this annotation when clicking a data point whose `y` value', + 'is `yclick` rather than the annotation\'s `y` value.' + ].join(' ') + }, _deprecated: { ref: { diff --git a/src/components/annotations/click.js b/src/components/annotations/click.js new file mode 100644 index 00000000000..47e86c33247 --- /dev/null +++ b/src/components/annotations/click.js @@ -0,0 +1,121 @@ +/** +* Copyright 2012-2016, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + + +'use strict'; + +var Plotly = require('../../plotly'); + + +module.exports = { + hasClickToShow: hasClickToShow, + onClick: onClick +}; + +/* + * hasClickToShow: does the given hoverData have ANY annotations which will + * turn ON if we click here? (used by hover events to set cursor) + * + * gd: graphDiv + * hoverData: a hoverData array, as included with the *plotly_hover* or + * *plotly_click* events in the `points` attribute + * + * returns: boolean + */ +function hasClickToShow(gd, hoverData) { + var sets = getToggleSets(gd, hoverData); + return sets.on.length > 0 || sets.explicitOff.length > 0; +} + +/* + * onClick: perform the toggling (via Plotly.update) implied by clicking + * at this hoverData + * + * gd: graphDiv + * hoverData: a hoverData array, as included with the *plotly_hover* or + * *plotly_click* events in the `points` attribute + * + * returns: Promise that the update is complete + */ +function onClick(gd, hoverData) { + var toggleSets = getToggleSets(gd, hoverData), + onSet = toggleSets.on, + offSet = toggleSets.off.concat(toggleSets.explicitOff), + update = {}, + i; + + if(!(onSet.length || offSet.length)) return; + + for(i = 0; i < onSet.length; i++) { + update['annotations[' + onSet[i] + '].visible'] = true; + } + + for(i = 0; i < offSet.length; i++) { + update['annotations[' + offSet[i] + '].visible'] = false; + } + + return Plotly.update(gd, {}, update); +} + +/* + * getToggleSets: find the annotations which will turn on or off at this + * hoverData + * + * gd: graphDiv + * hoverData: a hoverData array, as included with the *plotly_hover* or + * *plotly_click* events in the `points` attribute + * + * returns: { + * on: Array (indices of annotations to turn on), + * off: Array (indices to turn off because you're not hovering on them), + * explicitOff: Array (indices to turn off because you *are* hovering on them) + * } + */ +function getToggleSets(gd, hoverData) { + var annotations = gd._fullLayout.annotations, + onSet = [], + offSet = [], + explicitOffSet = [], + hoverLen = (hoverData || []).length; + + var i, j, anni, showMode, pointj, toggleType; + + for(i = 0; i < annotations.length; i++) { + anni = annotations[i]; + showMode = anni.clicktoshow; + if(showMode) { + for(j = 0; j < hoverLen; j++) { + pointj = hoverData[j]; + if(pointj.x === anni._xclick && pointj.y === anni._yclick && + pointj.xaxis._id === anni.xref && + pointj.yaxis._id === anni.yref) { + // match! toggle this annotation + // regardless of its clicktoshow mode + // but if it's onout mode, off is implicit + if(anni.visible) { + if(showMode === 'onout') toggleType = offSet; + else toggleType = explicitOffSet; + } + else { + toggleType = onSet; + } + toggleType.push(i); + break; + } + } + + if(j === hoverLen) { + // no match - only turn this annotation OFF, and only if + // showmode is 'onout' + if(anni.visible && showMode === 'onout') offSet.push(i); + } + } + } + + return {on: onSet, off: offSet, explicitOff: explicitOffSet}; +} diff --git a/src/components/annotations/index.js b/src/components/annotations/index.js index 1d4bdd09788..a40245ede44 100644 --- a/src/components/annotations/index.js +++ b/src/components/annotations/index.js @@ -10,6 +10,7 @@ 'use strict'; var drawModule = require('./draw'); +var clickModule = require('./click'); module.exports = { moduleType: 'component', @@ -20,5 +21,8 @@ module.exports = { calcAutorange: require('./calc_autorange'), draw: drawModule.draw, - drawOne: drawModule.drawOne + drawOne: drawModule.drawOne, + + hasClickToShow: clickModule.hasClickToShow, + onClick: clickModule.onClick }; diff --git a/src/lib/override_cursor.js b/src/lib/override_cursor.js new file mode 100644 index 00000000000..84efea61382 --- /dev/null +++ b/src/lib/override_cursor.js @@ -0,0 +1,43 @@ +/** +* Copyright 2012-2016, Plotly, Inc. +* All rights reserved. +* +* This source code is licensed under the MIT license found in the +* LICENSE file in the root directory of this source tree. +*/ + + +'use strict'; + +var setCursor = require('./setCursor'); + +var STASHATTR = 'data-savedcursor'; + +/* + * works with our CSS cursor classes (see css/_cursor.scss) + * to override a previous cursor set on d3 single-element selections, + * by moving the name of the original cursor to the data-savedcursor attr. + * omit cursor to revert to the previously set value. + */ +module.exports = function overrideCursor(el3, csr) { + var savedCursor = el3.attr(STASHATTR); + if(csr) { + if(savedCursor) { + setCursor(el3, csr); + } + else { + var classes = (el3.attr('class') || '').split(' '); + for(var i = 0; i < classes.length; i++) { + var cls = classes[i]; + if(cls.indexOf('cursor-') === 0) { + el3.attr(STASHATTR, cls.substr(7)) + .classed(cls, false); + } + } + } + } + else if(savedCursor) { + el3.attr(STASHATTR, null); + setCursor(el3, savedCursor); + } +}; diff --git a/src/plots/cartesian/graph_interact.js b/src/plots/cartesian/graph_interact.js index 57c65b99b13..6b7455bd18f 100644 --- a/src/plots/cartesian/graph_interact.js +++ b/src/plots/cartesian/graph_interact.js @@ -19,6 +19,8 @@ var svgTextUtils = require('../../lib/svg_text_utils'); var Color = require('../../components/color'); var Drawing = require('../../components/drawing'); var dragElement = require('../../components/dragelement'); +var overrideCursor = require('../../lib/override_cursor'); +var Registry = require('../../registry'); var Axes = require('./axes'); var constants = require('./constants'); @@ -596,6 +598,13 @@ function hover(gd, evt, subplot) { gd._hoverdata = newhoverdata; + // TODO: tagName hack is needed to appease geo.js's hack of using evt.target=true + // we should improve the "fx" API so other plots can use it without these hack. + if(evt.target && evt.target.tagName) { + var hasClickToShow = Registry.getComponentMethod('annotations', 'hasClickToShow')(gd, newhoverdata); + overrideCursor(d3.select(evt.target), hasClickToShow ? 'pointer' : ''); + } + if(!hoverChanged(gd, evt, oldhoverdata)) return; if(oldhoverdata) { @@ -1323,8 +1332,16 @@ function hoverChanged(gd, evt, oldhoverdata) { // on click fx.click = function(gd, evt) { + var annotationsDone = Registry.getComponentMethod('annotations', 'onClick')(gd, gd._hoverdata); + + function emitClick() { gd.emit('plotly_click', {points: gd._hoverdata}); } + if(gd._hoverdata && evt && evt.target) { - gd.emit('plotly_click', {points: gd._hoverdata}); + if(annotationsDone && annotationsDone.then) { + annotationsDone.then(emitClick); + } + else emitClick(); + // why do we get a double event without this??? if(evt.stopImmediatePropagation) evt.stopImmediatePropagation(); } diff --git a/test/jasmine/tests/annotations_test.js b/test/jasmine/tests/annotations_test.js index fd99e6c6881..880f273ed70 100644 --- a/test/jasmine/tests/annotations_test.js +++ b/test/jasmine/tests/annotations_test.js @@ -47,7 +47,8 @@ describe('Test annotations', function() { expect(item).toEqual({ visible: false, _input: {}, - _index: i + _index: i, + clicktoshow: false }); }); }); @@ -296,3 +297,131 @@ describe('annotations autosize', function() { .then(done); }); }); + +describe('annotation clicktoshow', function() { + var gd; + + afterEach(destroyGraphDiv); + + function layout() { + return { + xaxis: {domain: [0, 0.5]}, + xaxis2: {domain: [0.5, 1], anchor: 'y2'}, + yaxis2: {anchor: 'x2'}, + annotations: [ + {x: 1, y: 2, xref: 'x', yref: 'y', text: 'index0'}, // (1,2) selects + {x: 1, y: 3, xref: 'x', yref: 'y', text: 'index1'}, + {x: 2, y: 3, xref: 'x', yref: 'y', text: 'index2'}, // ** (2,3) selects + {x: 4, y: 2, xref: 'x', yref: 'y', text: 'index3'}, + {x: 1, y: 2, xref: 'x2', yref: 'y', text: 'index4'}, + {x: 1, y: 2, xref: 'x', yref: 'y2', text: 'index5'}, + {x: 1, xclick: 5, y: 2, xref: 'x', yref: 'y', text: 'index6'}, + {x: 1, y: 2, yclick: 6, xref: 'x', yref: 'y', text: 'index7'}, + {x: 1, y: 2.0000001, xref: 'x', yref: 'y', text: 'index8'}, + {x: 1, y: 2, xref: 'x', yref: 'y', text: 'index9'}, // (1,2) selects + {x: 7, xclick: 1, y: 2, xref: 'x', yref: 'y', text: 'index10'}, // (1,2) selects + {x: 1, y: 8, yclick: 2, xref: 'x', yref: 'y', text: 'index11'}, // (1,2) selects + {x: 1, y: 2, xref: 'paper', yref: 'y', text: 'index12'}, + {x: 1, y: 2, xref: 'x', yref: 'paper', text: 'index13'}, + {x: 1, y: 2, xref: 'paper', yref: 'paper', text: 'index14'} + ] + }; + } + + var data = [ + {x: [0, 1, 2], y: [1, 2, 3]}, + {x: [0, 1, 2], y: [1, 2, 3], xaxis: 'x2', yaxis: 'y2'} + ]; + + function hoverData(xyPairs) { + // hovering on nothing can have undefined hover data - must be supported + if(!xyPairs.length) return; + + return xyPairs.map(function(xy) { + return { + x: xy[0], + y: xy[1], + xaxis: gd._fullLayout.xaxis, + yaxis: gd._fullLayout.yaxis + }; + }); + } + + function checkVisible(opts) { + gd._fullLayout.annotations.forEach(function(ann, i) { + expect(ann.visible).toBe(opts.on.indexOf(i) !== -1, 'i: ' + i + ', step: ' + opts.step); + }); + } + + function allAnnotations(attr, value) { + var update = {}; + for(var i = 0; i < gd.layout.annotations.length; i++) { + update['annotations[' + i + '].' + attr] = value; + } + return update; + } + + function clickAndCheck(opts) { + return function() { + expect(Annotations.hasClickToShow(gd, hoverData(opts.newPts))) + .toBe(opts.newCTS, 'step: ' + opts.step); + + var clickResult = Annotations.onClick(gd, hoverData(opts.newPts)); + if(clickResult && clickResult.then) { + return clickResult.then(function() { checkVisible(opts); }); + } + else { + checkVisible(opts); + } + }; + } + + function updateAndCheck(opts) { + return function() { + return Plotly.update(gd, {}, opts.update).then(function() { + checkVisible(opts); + }); + }; + } + + var allIndices = layout().annotations.map(function(v, i) { return i; }); + + it('should select only clicktoshow annotations matching x, y, and axes of any point', function(done) { + gd = createGraphDiv(); + + // first try to select without adding clicktoshow, both visible and invisible + Plotly.plot(gd, data, layout()) + // clicktoshow is off initially, so it doesn't *expect* clicking will + // do anything, and it doesn't *actually* do anything. + .then(clickAndCheck({newPts: [[1, 2]], newCTS: false, on: allIndices, step: 1})) + .then(updateAndCheck({update: allAnnotations('visible', false), on: [], step: 2})) + // still nothing happens with hidden annotations + .then(clickAndCheck({newPts: [[1, 2]], newCTS: false, on: [], step: 3})) + + // turn on clicktoshow (onout mode) and we see some action! + .then(updateAndCheck({update: allAnnotations('clicktoshow', 'onout'), on: [], step: 4})) + .then(clickAndCheck({newPts: [[1, 2]], newCTS: true, on: [0, 9, 10, 11], step: 5})) + .then(clickAndCheck({newPts: [[2, 3]], newCTS: true, on: [2], step: 6})) + // clicking the same point again will close all, but in onout mode hasClickToShow + // is false because closing notes is kind of passive + .then(clickAndCheck({newPts: [[2, 3]], newCTS: false, on: [], step: 7})) + // now click two points (as if in compare hovermode) + .then(clickAndCheck({newPts: [[1, 2], [2, 3]], newCTS: true, on: [0, 2, 9, 10, 11], step: 8})) + // close all by clicking somewhere else + .then(clickAndCheck({newPts: [[0, 1]], newCTS: false, on: [], step: 9})) + + // now switch to onoff mode + .then(updateAndCheck({update: allAnnotations('clicktoshow', 'onoff'), on: [], step: 10})) + // again, clicking a point turns those annotations on + .then(clickAndCheck({newPts: [[1, 2]], newCTS: true, on: [0, 9, 10, 11], step: 11})) + // clicking a different point (or no point at all) leaves open annotations the same + .then(clickAndCheck({newPts: [[0, 1]], newCTS: false, on: [0, 9, 10, 11], step: 12})) + .then(clickAndCheck({newPts: [], newCTS: false, on: [0, 9, 10, 11], step: 13})) + // clicking another point turns it on too, without turning off the original + .then(clickAndCheck({newPts: [[0, 1], [2, 3]], newCTS: true, on: [0, 2, 9, 10, 11], step: 14})) + // finally click each one off + .then(clickAndCheck({newPts: [[1, 2]], newCTS: true, on: [2], step: 15})) + .then(clickAndCheck({newPts: [[2, 3]], newCTS: true, on: [], step: 16})) + .then(done); + }); +}); From 2533ec5a4f1a2ecac51255b6a044cab5f754954a Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Sat, 24 Dec 2016 01:59:12 -0500 Subject: [PATCH 08/12] lock mouse-change to 1.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 525ab76336c..20021ebc748 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "gl-spikes2d": "^1.0.1", "gl-surface3d": "^1.3.0", "mapbox-gl": "^0.22.0", - "mouse-change": "^1.1.1", + "mouse-change": "=1.3.0", "mouse-wheel": "^1.0.2", "ndarray": "^1.0.16", "ndarray-fill": "^1.0.1", From 578ea8786dffb00ddc52be806da9d513d9726580 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Sat, 24 Dec 2016 08:35:09 -0500 Subject: [PATCH 09/12] fix require caitalization setCursor -> setcursor --- src/lib/override_cursor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/override_cursor.js b/src/lib/override_cursor.js index 84efea61382..0072bc65076 100644 --- a/src/lib/override_cursor.js +++ b/src/lib/override_cursor.js @@ -9,7 +9,7 @@ 'use strict'; -var setCursor = require('./setCursor'); +var setCursor = require('./setcursor'); var STASHATTR = 'data-savedcursor'; From 13947eff9f0be62e8af5bc61ad390cd45e75cee2 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Wed, 4 Jan 2017 14:48:35 -0500 Subject: [PATCH 10/12] update header on new annotations files --- src/components/annotations/click.js | 2 +- src/lib/override_cursor.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/annotations/click.js b/src/components/annotations/click.js index 47e86c33247..8fe77ce8286 100644 --- a/src/components/annotations/click.js +++ b/src/components/annotations/click.js @@ -1,5 +1,5 @@ /** -* Copyright 2012-2016, Plotly, Inc. +* Copyright 2012-2017, Plotly, Inc. * All rights reserved. * * This source code is licensed under the MIT license found in the diff --git a/src/lib/override_cursor.js b/src/lib/override_cursor.js index 0072bc65076..45cd69c1939 100644 --- a/src/lib/override_cursor.js +++ b/src/lib/override_cursor.js @@ -1,5 +1,5 @@ /** -* Copyright 2012-2016, Plotly, Inc. +* Copyright 2012-2017, Plotly, Inc. * All rights reserved. * * This source code is licensed under the MIT license found in the From b683903b9c44a83826e52506135bde077ddac0d1 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Wed, 18 Jan 2017 00:03:04 -0500 Subject: [PATCH 11/12] put back original fullReplot/layoutReplot logic --- src/plot_api/plot_api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plot_api/plot_api.js b/src/plot_api/plot_api.js index 982cc121ec9..431cda21cc6 100644 --- a/src/plot_api/plot_api.js +++ b/src/plot_api/plot_api.js @@ -2093,7 +2093,7 @@ Plotly.update = function update(gd, traceUpdate, layoutUpdate, traces) { // fill in redraw sequence var seq = []; - if(restyleFlags.fullReplot || relayoutFlags.layoutReplot) { + if(restyleFlags.fullReplot && relayoutFlags.layoutReplot) { var data = gd.data, layout = gd.layout; From ccbffd0fd85efabd17ede2984141c7d47504b449 Mon Sep 17 00:00:00 2001 From: alexcjohnson Date: Wed, 18 Jan 2017 10:24:24 -0500 Subject: [PATCH 12/12] fix and test overrideCursor --- src/lib/override_cursor.js | 14 ++++++---- test/jasmine/tests/lib_test.js | 51 ++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/lib/override_cursor.js b/src/lib/override_cursor.js index 45cd69c1939..ebbd290951e 100644 --- a/src/lib/override_cursor.js +++ b/src/lib/override_cursor.js @@ -12,6 +12,7 @@ var setCursor = require('./setcursor'); var STASHATTR = 'data-savedcursor'; +var NO_CURSOR = '!!'; /* * works with our CSS cursor classes (see css/_cursor.scss) @@ -22,10 +23,7 @@ var STASHATTR = 'data-savedcursor'; module.exports = function overrideCursor(el3, csr) { var savedCursor = el3.attr(STASHATTR); if(csr) { - if(savedCursor) { - setCursor(el3, csr); - } - else { + if(!savedCursor) { var classes = (el3.attr('class') || '').split(' '); for(var i = 0; i < classes.length; i++) { var cls = classes[i]; @@ -34,10 +32,16 @@ module.exports = function overrideCursor(el3, csr) { .classed(cls, false); } } + if(!el3.attr(STASHATTR)) { + el3.attr(STASHATTR, NO_CURSOR); + } } + setCursor(el3, csr); } else if(savedCursor) { el3.attr(STASHATTR, null); - setCursor(el3, savedCursor); + + if(savedCursor === NO_CURSOR) setCursor(el3); + else setCursor(el3, savedCursor); } }; diff --git a/test/jasmine/tests/lib_test.js b/test/jasmine/tests/lib_test.js index 4991a6e5ab5..3ef05bfd90a 100644 --- a/test/jasmine/tests/lib_test.js +++ b/test/jasmine/tests/lib_test.js @@ -1,5 +1,6 @@ var Lib = require('@src/lib'); var setCursor = require('@src/lib/setcursor'); +var overrideCursor = require('@src/lib/override_cursor'); var d3 = require('d3'); var Plotly = require('@lib'); @@ -1191,6 +1192,56 @@ describe('Test lib.js:', function() { }); }); + describe('overrideCursor', function() { + + beforeEach(function() { + this.el3 = d3.select(createGraphDiv()); + }); + + afterEach(destroyGraphDiv); + + it('should apply the new cursor(s) and revert to the original when removed', function() { + this.el3 + .classed('cursor-before', true) + .classed('not-a-cursor', true) + .classed('another', true); + + overrideCursor(this.el3, 'after'); + expect(this.el3.attr('class')).toBe('not-a-cursor another cursor-after'); + + overrideCursor(this.el3, 'later'); + expect(this.el3.attr('class')).toBe('not-a-cursor another cursor-later'); + + overrideCursor(this.el3); + expect(this.el3.attr('class')).toBe('not-a-cursor another cursor-before'); + }); + + it('should apply the new cursor(s) and revert to the none when removed', function() { + this.el3 + .classed('not-a-cursor', true) + .classed('another', true); + + overrideCursor(this.el3, 'after'); + expect(this.el3.attr('class')).toBe('not-a-cursor another cursor-after'); + + overrideCursor(this.el3, 'later'); + expect(this.el3.attr('class')).toBe('not-a-cursor another cursor-later'); + + overrideCursor(this.el3); + expect(this.el3.attr('class')).toBe('not-a-cursor another'); + }); + + it('should do nothing if no existing or new override is present', function() { + this.el3 + .classed('cursor-before', true) + .classed('not-a-cursor', true); + + overrideCursor(this.el3); + + expect(this.el3.attr('class')).toBe('cursor-before not-a-cursor'); + }); + }); + describe('getTranslate', function() { it('should work with regular DOM elements', function() {