Mercurial > repos > iuc > assembly_stats
comparison d3-tip.js @ 0:9e4955725212 draft default tip
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/assembly-stats commit 28119c39c4b59a67f629c8ca569d58f4d2949c9c
| author | iuc |
|---|---|
| date | Wed, 21 Jun 2023 09:26:46 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:9e4955725212 |
|---|---|
| 1 // d3.tip | |
| 2 // Copyright (c) 2013 Justin Palmer | |
| 3 // | |
| 4 // Tooltips for d3.js SVG visualizations | |
| 5 | |
| 6 // Public - contructs a new tooltip | |
| 7 // | |
| 8 // Returns a tip | |
| 9 d3.tip = function() { | |
| 10 var direction = d3_tip_direction, | |
| 11 offset = d3_tip_offset, | |
| 12 html = d3_tip_html, | |
| 13 node = initNode(), | |
| 14 svg = null, | |
| 15 point = null, | |
| 16 target = null | |
| 17 | |
| 18 function tip(vis) { | |
| 19 svg = getSVGNode(vis) | |
| 20 point = svg.createSVGPoint() | |
| 21 document.body.appendChild(node) | |
| 22 } | |
| 23 | |
| 24 // Public - show the tooltip on the screen | |
| 25 // | |
| 26 // Returns a tip | |
| 27 tip.show = function() { | |
| 28 var args = Array.prototype.slice.call(arguments) | |
| 29 if(args[args.length - 1] instanceof SVGElement) target = args.pop() | |
| 30 | |
| 31 var content = html.apply(this, args), | |
| 32 poffset = offset.apply(this, args), | |
| 33 dir = direction.apply(this, args), | |
| 34 nodel = d3.select(node), i = 0, | |
| 35 coords | |
| 36 | |
| 37 nodel.html(content) | |
| 38 .style({ opacity: 1, 'pointer-events': 'all' }) | |
| 39 | |
| 40 while(i--) nodel.classed(directions[i], false) | |
| 41 coords = direction_callbacks.get(dir).apply(this) | |
| 42 nodel.classed(dir, true).style({ | |
| 43 top: (coords.top + poffset[0]) + 'px', | |
| 44 left: (coords.left + poffset[1]) + 'px' | |
| 45 }) | |
| 46 | |
| 47 return tip | |
| 48 } | |
| 49 | |
| 50 // Public - hide the tooltip | |
| 51 // | |
| 52 // Returns a tip | |
| 53 tip.hide = function() { | |
| 54 nodel = d3.select(node) | |
| 55 nodel.style({ opacity: 0, 'pointer-events': 'none' }) | |
| 56 return tip | |
| 57 } | |
| 58 | |
| 59 // Public: Proxy attr calls to the d3 tip container. Sets or gets attribute value. | |
| 60 // | |
| 61 // n - name of the attribute | |
| 62 // v - value of the attribute | |
| 63 // | |
| 64 // Returns tip or attribute value | |
| 65 tip.attr = function(n, v) { | |
| 66 if (arguments.length < 2 && typeof n === 'string') { | |
| 67 return d3.select(node).attr(n) | |
| 68 } else { | |
| 69 var args = Array.prototype.slice.call(arguments) | |
| 70 d3.selection.prototype.attr.apply(d3.select(node), args) | |
| 71 } | |
| 72 | |
| 73 return tip | |
| 74 } | |
| 75 | |
| 76 // Public: Proxy style calls to the d3 tip container. Sets or gets a style value. | |
| 77 // | |
| 78 // n - name of the property | |
| 79 // v - value of the property | |
| 80 // | |
| 81 // Returns tip or style property value | |
| 82 tip.style = function(n, v) { | |
| 83 if (arguments.length < 2 && typeof n === 'string') { | |
| 84 return d3.select(node).style(n) | |
| 85 } else { | |
| 86 var args = Array.prototype.slice.call(arguments) | |
| 87 d3.selection.prototype.style.apply(d3.select(node), args) | |
| 88 } | |
| 89 | |
| 90 return tip | |
| 91 } | |
| 92 | |
| 93 // Public: Set or get the direction of the tooltip | |
| 94 // | |
| 95 // v - One of n(north), s(south), e(east), or w(west), nw(northwest), | |
| 96 // sw(southwest), ne(northeast) or se(southeast) | |
| 97 // | |
| 98 // Returns tip or direction | |
| 99 tip.direction = function(v) { | |
| 100 if (!arguments.length) return direction | |
| 101 direction = v == null ? v : d3.functor(v) | |
| 102 | |
| 103 return tip | |
| 104 } | |
| 105 | |
| 106 // Public: Sets or gets the offset of the tip | |
| 107 // | |
| 108 // v - Array of [x, y] offset | |
| 109 // | |
| 110 // Returns offset or | |
| 111 tip.offset = function(v) { | |
| 112 if (!arguments.length) return offset | |
| 113 offset = v == null ? v : d3.functor(v) | |
| 114 | |
| 115 return tip | |
| 116 } | |
| 117 | |
| 118 // Public: sets or gets the html value of the tooltip | |
| 119 // | |
| 120 // v - String value of the tip | |
| 121 // | |
| 122 // Returns html value or tip | |
| 123 tip.html = function(v) { | |
| 124 if (!arguments.length) return html | |
| 125 html = v == null ? v : d3.functor(v) | |
| 126 | |
| 127 return tip | |
| 128 } | |
| 129 | |
| 130 function d3_tip_direction() { return 'n' } | |
| 131 function d3_tip_offset() { return [0, 0] } | |
| 132 function d3_tip_html() { return ' ' } | |
| 133 | |
| 134 var direction_callbacks = d3.map({ | |
| 135 n: direction_n, | |
| 136 s: direction_s, | |
| 137 e: direction_e, | |
| 138 w: direction_w, | |
| 139 nw: direction_nw, | |
| 140 ne: direction_ne, | |
| 141 sw: direction_sw, | |
| 142 se: direction_se | |
| 143 }), | |
| 144 | |
| 145 directions = direction_callbacks.keys() | |
| 146 | |
| 147 function direction_n() { | |
| 148 var bbox = getScreenBBox() | |
| 149 return { | |
| 150 top: bbox.n.y - node.offsetHeight, | |
| 151 left: bbox.n.x - node.offsetWidth / 2 | |
| 152 } | |
| 153 } | |
| 154 | |
| 155 function direction_s() { | |
| 156 var bbox = getScreenBBox() | |
| 157 return { | |
| 158 top: bbox.s.y, | |
| 159 left: bbox.s.x - node.offsetWidth / 2 | |
| 160 } | |
| 161 } | |
| 162 | |
| 163 function direction_e() { | |
| 164 var bbox = getScreenBBox() | |
| 165 return { | |
| 166 top: bbox.e.y - node.offsetHeight / 2, | |
| 167 left: bbox.e.x | |
| 168 } | |
| 169 } | |
| 170 | |
| 171 function direction_w() { | |
| 172 var bbox = getScreenBBox() | |
| 173 return { | |
| 174 top: bbox.w.y - node.offsetHeight / 2, | |
| 175 left: bbox.w.x - node.offsetWidth | |
| 176 } | |
| 177 } | |
| 178 | |
| 179 function direction_nw() { | |
| 180 var bbox = getScreenBBox() | |
| 181 return { | |
| 182 top: bbox.nw.y - node.offsetHeight, | |
| 183 left: bbox.nw.x - node.offsetWidth | |
| 184 } | |
| 185 } | |
| 186 | |
| 187 function direction_ne() { | |
| 188 var bbox = getScreenBBox() | |
| 189 return { | |
| 190 top: bbox.ne.y - node.offsetHeight, | |
| 191 left: bbox.ne.x | |
| 192 } | |
| 193 } | |
| 194 | |
| 195 function direction_sw() { | |
| 196 var bbox = getScreenBBox() | |
| 197 return { | |
| 198 top: bbox.sw.y, | |
| 199 left: bbox.sw.x - node.offsetWidth | |
| 200 } | |
| 201 } | |
| 202 | |
| 203 function direction_se() { | |
| 204 var bbox = getScreenBBox() | |
| 205 return { | |
| 206 top: bbox.se.y, | |
| 207 left: bbox.e.x | |
| 208 } | |
| 209 } | |
| 210 | |
| 211 function initNode() { | |
| 212 var node = d3.select(document.createElement('div')) | |
| 213 node.style({ | |
| 214 position: 'absolute', | |
| 215 opacity: 0, | |
| 216 pointerEvents: 'none', | |
| 217 boxSizing: 'border-box' | |
| 218 }) | |
| 219 | |
| 220 return node.node() | |
| 221 } | |
| 222 | |
| 223 function getSVGNode(el) { | |
| 224 el = el.node() | |
| 225 if(el.tagName.toLowerCase() == 'svg') | |
| 226 return el | |
| 227 | |
| 228 return el.ownerSVGElement | |
| 229 } | |
| 230 | |
| 231 // Private - gets the screen coordinates of a shape | |
| 232 // | |
| 233 // Given a shape on the screen, will return an SVGPoint for the directions | |
| 234 // n(north), s(south), e(east), w(west), ne(northeast), se(southeast), nw(northwest), | |
| 235 // sw(southwest). | |
| 236 // | |
| 237 // +-+-+ | |
| 238 // | | | |
| 239 // + + | |
| 240 // | | | |
| 241 // +-+-+ | |
| 242 // | |
| 243 // Returns an Object {n, s, e, w, nw, sw, ne, se} | |
| 244 function getScreenBBox() { | |
| 245 var targetel = target || d3.event.target, | |
| 246 bbox = {}, | |
| 247 matrix = targetel.getScreenCTM(), | |
| 248 tbbox = targetel.getBBox(), | |
| 249 width = tbbox.width, | |
| 250 height = tbbox.height, | |
| 251 x = tbbox.x, | |
| 252 y = tbbox.y, | |
| 253 scrollTop = document.documentElement.scrollTop || document.body.scrollTop, | |
| 254 scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft | |
| 255 | |
| 256 | |
| 257 point.x = x + scrollLeft | |
| 258 point.y = y + scrollTop | |
| 259 bbox.nw = point.matrixTransform(matrix) | |
| 260 point.x += width | |
| 261 bbox.ne = point.matrixTransform(matrix) | |
| 262 point.y += height | |
| 263 bbox.se = point.matrixTransform(matrix) | |
| 264 point.x -= width | |
| 265 bbox.sw = point.matrixTransform(matrix) | |
| 266 point.y -= height / 2 | |
| 267 bbox.w = point.matrixTransform(matrix) | |
| 268 point.x += width | |
| 269 bbox.e = point.matrixTransform(matrix) | |
| 270 point.x -= width / 2 | |
| 271 point.y -= height / 2 | |
| 272 bbox.n = point.matrixTransform(matrix) | |
| 273 point.y += height | |
| 274 bbox.s = point.matrixTransform(matrix) | |
| 275 | |
| 276 return bbox | |
| 277 } | |
| 278 | |
| 279 return tip | |
| 280 }; |
