| /* globals jQuery */ | 
| /** | 
|  * ext-star.js | 
|  * | 
|  * | 
|  * @copyright 2010 CloudCanvas, Inc. All rights reserved | 
|  * | 
|  */ | 
| export default { | 
|   name: 'star', | 
|   async init (S) { | 
|     const svgEditor = this; | 
|     const $ = jQuery; | 
|     const svgCanvas = svgEditor.canvas; | 
|   | 
|     const {importLocale} = S; // {svgcontent}, | 
|     let | 
|       selElems, | 
|       // editingitex = false, | 
|       // svgdoc = S.svgroot.parentNode.ownerDocument, | 
|       started, | 
|       newFO; | 
|       // edg = 0, | 
|       // newFOG, newFOGParent, newDef, newImageName, newMaskID, | 
|       // undoCommand = 'Not image', | 
|       // modeChangeG, ccZoom, wEl, hEl, wOffset, hOffset, ccRgbEl, brushW, brushH; | 
|     const strings = await importLocale(); | 
|     function showPanel (on) { | 
|       let fcRules = $('#fc_rules'); | 
|       if (!fcRules.length) { | 
|         fcRules = $('<style id="fc_rules"></style>').appendTo('head'); | 
|       } | 
|       fcRules.text(!on ? '' : ' #tool_topath { display: none !important; }'); | 
|       $('#star_panel').toggle(on); | 
|     } | 
|   | 
|     /* | 
|     function toggleSourceButtons(on){ | 
|       $('#star_save, #star_cancel').toggle(on); | 
|     } | 
|     */ | 
|   | 
|     function setAttr (attr, val) { | 
|       svgCanvas.changeSelectedAttribute(attr, val); | 
|       svgCanvas.call('changed', selElems); | 
|     } | 
|   | 
|     /* | 
|     function cot(n){ | 
|       return 1 / Math.tan(n); | 
|     } | 
|   | 
|     function sec(n){ | 
|       return 1 / Math.cos(n); | 
|     } | 
|     */ | 
|     const buttons = [{ | 
|       id: 'tool_star', | 
|       icon: svgEditor.curConfig.extIconsPath + 'star.png', | 
|       type: 'mode', | 
|       position: 12, | 
|       events: { | 
|         click () { | 
|           showPanel(true); | 
|           svgCanvas.setMode('star'); | 
|         } | 
|       } | 
|     }]; | 
|     const contextTools = [{ | 
|       type: 'input', | 
|       panel: 'star_panel', | 
|       id: 'starNumPoints', | 
|       size: 3, | 
|       defval: 5, | 
|       events: { | 
|         change () { | 
|           setAttr('point', this.value); | 
|         } | 
|       } | 
|     }, { | 
|       type: 'input', | 
|       panel: 'star_panel', | 
|       id: 'starRadiusMulitplier', | 
|       size: 3, | 
|       defval: 2.5 | 
|     }, { | 
|       type: 'input', | 
|       panel: 'star_panel', | 
|       id: 'radialShift', | 
|       size: 3, | 
|       defval: 0, | 
|       events: { | 
|         change () { | 
|           setAttr('radialshift', this.value); | 
|         } | 
|       } | 
|     }]; | 
|   | 
|     return { | 
|       name: strings.name, | 
|       svgicons: svgEditor.curConfig.extIconsPath + 'star-icons.svg', | 
|       buttons: strings.buttons.map((button, i) => { | 
|         return Object.assign(buttons[i], button); | 
|       }), | 
|       context_tools: strings.contextTools.map((contextTool, i) => { | 
|         return Object.assign(contextTools[i], contextTool); | 
|       }), | 
|       callback () { | 
|         $('#star_panel').hide(); | 
|         // const endChanges = function(){}; | 
|       }, | 
|       mouseDown (opts) { | 
|         const rgb = svgCanvas.getColor('fill'); | 
|         // const ccRgbEl = rgb.substring(1, rgb.length); | 
|         const sRgb = svgCanvas.getColor('stroke'); | 
|         // const ccSRgbEl = sRgb.substring(1, rgb.length); | 
|         const sWidth = svgCanvas.getStrokeWidth(); | 
|   | 
|         if (svgCanvas.getMode() === 'star') { | 
|           started = true; | 
|   | 
|           newFO = svgCanvas.addSVGElementFromJson({ | 
|             element: 'polygon', | 
|             attr: { | 
|               cx: opts.start_x, | 
|               cy: opts.start_y, | 
|               id: svgCanvas.getNextId(), | 
|               shape: 'star', | 
|               point: document.getElementById('starNumPoints').value, | 
|               r: 0, | 
|               radialshift: document.getElementById('radialShift').value, | 
|               r2: 0, | 
|               orient: 'point', | 
|               fill: rgb, | 
|               strokecolor: sRgb, | 
|               strokeWidth: sWidth | 
|             } | 
|           }); | 
|           return { | 
|             started: true | 
|           }; | 
|         } | 
|       }, | 
|       mouseMove (opts) { | 
|         if (!started) { | 
|           return; | 
|         } | 
|         if (svgCanvas.getMode() === 'star') { | 
|           const c = $(newFO).attr(['cx', 'cy', 'point', 'orient', 'fill', 'strokecolor', 'strokeWidth', 'radialshift']); | 
|   | 
|           let x = opts.mouse_x; | 
|           let y = opts.mouse_y; | 
|           const {cx, cy, fill, strokecolor, strokeWidth, radialshift, point, orient} = c, | 
|             circumradius = (Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy))) / 1.5, | 
|             inradius = circumradius / document.getElementById('starRadiusMulitplier').value; | 
|           newFO.setAttribute('r', circumradius); | 
|           newFO.setAttribute('r2', inradius); | 
|   | 
|           let polyPoints = ''; | 
|           for (let s = 0; point >= s; s++) { | 
|             let angle = 2.0 * Math.PI * (s / point); | 
|             if (orient === 'point') { | 
|               angle -= (Math.PI / 2); | 
|             } else if (orient === 'edge') { | 
|               angle = (angle + (Math.PI / point)) - (Math.PI / 2); | 
|             } | 
|   | 
|             x = (circumradius * Math.cos(angle)) + cx; | 
|             y = (circumradius * Math.sin(angle)) + cy; | 
|   | 
|             polyPoints += x + ',' + y + ' '; | 
|   | 
|             if (!isNaN(inradius)) { | 
|               angle = (2.0 * Math.PI * (s / point)) + (Math.PI / point); | 
|               if (orient === 'point') { | 
|                 angle -= (Math.PI / 2); | 
|               } else if (orient === 'edge') { | 
|                 angle = (angle + (Math.PI / point)) - (Math.PI / 2); | 
|               } | 
|               angle += radialshift; | 
|   | 
|               x = (inradius * Math.cos(angle)) + cx; | 
|               y = (inradius * Math.sin(angle)) + cy; | 
|   | 
|               polyPoints += x + ',' + y + ' '; | 
|             } | 
|           } | 
|           newFO.setAttribute('points', polyPoints); | 
|           newFO.setAttribute('fill', fill); | 
|           newFO.setAttribute('stroke', strokecolor); | 
|           newFO.setAttribute('stroke-width', strokeWidth); | 
|           /* const shape = */ newFO.getAttribute('shape'); | 
|   | 
|           return { | 
|             started: true | 
|           }; | 
|         } | 
|       }, | 
|       mouseUp () { | 
|         if (svgCanvas.getMode() === 'star') { | 
|           const attrs = $(newFO).attr(['r']); | 
|           // svgCanvas.addToSelection([newFO], true); | 
|           return { | 
|             keep: (attrs.r !== '0'), | 
|             element: newFO | 
|           }; | 
|         } | 
|       }, | 
|       selectedChanged (opts) { | 
|         // Use this to update the current selected elements | 
|         selElems = opts.elems; | 
|   | 
|         let i = selElems.length; | 
|         while (i--) { | 
|           const elem = selElems[i]; | 
|           if (elem && elem.getAttribute('shape') === 'star') { | 
|             if (opts.selectedElement && !opts.multiselected) { | 
|               // $('#starRadiusMulitplier').val(elem.getAttribute('r2')); | 
|               $('#starNumPoints').val(elem.getAttribute('point')); | 
|               $('#radialShift').val(elem.getAttribute('radialshift')); | 
|               showPanel(true); | 
|             } else { | 
|               showPanel(false); | 
|             } | 
|           } else { | 
|             showPanel(false); | 
|           } | 
|         } | 
|       }, | 
|       elementChanged (opts) { | 
|         // const elem = opts.elems[0]; | 
|       } | 
|     }; | 
|   } | 
| }; |