UNPKG

higlass

Version:

HiGlass Hi-C / genomic / large data viewer

119 lines (93 loc) 3.02 kB
// @ts-nocheck import { Mixin, mix } from './mixwith'; import PixiTrack from './PixiTrack'; import RuleMixin from './RuleMixin'; import { colorToHex } from './utils'; export const VerticalRuleMixin = Mixin( (superclass) => class extends superclass { drawVerticalRule(graphics) { let stroke = colorToHex(this.options.color || 'black'); if (this.highlighted) { stroke = colorToHex('red'); } graphics.lineStyle(this.strokeWidth, stroke, this.strokeOpacity); let pos = 0; // console.log('this.position', this.position); // console.log('this._xScale.range()', this._xScale.range()); while (pos < this.dimensions[1]) { graphics.moveTo(this._xScale(this.xPosition), pos); graphics.lineTo(this._xScale(this.xPosition), pos + this.dashLength); pos += this.dashLength + this.dashGap; } } isMouseOverVerticalLine(mousePos) { return ( Math.abs( mousePos.x - this.position[0] - this._xScale(this.xPosition), ) < this.MOUSEOVER_RADIUS ); } }, ); export default class VerticalRule extends mix(PixiTrack).with( RuleMixin, VerticalRuleMixin, ) { constructor(context, options) { super(context, options); this.xPosition = context.xPosition; this.strokeWidth = 2; this.strokeOpacity = 1; this.dashLength = 5; this.dashGap = 3; } draw() { const graphics = this.pMain; graphics.clear(); this.drawVerticalRule(graphics); this.animate(); } /** * Export an SVG representation of this track * * @returns {Array} The two returned DOM nodes are both SVG * elements [base,track]. Base is a parent which contains track as a * child. Track is clipped with a clipping rectangle contained in base. * */ exportSVG() { let track = null; let base = null; if (super.exportSVG) { [base, track] = super.exportSVG(); } else { base = document.createElement('g'); track = base; } const output = document.createElement('g'); output.setAttribute('class', 'vertical-rule'); output.setAttribute( 'transform', `translate(${this.position[0]},${this.position[1]})`, ); track.appendChild(output); const stroke = this.options.color || 'black'; const line = document.createElement('line'); line.setAttribute('stroke', stroke); line.setAttribute('stroke-width', this.strokeWidth); line.setAttribute('stroke-dasharray', `${this.dashLength} ${this.dashGap}`); line.setAttribute('x1', this._xScale(this.xPosition)); line.setAttribute('y1', 0); line.setAttribute('x2', this._xScale(this.xPosition)); line.setAttribute('y2', this.dimensions[1]); output.appendChild(line); return [base, track]; } mouseMoveHandler(mousePos) { this.highlighted = this.isWithin(mousePos.x, mousePos.y) && this.isMouseOverVerticalLine(mousePos); this.draw(); } }