UNPKG

svgedit

Version:

Powerful SVG-Editor for your browser

369 lines (331 loc) 16.2 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: components/seFlyingButton.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: components/seFlyingButton.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>/* globals svgEditor */ import { t } from '../locale.js' /** * @class FlyingButton */ export class FlyingButton extends HTMLElement { /** * @function constructor */ constructor () { super() // create the shadowDom and insert the template this.imgPath = svgEditor.configObj.curConfig.imgPath this.template = this.createTemplate(this.imgPath) this._shadowRoot = this.attachShadow({ mode: 'open' }) this._shadowRoot.append(this.template.content.cloneNode(true)) // locate the component this.$button = this._shadowRoot.querySelector('.menu-button') this.$handle = this._shadowRoot.querySelector('.handle') this.$overall = this._shadowRoot.querySelector('.overall') this.$img = this._shadowRoot.querySelector('img') this.$menu = this._shadowRoot.querySelector('.menu') // the last element of the div is the slot // we retrieve all elements added in the slot (i.e. se-buttons) this.$elements = this.$menu.lastElementChild.assignedElements() // Closes opened menu on click document.addEventListener('click', e => { if (this.opened) { this.opened = false } }) } /** * @function createTemplate * @param {string} imgPath * @returns {any} template */ createTemplate (imgPath) { const template = document.createElement('template') template.innerHTML = ` &lt;style> :host { position:relative; } @keyframes btnHover { from { background-color: transparent; } to { background-color: var(--icon-bg-color-hover); } } .overall .menu-button:hover { animation: btnHover 0.2s forwards; } img { border: none; width: 24px; height: 24px; } .overall.pressed .button-icon, .overall.pressed .handle { background-color: var(--icon-bg-color-hover) !important; } .overall.pressed .menu-button { background-color: var(--icon-bg-color-hover) !important; } .disabled { opacity: 0.3; cursor: default; } .menu-button { height: 24px; width: 24px; margin: 2px 1px 4px; padding: 3px; background-color: var(--icon-bg-color); cursor: pointer; position: relative; border-radius: 3px; overflow: hidden; } .handle { height: 8px; width: 8px; background-image: url(${imgPath}/handle.svg); position:absolute; bottom: 0px; right: 0px; } .button-icon { } .menu { position: fixed; background: none !important; display:none; margin-left: 34px; } .open { display: flex; } .menu-item { align-content: flex-start; height: 24px; width: 24px; top:0px; left:0px; } .overall { background: none !important; } &lt;/style> &lt;div class="overall"> &lt;div class="menu"> &lt;slot>&lt;/slot> &lt;/div> &lt;div class="menu-button"> &lt;img class="button-icon" src="logo.svg" alt="icon"> &lt;div class="handle">&lt;/div> &lt;/div> &lt;/div>` return template } /** * @function observedAttributes * @returns {any} observed */ static get observedAttributes () { return ['title', 'pressed', 'disabled', 'opened'] } /** * @function attributeChangedCallback * @param {string} name * @param {string} oldValue * @param {string} newValue * @returns {void} */ attributeChangedCallback (name, oldValue, newValue) { if (oldValue === newValue) return switch (name) { case 'title': { const shortcut = this.getAttribute('shortcut') this.$button.setAttribute('title', `${t(newValue)} ${shortcut ? `[${t(shortcut)}]` : ''}`) } break case 'pressed': if (newValue) { this.$overall.classList.add('pressed') } else { this.$overall.classList.remove('pressed') } break case 'opened': if (newValue) { this.$menu.classList.add('open') } else { this.$menu.classList.remove('open') } break case 'disabled': if (newValue) { this.$overall.classList.add('disabled') } else { this.$overall.classList.remove('disabled') } break default: console.error(`unknown attribute: ${name}`) break } } /** * @function get * @returns {any} */ get title () { return this.getAttribute('title') } /** * @function set * @returns {void} */ set title (value) { this.setAttribute('title', value) } /** * @function get * @returns {any} */ get pressed () { return this.hasAttribute('pressed') } /** * @function set * @returns {void} */ set pressed (value) { // boolean value => existence = true if (value) { this.setAttribute('pressed', 'true') } else { this.removeAttribute('pressed', '') // close also the menu if open this.removeAttribute('opened') } } /** * @function get * @returns {any} */ get opened () { return this.hasAttribute('opened') } /** * @function set * @returns {void} */ set opened (value) { // boolean value => existence = true if (value) { this.setAttribute('opened', 'opened') } else { this.removeAttribute('opened') } } /** * @function get * @returns {any} */ get disabled () { return this.hasAttribute('disabled') } /** * @function set * @returns {void} */ set disabled (value) { // boolean value => existence = true if (value) { this.setAttribute('disabled', 'true') } else { this.removeAttribute('disabled', '') } } /** * @function connectedCallback * @returns {void} */ connectedCallback () { this.activeSlot = this.shadowRoot.querySelector('slot').assignedElements()[0] this.$img.setAttribute('src', this.imgPath + '/' + this.activeSlot.getAttribute('src')) // capture click event on the button to manage the logic const onClickHandler = (ev) => { ev.stopPropagation() switch (ev.target.nodeName) { case 'SE-FLYINGBUTTON': if (this.pressed) { this.setAttribute('opened', 'opened') } else { // launch current action this.activeSlot.click() this.setAttribute('pressed', 'pressed') } break case 'SE-BUTTON': // change to the current action this.$img.setAttribute('src', this.imgPath + '/' + ev.target.getAttribute('src')) this.activeSlot = ev.target this.setAttribute('pressed', 'pressed') // and close the menu this.$menu.classList.remove('open') break case 'DIV': // this is a click on the handle so let's open/close the menu. if (this.opened) { this.removeAttribute('opened') } else { this.setAttribute('opened', 'opened') // In case menu scroll on top or bottom position based popup position set const rect = this.getBoundingClientRect() this.$menu.style.top = rect.top + 'px' } break default: console.error('unkonw nodeName for:', ev.target, ev.target.className) } } // capture event from slots svgEditor.$click(this, onClickHandler) svgEditor.$click(this.$handle, onClickHandler) } } // Register customElements.define('se-flyingbutton', FlyingButton) </code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="editor_extensions_ext-layer_view_locale_zh-CN.module_js.html">editor/extensions/ext-layer_view/locale/zh-CN.js</a></li><li><a href="module-SVGEditor.html">SVGEditor</a></li><li><a href="module-contextmenu.html">contextmenu</a></li><li><a href="module-jGraduate.html">jGraduate</a></li><li><a href="module-jPicker.html">jPicker</a></li><li><a href="module-locale.html">locale</a></li></ul><h3>Externals</h3><ul><li><a href="external-JamilihArray.html">JamilihArray</a></li><li><a href="external-Math.html">Math</a></li><li><a href="external-Window.html">Window</a></li><li><a href="external-jQuery.html">jQuery</a></li></ul><h3>Namespaces</h3><ul><li><a href="external-jQuery.fn.html">fn</a></li><li><a href="external-jQuery.fn.$.fn.jPicker.defaults.html">defaults</a></li><li><a href="external-jQuery.fn.exports.jPickerMethod.html">exports.jPickerMethod</a></li><li><a href="external-jQuery.fn.jGraduateDefaults.html">jGraduateDefaults</a></li><li><a href="external-jQuery.fn.jGraduateDefaults.images.html">images</a></li><li><a href="external-jQuery.fn.jGraduateDefaults.window.html">window</a></li><li><a href="external-jQuery.jGraduate.html">jGraduate</a></li><li><a href="external-jQuery.jPicker.html">jPicker</a></li><li><a href="external-jQuery.jPicker.ColorMethods.html">ColorMethods</a></li></ul><h3>Classes</h3><ul><li><a href="BottomPanel.html">BottomPanel</a></li><li><a href="Dropdown.html">Dropdown</a></li><li><a href="EditorStartup.html">EditorStartup</a></li><li><a href="ElixMenuButton.html">ElixMenuButton</a></li><li><a href="ElixNumberSpinBox.html">ElixNumberSpinBox</a></li><li><a href="ExplorerButton.html">ExplorerButton</a></li><li><a href="FlyingButton.html">FlyingButton</a></li><li><a href="LayersPanel.html">LayersPanel</a></li><li><a href="LeftPanel.html">LeftPanel</a></li><li><a href="MainMenu.html">MainMenu</a></li><li><a href="NumberSpinBox.html">NumberSpinBox</a></li><li><a href="PaintBox.html">PaintBox</a></li><li><a href="PlainNumberSpinBox.html">PlainNumberSpinBox</a></li><li><a href="Rulers.html">Rulers</a></li><li><a href="SEInput.html">SEInput</a></li><li><a href="SEPalette.html">SEPalette</a></li><li><a href="SESpinInput.html">SESpinInput</a></li><li><a href="SeCMenuDialog.html">SeCMenuDialog</a></li><li><a href="SeCMenuLayerDialog.html">SeCMenuLayerDialog</a></li><li><a href="SeColorPicker.html">SeColorPicker</a></li><li><a href="SeEditPrefsDialog.html">SeEditPrefsDialog</a></li><li><a href="SeExportDialog.html">SeExportDialog</a></li><li><a href="SeImgPropDialog.html">SeImgPropDialog</a></li><li><a href="SeList.html">SeList</a></li><li><a href="SeMenu.html">SeMenu</a></li><li><a href="SeMenuItem.html">SeMenuItem</a></li><li><a href="SePlainAlertDialog.html">SePlainAlertDialog</a></li><li><a href="SePlainBorderButton.html">SePlainBorderButton</a></li><li><a href="SePromptDialog.html">SePromptDialog</a></li><li><a href="SeStorageDialog.html">SeStorageDialog</a></li><li><a href="SeSvgSourceEditorDialog.html">SeSvgSourceEditorDialog</a></li><li><a href="SeText.html">SeText</a></li><li><a href="ToolButton.html">ToolButton</a></li><li><a href="TopPanel.html">TopPanel</a></li><li><a href="configObj.html">configObj</a></li><li><a href="external-jQuery.jGraduate.Paint.html">Paint</a></li><li><a href="external-jQuery.jPicker.Color.html">Color</a></li><li><a href="module.exports.html">exports</a></li><li><a href="module.exports_module.exports.html">exports</a></li><li><a href="module-SVGEditor-Editor.html">Editor</a></li><li><a href="module-jPicker.module.exports.html">module.exports</a></li></ul><h3>Interfaces</h3><ul><li><a href="module-SVGEditor.Config.html">Config</a></li><li><a href="module-SVGEditor.Prefs.html">Prefs</a></li><li><a href="module-SVGthis.CustomHandler.html">CustomHandler</a></li><li><a href="module-locale.LocaleEditorInit.html">LocaleEditorInit</a></li></ul><h3>Events</h3><ul><li><a href="module-SVGEditor.html#event:event:svgEditorReadyEvent">svgEditorReadyEvent</a></li></ul><h3>Tutorials</h3><ul><li><a href="tutorial-CanvasAPI.html">CanvasAPI</a></li><li><a href="tutorial-Editor.html">Editor</a></li><li><a href="tutorial-EditorAPI.html">EditorAPI</a></li><li><a href="tutorial-Events.html">Events</a></li><li><a href="tutorial-FrequentlyAskedQuestions.html">Frequently Asked Questions (FAQ)</a></li></ul><h3>Global</h3><ul><li><a href="global.html#attributeChangedCallback">attributeChangedCallback</a></li><li><a href="global.html#connectedCallback">connectedCallback</a></li><li><a href="global.html#constructor">constructor</a></li><li><a href="global.html#createTemplate">createTemplate</a></li><li><a href="global.html#decrement">decrement</a></li><li><a href="global.html#expireCookie">expireCookie</a></li><li><a href="global.html#formatValueFormatthenumericvalueasastring.Thisisusedafterincrementing/decrementingthevaluetoreformatthevalueasastring.">formatValue Format the numeric value as a string. This is used after incrementing/decrementing the value to reformat the value as a string.</a></li><li><a href="global.html#get">get</a></li><li><a href="global.html#handleClick">handleClick</a></li><li><a href="global.html#handleClose">handleClose</a></li><li><a href="global.html#handleInput">handleInput</a></li><li><a href="global.html#handleKeyDown">handleKeyDown</a></li><li><a href="global.html#handleMouseDown">handleMouseDown</a></li><li><a href="global.html#handleMouseUp">handleMouseUp</a></li><li><a href="global.html#handleOptionsChange">handleOptionsChange</a></li><li><a href="global.html#handleSelect">handleSelect</a></li><li><a href="global.html#handleShow">handleShow</a></li><li><a href="global.html#increment">increment</a></li><li><a href="global.html#init">init</a></li><li><a href="global.html#inputsize">inputsize</a></li><li><a href="global.html#isNullish">isNullish</a></li><li><a href="global.html#loadloadConfig">load load Config</a></li><li><a href="global.html#loadFromURLLoadconfig/datafromURLifgiven">loadFromURL Load config/data from URL if given</a></li><li><a href="global.html#name">name</a></li><li><a href="global.html#observedAttributes">observedAttributes</a></li><li><a href="global.html#parseValue">parseValue</a></li><li><a href="global.html#pref">pref</a></li><li><a href="global.html#readySignal">readySignal</a></li><li><a href="global.html#regexEscape">regexEscape</a></li><li><a href="global.html#removeStoragePrefCookie">removeStoragePrefCookie</a></li><li><a href="global.html#replaceStoragePrompt">replaceStoragePrompt</a></li><li><a href="global.html#set">set</a></li><li><a href="global.html#setupCurConfig">setupCurConfig</a></li><li><a href="global.html#setupCurPrefs">setupCurPrefs</a></li><li><a href="global.html#src">src</a></li><li><a href="global.html#stateEffects">stateEffects</a></li><li><a href="global.html#stepDown">stepDown</a></li><li><a href="global.html#stepUp">stepUp</a></li><li><a href="global.html#triggerInputChanged">triggerInputChanged</a></li><li><a href="global.html#updateLib">updateLib</a></li><li><a href="global.html#value">value</a></li></ul> </nav> <br class="clear"> <footer> Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.5</a> on Sun Dec 07 2025 19:46:40 GMT+0100 (Central European Standard Time) </footer> <script> prettyPrint(); </script> <script src="scripts/linenumber.js"> </script> </body> </html>