import FastSelectionModel from "../selection/FastSelectionModel" import GraphElement from "./GraphElement" import Template from "../template/Template" export default class GraphSelector extends GraphElement { constructor() { super({}, new Template()) /** * @type {import("./GraphSelector").default} */ this.selectionModel = null } connectedCallback() { super.connectedCallback() this.classList.add('ueb-selector') this.dataset.selecting = "false" } /** * Create a selection rectangle starting from the specified position * @param {number[]} initialPosition - Selection rectangle initial position (relative to the .ueb-grid element) */ startSelecting(initialPosition) { initialPosition = this.blueprint.compensateTranslation(initialPosition) // Set initial position this.style.setProperty('--ueb-select-from-x', initialPosition[0]) this.style.setProperty('--ueb-select-from-y', initialPosition[1]) // Final position coincide with the initial position, at the beginning of selection this.style.setProperty('--ueb-select-to-x', initialPosition[0]) this.style.setProperty('--ueb-select-to-y', initialPosition[1]) this.dataset.selecting = "true" this.selectionModel = new FastSelectionModel(initialPosition, this.blueprint.getNodes(), this.blueprint.nodeBoundariesSupplier, this.blueprint.nodeSelectToggleFunction) } /** * Move selection rectagle to the specified final position. The initial position was specified by startSelecting() * @param {number[]} finalPosition - Selection rectangle final position (relative to the .ueb-grid element) */ doSelecting(finalPosition) { finalPosition = this.blueprint.compensateTranslation(finalPosition) this.style.setProperty('--ueb-select-to-x', finalPosition[0]) this.style.setProperty('--ueb-select-to-y', finalPosition[1]) this.selectionModel.selectTo(finalPosition) } finishSelecting() { this.dataset.selecting = "false" this.selectionModel = null } } customElements.define('u-selector', GraphSelector)