diff --git a/editor/svg-editor.js b/editor/svg-editor.js index 96b5b264..6a47332b 100644 --- a/editor/svg-editor.js +++ b/editor/svg-editor.js @@ -480,7 +480,8 @@ zoomInIcon = 'crosshair', zoomOutIcon = 'crosshair', ui_context = 'toolbars', - orig_source = ''; + orig_source = '', + paintBox = {fill: null, stroke:null}; // This sets up alternative dialog boxes. They mostly work the same way as // their UI counterparts, expect instead of returning the result, a callback @@ -570,9 +571,6 @@ var cur_context = ''; var orig_title = $('title:first').text(); - var fillPaint = new $.jGraduate.Paint({solidColor: curConfig.initFill.color}); - var strokePaint = new $.jGraduate.Paint({solidColor: curConfig.initStroke.color}); - var saveHandler = function(window,svg) { show_save_warning = false; @@ -661,8 +659,7 @@ // upon creation of a text element the editor is switched into // select mode and this event fires - we need our UI to be in sync - if (mode !== "multiselect" && !is_node) { - // FIXME: This also needs to fire if only one element is selected via multiselect + if (!is_node) { updateToolbar(); } @@ -789,18 +786,8 @@ // Makes sure the current selected paint is available to work with var prepPaints = function() { - for(var i = 0; i < 2; i++) { - var type = i === 0 ? 'fill': 'stroke'; - var cur = $('#' + type + '_color rect').attr('fill'); - if(cur.indexOf('url(') === 0) { - var grad = $('#' + type + '_color defs *')[0]; - var obj = {}; - obj.type = grad.tagName; - obj[grad.tagName] = grad; - var paint = new $.jGraduate.Paint(obj); - svgCanvas.setPaint(type, paint); - } - } + paintBox.fill.prep(); + paintBox.stroke.prep(); } var flyout_funcs = {}; @@ -1336,27 +1323,23 @@ // prevent undo on these canvas changes svgCanvas.setColor(type, paintColor, true); svgCanvas.setPaintOpacity(type, paintOpacity, true); - - // update the rect inside #fill_color/#stroke_color - var paint_rect = $("#" + type + "_color rect"); - paint_rect.attr('opacity', paintOpacity); + paintOpacity *= 100; - if(isFill) { - var paint = fillPaint = getPaint(paintColor, paintOpacity, type); - } else { - var paint = strokePaint = getPaint(paintColor, paintOpacity, type); - } + var paint = getPaint(paintColor, paintOpacity, type); - if(paint.type.indexOf('Gradient') >= 0) { - var elem = paint[paint.type]; - if(elem) { - elem.id = 'gradbox_' + type; - $("#" + type + "_color defs").empty().append(elem); - paint_rect.attr('fill', 'url(#gradbox_' + type + ')'); - } - } + // update the rect inside #fill_color/#stroke_color + paintBox[type].setPaint(paint); + +// if(paint.type.indexOf('Gradient') >= 0) { +// var elem = paint[paint.type]; +// if(elem) { +// elem.id = 'gradbox_' + type; +// $("#" + type + "_color defs").empty().append(elem); +// paint_rect.attr('fill', 'url(#gradbox_' + type + ')'); +// } +// } } $('#stroke_width').val(selectedElement.getAttribute("stroke-width")||1).change(); @@ -1371,7 +1354,6 @@ if ($('#linecap_' + attr).length != 0) setStrokeOpt($('#linecap_' + attr)[0]); - } // All elements including image and group have opacity @@ -1832,26 +1814,23 @@ $('.palette_item').mousedown(function(evt){ var right_click = evt.button === 2; - var picker = ((evt.shiftKey || right_click) ? "stroke" : "fill"); - var id = ((evt.shiftKey || right_click) ? '#stroke_' : '#fill_'); + var isStroke = evt.shiftKey || right_click; + var picker = isStroke ? "stroke" : "fill"; var color = $(this).attr('data-rgb'); - var rectbox = document.getElementById("gradbox_"+picker).parentNode.firstChild; var paint = null; // Webkit-based browsers returned 'initial' here for no stroke - if (color == 'transparent' || color == 'initial') { + if (color === 'transparent' || color === 'initial') { color = 'none'; - $(id + "opacity").html("N/A"); paint = new $.jGraduate.Paint(); } else { paint = new $.jGraduate.Paint({alpha: 100, solidColor: color.substr(1)}); } - rectbox.setAttribute("fill", color); - rectbox.setAttribute("opacity", 1); - if (evt.shiftKey) { - strokePaint = paint; + paintBox[picker].setPaint(paint); + + if (isStroke) { if (svgCanvas.getColor('stroke') != color) { svgCanvas.setColor('stroke', color); } @@ -1859,7 +1838,6 @@ svgCanvas.setPaintOpacity('stroke', 1.0); } } else { - fillPaint = paint; if (svgCanvas.getColor('fill') != color) { svgCanvas.setColor('fill', color); } @@ -3171,7 +3149,7 @@ var colorPicker = function(elem) { var picker = elem.attr('id') == 'stroke_color' ? 'stroke' : 'fill'; // var opacity = (picker == 'stroke' ? $('#stroke_opacity') : $('#fill_opacity')); - var paint = (picker == 'stroke' ? strokePaint : fillPaint); + var paint = paintBox[picker].paint; var title = (picker == 'stroke' ? 'Pick a Stroke Paint and Opacity' : 'Pick a Fill Paint and Opacity'); var was_none = false; var pos = elem.position(); @@ -3187,31 +3165,9 @@ function(p) { paint = new $.jGraduate.Paint(p); - var oldgrad = document.getElementById("gradbox_"+picker); - var svgbox = oldgrad.ownerSVGElement; - var rectbox = svgbox.getElementsByTagName('rect')[0]; - var defs = svgbox.getElementsByTagName('defs')[0]; - if (paint.type === "linearGradient" || paint.type === "radialGradient") { - oldgrad.parentNode.removeChild(oldgrad); - var newgrad = defs.appendChild(document.importNode(paint[paint.type], true)); - newgrad.id = "gradbox_"+picker; - rectbox.setAttribute("fill", "url(#gradbox_" + picker + ")"); - rectbox.setAttribute("opacity", paint.alpha/100); - } - else { - rectbox.setAttribute("fill", paint.solidColor != "none" ? "#" + paint.solidColor : "none"); - rectbox.setAttribute("opacity", paint.alpha/100); - } - - if (picker == 'stroke') { - svgCanvas.setPaint('stroke', paint); - strokePaint = paint; - } - else { - svgCanvas.setPaint('fill', paint); - fillPaint = paint; - } - updateToolbar(); + paintBox[picker].setPaint(paint); + svgCanvas.setPaint(picker, paint); + $('#color_picker').hide(); }, function(p) { @@ -3276,39 +3232,80 @@ operaRepaint(); }; - // set up gradients to be used for the buttons - var svgdocbox = new DOMParser().parseFromString( - '\ - \ - \ - \ - ', 'text/xml'); - var docElem = svgdocbox.documentElement; - var boxgrad = svgdocbox.getElementById('gradbox_'); - boxgrad.id = 'gradbox_fill'; - docElem.setAttribute('width',16.5); - $('#fill_color').append( document.importNode(docElem,true) ); - - boxgrad.id = 'gradbox_stroke'; - docElem.setAttribute('width',16.5); - $('#stroke_color').append( document.importNode(docElem,true) ); - $('#stroke_color rect').attr({ - 'fill': '#' + curConfig.initStroke.color, - 'opacity': curConfig.initStroke.opacity - }); + var PaintBox = function(container, type) { + var cur = curConfig[type === 'fill' ? 'initFill' : 'initStroke']; + + // set up gradients to be used for the buttons + var svgdocbox = new DOMParser().parseFromString( + '\ + ', 'text/xml'); + var docElem = svgdocbox.documentElement; + + docElem = $(container)[0].appendChild(document.importNode(docElem, true)); + + docElem.setAttribute('width',16.5); + + this.rect = docElem.firstChild; + this.defs = docElem.getElementsByTagName('defs')[0]; + this.grad = this.defs.firstChild; + this.paint = new $.jGraduate.Paint({solidColor: cur.color}); + this.type = type; + + this.setPaint = function(paint, apply) { + this.paint = paint; + + var fillAttr = "none"; + var ptype = paint.type; + var opac = paint.alpha / 100; + + switch ( ptype ) { + case 'solidColor': + fillAttr = "#" + paint[ptype]; + break; + case 'linearGradient': + case 'radialGradient': + this.defs.removeChild(this.grad); + this.grad = this.defs.appendChild(paint[ptype]); + var id = this.grad.id = 'gradbox_' + this.type; + fillAttr = "url(#" + id + ')'; + } + + this.rect.setAttribute('fill', fillAttr); + this.rect.setAttribute('opacity', opac); + + if(apply) { + svgCanvas.setColor(this.type, paintColor, true); + svgCanvas.setPaintOpacity(this.type, paintOpacity, true); + } + } + + this.prep = function() { + var ptype = this.paint.type; + + switch ( ptype ) { + case 'linearGradient': + case 'radialGradient': + var paint = new $.jGraduate.Paint({copy: this.paint}); + svgCanvas.setPaint(type, paint); + } + } + }; + paintBox.fill = new PaintBox('#fill_color', 'fill'); + paintBox.stroke = new PaintBox('#stroke_color', 'stroke'); + $('#stroke_width').val(curConfig.initStroke.width); $('#group_opacity').val(curConfig.initOpacity * 100); // Use this SVG elem to test vectorEffect support - var test_el = docElem.firstChild; + var test_el = paintBox.fill.rect.cloneNode(false); test_el.setAttribute('style','vector-effect:non-scaling-stroke'); var supportsNonSS = (test_el.style.vectorEffect === 'non-scaling-stroke'); test_el.removeAttribute('style'); - + var svgdocbox = paintBox.fill.rect.ownerDocument; // Use this to test support for blur element. Seems to work to test support in Webkit var blur_test = svgdocbox.createElementNS('http://www.w3.org/2000/svg', 'feGaussianBlur'); if(typeof blur_test.stdDeviationX === "undefined") {