/* eslint-disable no-var */ /* globals svgEditor, svgedit, $ */ /* * ext-eyedropper.js * * Licensed under the MIT License * * Copyright(c) 2010 Jeff Schiller * */ // Dependencies: // 1) jQuery // 2) history.js // 3) svg_editor.js // 4) svgcanvas.js svgEditor.addExtension('eyedropper', function (S) { 'use strict'; var // NS = svgedit.NS, // svgcontent = S.svgcontent, // svgdoc = S.svgroot.parentNode.ownerDocument, svgCanvas = svgEditor.canvas, ChangeElementCommand = svgedit.history.ChangeElementCommand, addToHistory = function (cmd) { svgCanvas.undoMgr.addCommandToHistory(cmd); }, currentStyle = { fillPaint: 'red', fillOpacity: 1.0, strokePaint: 'black', strokeOpacity: 1.0, strokeWidth: 5, strokeDashArray: null, opacity: 1.0, strokeLinecap: 'butt', strokeLinejoin: 'miter' }; function getStyle (opts) { // if we are in eyedropper mode, we don't want to disable the eye-dropper tool var mode = svgCanvas.getMode(); if (mode === 'eyedropper') { return; } var elem = null; var tool = $('#tool_eyedropper'); // enable-eye-dropper if one element is selected if (!opts.multiselected && opts.elems[0] && $.inArray(opts.elems[0].nodeName, ['svg', 'g', 'use']) === -1 ) { elem = opts.elems[0]; tool.removeClass('disabled'); // grab the current style currentStyle.fillPaint = elem.getAttribute('fill') || 'black'; currentStyle.fillOpacity = elem.getAttribute('fill-opacity') || 1.0; currentStyle.strokePaint = elem.getAttribute('stroke'); currentStyle.strokeOpacity = elem.getAttribute('stroke-opacity') || 1.0; currentStyle.strokeWidth = elem.getAttribute('stroke-width'); currentStyle.strokeDashArray = elem.getAttribute('stroke-dasharray'); currentStyle.strokeLinecap = elem.getAttribute('stroke-linecap'); currentStyle.strokeLinejoin = elem.getAttribute('stroke-linejoin'); currentStyle.opacity = elem.getAttribute('opacity') || 1.0; // disable eye-dropper tool } else { tool.addClass('disabled'); } } return { name: 'eyedropper', svgicons: svgEditor.curConfig.extPath + 'eyedropper-icon.xml', buttons: [{ id: 'tool_eyedropper', type: 'mode', title: 'Eye Dropper Tool', key: 'I', events: { click: function () { svgCanvas.setMode('eyedropper'); } } }], // if we have selected an element, grab its paint and enable the eye dropper button selectedChanged: getStyle, elementChanged: getStyle, mouseDown: function (opts) { var mode = svgCanvas.getMode(); if (mode === 'eyedropper') { var e = opts.event; var target = e.target; if ($.inArray(target.nodeName, ['svg', 'g', 'use']) === -1) { var changes = {}; var change = function (elem, attrname, newvalue) { changes[attrname] = elem.getAttribute(attrname); elem.setAttribute(attrname, newvalue); }; if (currentStyle.fillPaint) { change(target, 'fill', currentStyle.fillPaint); } if (currentStyle.fillOpacity) { change(target, 'fill-opacity', currentStyle.fillOpacity); } if (currentStyle.strokePaint) { change(target, 'stroke', currentStyle.strokePaint); } if (currentStyle.strokeOpacity) { change(target, 'stroke-opacity', currentStyle.strokeOpacity); } if (currentStyle.strokeWidth) { change(target, 'stroke-width', currentStyle.strokeWidth); } if (currentStyle.strokeDashArray) { change(target, 'stroke-dasharray', currentStyle.strokeDashArray); } if (currentStyle.opacity) { change(target, 'opacity', currentStyle.opacity); } if (currentStyle.strokeLinecap) { change(target, 'stroke-linecap', currentStyle.strokeLinecap); } if (currentStyle.strokeLinejoin) { change(target, 'stroke-linejoin', currentStyle.strokeLinejoin); } addToHistory(new ChangeElementCommand(target, changes)); } } } }; });