diff --git a/src/editor/LayersPanel.js b/src/editor/LayersPanel.js index e82569bd..fb0e7a6b 100644 --- a/src/editor/LayersPanel.js +++ b/src/editor/LayersPanel.js @@ -23,42 +23,6 @@ class LayersPanel { document.getElementById('layer_up').addEventListener('click', () => this.moveLayer.bind(this)(-1)); document.getElementById('layer_down').addEventListener('click', () => this.moveLayer.bind(this)(1)); document.getElementById('layer_rename').addEventListener('click', this.layerRename.bind(this)); - - const lmenuFunc = (action, el, pos) => { - switch (action) { - case 'dupe': - /* await */ this.cloneLayer(); - break; - case 'delete': - this.deleteLayer(); - break; - case 'merge_down': - this.mergeLayer(); - break; - case 'merge_all': - this.svgCanvas.mergeAllLayers(); - this.updateContextPanel(); - this.populateLayers(); - break; - } - }; - - $('#layer_moreopts').contextMenu( - { - menu: 'cmenu_layers', - inSpeed: 0, - allowLeft: true - }, - lmenuFunc - ); - - $('#layerlist').contextMenu( - { - menu: 'cmenu_layers', - inSpeed: 0 - }, - lmenuFunc - ); } /** * @returns {void} diff --git a/src/editor/dialogs/cmenuDialog.js b/src/editor/dialogs/cmenuDialog.js new file mode 100644 index 00000000..6d6750ef --- /dev/null +++ b/src/editor/dialogs/cmenuDialog.js @@ -0,0 +1,276 @@ +const template = document.createElement('template'); +template.innerHTML = ` + +
+`; +/** + * @class SeCMenuDialog + */ +export class SeCMenuDialog extends HTMLElement { + /** + * @function constructor + */ + constructor () { + super(); + // create the shadowDom and insert the template + this._shadowRoot = this.attachShadow({mode: 'open'}); + this._shadowRoot.appendChild(template.content.cloneNode(true)); + this._workarea = document.getElementById('workarea'); + this.$dialog = this._shadowRoot.querySelector('#cmenu_canvas'); + this.$copyLink = this._shadowRoot.querySelector('#se-copy'); + this.$cutLink = this._shadowRoot.querySelector('#se-cut'); + this.$pasteLink = this._shadowRoot.querySelector('#se-paste'); + this.$pasteInPlaceLink = this._shadowRoot.querySelector('#se-paste-in-place'); + this.$deleteLink = this._shadowRoot.querySelector('#se-delete'); + this.$groupLink = this._shadowRoot.querySelector('#se-group'); + this.$ungroupLink = this._shadowRoot.querySelector('#se-ungroup'); + this.$moveFrontLink = this._shadowRoot.querySelector('#se-move-front'); + this.$moveUpLink = this._shadowRoot.querySelector('#se-move-up'); + this.$moveDownLink = this._shadowRoot.querySelector('#se-move-down'); + this.$moveBackLink = this._shadowRoot.querySelector('#se-move-back'); + } + /** + * @function observedAttributes + * @returns {any} observed + */ + static get observedAttributes () { + return ['disableallmenu', 'enablemenuitems', 'disablemenuitems']; + } + /** + * @function attributeChangedCallback + * @param {string} name + * @param {string} oldValue + * @param {string} newValue + * @returns {void} + */ + attributeChangedCallback (name, oldValue, newValue) { + let eles = []; + const sdowRoot = this._shadowRoot; + switch (name) { + case 'disableallmenu': + if (newValue === 'true') { + const elesli = sdowRoot.querySelectorAll('li'); + elesli.forEach(function (eleli) { + eleli.classList.add('disabled'); + }); + } + break; + case 'enablemenuitems': + eles = newValue.split(','); + eles.forEach(function (ele) { + const selEle = sdowRoot.querySelector('a[href*="' + ele + '"]'); + selEle.parentElement.classList.remove('disabled'); + }); + break; + case 'disablemenuitems': + eles = newValue.split(','); + eles.forEach(function (ele) { + const selEle = sdowRoot.querySelector('a[href*="' + ele + '"]'); + selEle.parentElement.classList.add('disabled'); + }); + break; + default: + super.attributeChangedCallback(name, oldValue, newValue); + break; + } + } + /** + * @function get + * @returns {any} + */ + get disableallmenu () { + return this.getAttribute('disableallmenu'); + } + + /** + * @function set + * @returns {void} + */ + set disableallmenu (value) { + this.setAttribute('disableallmenu', value); + } + /** + * @function get + * @returns {any} + */ + get enablemenuitems () { + return this.getAttribute('enablemenuitems'); + } + + /** + * @function set + * @returns {void} + */ + set enablemenuitems (value) { + this.setAttribute('enablemenuitems', value); + } + /** + * @function get + * @returns {any} + */ + get disablemenuitems () { + return this.getAttribute('disablemenuitems'); + } + + /** + * @function set + * @returns {void} + */ + set disablemenuitems (value) { + this.setAttribute('disablemenuitems', value); + } + /** + * @function connectedCallback + * @returns {void} + */ + connectedCallback () { + const current = this; + const onMenuOpenHandler = (e) => { + e.preventDefault(); + current.$dialog.style.top = e.pageY + 'px'; + current.$dialog.style.left = e.pageX + 'px'; + current.$dialog.style.display = 'block'; + }; + const onMenuCloseHandler = (e) => { + if (e.button !== 2) { + current.$dialog.style.display = 'none'; + } + }; + const onMenuClickHandler = (e, action) => { + const triggerEvent = new CustomEvent('change', {detail: { + trigger: action + }}); + this.dispatchEvent(triggerEvent); + }; + this._workarea.addEventListener('contextmenu', onMenuOpenHandler); + this._workarea.addEventListener('mousedown', onMenuCloseHandler); + this.$cutLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'cut')); + this.$copyLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'copy')); + this.$pasteLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'paste')); + this.$pasteInPlaceLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'paste_in_place')); + this.$deleteLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'delete')); + this.$groupLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'group')); + this.$ungroupLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'ungroup')); + this.$moveFrontLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'move_front')); + this.$moveUpLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'move_up')); + this.$moveDownLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'move_down')); + this.$moveBackLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'move_back')); + } +} + +// Register +customElements.define('se-cmenu_canvas-dialog', SeCMenuDialog); diff --git a/src/editor/dialogs/cmenuLayersDialog.js b/src/editor/dialogs/cmenuLayersDialog.js new file mode 100644 index 00000000..94707834 --- /dev/null +++ b/src/editor/dialogs/cmenuLayersDialog.js @@ -0,0 +1,193 @@ +const template = document.createElement('template'); +template.innerHTML = ` + + +`; +/** + * @class SeCMenuLayerDialog + */ +export class SeCMenuLayerDialog extends HTMLElement { + /** + * @function constructor + */ + constructor () { + super(); + // create the shadowDom and insert the template + this._shadowRoot = this.attachShadow({mode: 'open'}); + this._shadowRoot.appendChild(template.content.cloneNode(true)); + this.source = ''; + this._workarea = undefined; + this.$sidePanels = document.getElementById('sidepanels'); + this.$dialog = this._shadowRoot.querySelector('#cmenu_layers'); + this.$duplicateLink = this._shadowRoot.querySelector('#se-dupe'); + this.$deleteLink = this._shadowRoot.querySelector('#se-layer-delete'); + this.$mergeDownLink = this._shadowRoot.querySelector('#se-merge-down'); + this.$mergeAllLink = this._shadowRoot.querySelector('#se-merge-all'); + } + /** + * @function observedAttributes + * @returns {any} observed + */ + static get observedAttributes () { + return ['value', 'leftclick']; + } + /** + * @function attributeChangedCallback + * @param {string} name + * @param {string} oldValue + * @param {string} newValue + * @returns {void} + */ + attributeChangedCallback (name, oldValue, newValue) { + if (oldValue === newValue) return; + switch (name) { + case 'value': + this.source = newValue; + if (newValue !== '' && newValue !== undefined) { + this._workarea = document.getElementById(this.source); + } + break; + default: + super.attributeChangedCallback(name, oldValue, newValue); + break; + } + } + /** + * @function get + * @returns {any} + */ + get value () { + return this.getAttribute('value'); + } + + /** + * @function set + * @returns {void} + */ + set value (value) { + this.setAttribute('value', value); + } + /** + * @function get + * @returns {any} + */ + get leftclick () { + return this.getAttribute('leftclick'); + } + + /** + * @function set + * @returns {void} + */ + set leftclick (value) { + this.setAttribute('leftclick', value); + } + /** + * @function connectedCallback + * @returns {void} + */ + connectedCallback () { + const current = this; + const onMenuOpenHandler = (e) => { + e.preventDefault(); + current.$dialog.style.top = e.pageY + 'px'; + current.$dialog.style.left = e.pageX + 'px'; + current.$dialog.style.display = 'block'; + }; + const onMenuCloseHandler = (e) => { + if (e.button !== 2) { + current.$dialog.style.display = 'none'; + } + }; + const onMenuClickHandler = (e, action, id) => { + const triggerEvent = new CustomEvent('change', {detail: { + trigger: action, + source: id + }}); + this.dispatchEvent(triggerEvent); + current.$dialog.style.display = 'none'; + }; + if (this._workarea !== undefined) { + this._workarea.addEventListener('contextmenu', onMenuOpenHandler); + if (this.getAttribute('leftclick') === 'true') { + this._workarea.addEventListener('click', onMenuOpenHandler); + } + this._workarea.addEventListener('mousedown', onMenuCloseHandler); + this.$sidePanels.addEventListener('mousedown', onMenuCloseHandler); + } + this.$duplicateLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'dupe', this.source)); + this.$deleteLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'delete', this.source)); + this.$mergeDownLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'merge_down', this.source)); + this.$mergeAllLink.addEventListener('click', (evt) => onMenuClickHandler(evt, 'merge_all', this.source)); + } +} + +// Register +customElements.define('se-cmenu-layers', SeCMenuLayerDialog); diff --git a/src/editor/dialogs/index.js b/src/editor/dialogs/index.js index efa4b307..faa5f538 100644 --- a/src/editor/dialogs/index.js +++ b/src/editor/dialogs/index.js @@ -1,3 +1,5 @@ import './imagePropertiesDialog.js'; import './editorPreferencesDialog.js'; import './svgSourceDialog.js'; +import './cmenuDialog.js'; +import './cmenuLayersDialog.js'; diff --git a/src/editor/index.html b/src/editor/index.html index b6585617..050ec65d 100644 --- a/src/editor/index.html +++ b/src/editor/index.html @@ -420,26 +420,6 @@ - - -