import { extend, nodeOrNew, register, wrapWithAttrCheck } from '../utils/adopter.js' import { proportionalSize } from '../utils/utils.js' import { registerMethods } from '../utils/methods.js' import PointArray from '../types/PointArray.js' import Shape from './Shape.js' import * as pointed from '../modules/core/pointed.js' export default class Line extends Shape { // Initialize node constructor(node, attrs = node) { super(nodeOrNew('line', node), attrs) } // Get array array() { return new PointArray([ [this.attr('x1'), this.attr('y1')], [this.attr('x2'), this.attr('y2')] ]) } // Move by left top corner move(x, y) { return this.attr(this.array().move(x, y).toLine()) } // Overwrite native plot() method plot(x1, y1, x2, y2) { if (x1 == null) { return this.array() } else if (typeof y1 !== 'undefined') { x1 = { x1, y1, x2, y2 } } else { x1 = new PointArray(x1).toLine() } return this.attr(x1) } // Set element size to given width and height size(width, height) { const p = proportionalSize(this, width, height) return this.attr(this.array().size(p.width, p.height).toLine()) } } extend(Line, pointed) registerMethods({ Container: { // Create a line element line: wrapWithAttrCheck(function (...args) { // make sure plot is called as a setter // x1 is not necessarily a number, it can also be an array, a string and a PointArray return Line.prototype.plot.apply( this.put(new Line()), args[0] != null ? args : [0, 0, 0, 0] ) }) } }) register(Line, 'Line')