import { copyAndPast } from '../diagram/group-select-applay.js'; import { classAdd, classDel, clickForAll, listen, classSingleAdd, evtTargetAttr } from '../infrastructure/util.js'; import { PathSmbl } from './path-smbl.js'; export class PathSettings extends HTMLElement { /** * @param {CanvasElement} canvas * @param {PathElement} pathElement */ constructor(canvas, pathElement) { super(); /** @private */ this._pathElement = pathElement; /** @private */ this._canvas = canvas; } connectedCallback() { const pathStyles = this._pathElement[PathSmbl].data.styles; const actStyle = style => this._pathElement[PathSmbl].data.styles?.includes(style) ? 'class="actv"' : ''; const shadow = this.attachShadow({ mode: 'closed' }); shadow.innerHTML = `
`; // colors, del listen(shadow.getElementById('edit'), 'cmd', /** @param {CustomEvent<{cmd:string, arg:string}>} evt */ evt => { switch (evt.detail.cmd) { case 'style': classSingleAdd(this._pathElement, this._pathElement[PathSmbl].data, 'cl-', evt.detail.arg); break; case 'del': this._pathElement[PathSmbl].del(); break; case 'copy': copyAndPast(this._canvas, [this._pathElement]); break; } }); // arrows, dotted clickForAll(shadow, '[data-cmd]', evt => { const argStyle = evtTargetAttr(evt, 'data-cmd-arg'); const currentArr = pathStyles.indexOf(argStyle); if (currentArr > -1) { classDel(this._pathElement, argStyle); pathStyles.splice(currentArr, 1); classDel(evt.currentTarget, 'actv'); } else { classAdd(this._pathElement, argStyle); pathStyles.push(argStyle); classAdd(evt.currentTarget, 'actv'); } }); } } customElements.define('ap-path-settings', PathSettings); /** @typedef { import('./path-smbl').PathElement } PathElement */ /** @typedef { import('../infrastructure/canvas-smbl.js').CanvasElement } CanvasElement */