Initial support for <use> element (can only see, select, move, resize or rotate them). Also collapse a few var declarations and remove obsolete code

git-svn-id: http://svg-edit.googlecode.com/svn/trunk@1254 eee81c28-f429-11dd-99c0-75d572ba1ddd
master
Jeff Schiller 2010-01-20 22:15:54 +00:00
parent 36caeb552a
commit c04d148dcb
2 changed files with 42 additions and 35 deletions

View File

@ -31,26 +31,26 @@ function svg_edit_setup() {
'key_down':'Down', 'key_down':'Down',
'key_backspace':'Backspace', 'key_backspace':'Backspace',
'key_del':'Del' 'key_del':'Del'
}; },
var palette = ["#000000","#202020","#404040","#606060","#808080","#a0a0a0","#c0c0c0","#e0e0e0","#ffffff","#800000","#ff0000","#808000","#ffff00","#008000","#00ff00","#008080","#00ffff","#000080","#0000ff","#800080","#ff00ff","#2b0000","#550000","#800000","#aa0000","#d40000","#ff0000","#ff2a2a","#ff5555","#ff8080","#ffaaaa","#ffd5d5","#280b0b","#501616","#782121","#a02c2c","#c83737","#d35f5f","#de8787","#e9afaf","#f4d7d7","#241c1c","#483737","#6c5353","#916f6f","#ac9393","#c8b7b7","#e3dbdb","#2b1100","#552200","#803300","#aa4400","#d45500","#ff6600","#ff7f2a","#ff9955","#ffb380","#ffccaa","#ffe6d5","#28170b","#502d16","#784421","#a05a2c","#c87137","#d38d5f","#deaa87","#e9c6af","#f4e3d7","#241f1c","#483e37","#6c5d53","#917c6f","#ac9d93","#c8beb7","#e3dedb","#2b2200","#554400","#806600","#aa8800","#d4aa00","#ffcc00","#ffd42a","#ffdd55","#ffe680","#ffeeaa","#fff6d5","#28220b","#504416","#786721","#a0892c","#c8ab37","#d3bc5f","#decd87","#e9ddaf","#f4eed7","#24221c","#484537","#6c6753","#918a6f","#aca793","#c8c4b7","#e3e2db","#222b00","#445500","#668000","#88aa00","#aad400","#ccff00","#d4ff2a","#ddff55","#e5ff80","#eeffaa","#f6ffd5","#22280b","#445016","#677821","#89a02c","#abc837","#bcd35f","#cdde87","#dde9af","#eef4d7","#22241c","#454837","#676c53","#8a916f","#a7ac93","#c4c8b7","#e2e3db","#112b00","#225500","#338000","#44aa00","#55d400","#66ff00","#7fff2a","#99ff55","#b3ff80","#ccffaa","#e5ffd5","#17280b","#2d5016","#447821","#5aa02c","#71c837","#8dd35f","#aade87","#c6e9af","#e3f4d7","#1f241c","#3e4837","#5d6c53","#7c916f","#9dac93","#bec8b7","#dee3db","#002b00","#005500","#008000","#00aa00","#00d400","#00ff00","#2aff2a","#55ff55","#80ff80","#aaffaa","#d5ffd5","#0b280b","#165016","#217821","#2ca02c","#37c837","#5fd35f","#87de87","#afe9af","#d7f4d7","#1c241c","#374837","#536c53","#6f916f","#93ac93","#b7c8b7","#dbe3db","#002b11","#005522","#008033","#00aa44","#00d455","#00ff66","#2aff80","#55ff99","#80ffb3","#aaffcc","#d5ffe6","#0b2817","#16502d","#217844","#2ca05a","#37c871","#5fd38d","#87deaa","#afe9c6","#d7f4e3","#1c241f","#37483e","#536c5d","#6f917c","#93ac9d","#b7c8be","#dbe3de","#002b22","#005544","#008066","#00aa88","#00d4aa","#00ffcc","#2affd5","#55ffdd","#80ffe6","#aaffee","#d5fff6","#0b2822","#165044","#217867","#2ca089","#37c8ab","#5fd3bc","#87decd","#afe9dd","#d7f4ee","#1c2422","#374845","#536c67","#6f918a","#93aca7","#b7c8c4","#dbe3e2","#00222b","#004455","#006680","#0088aa","#00aad4","#00ccff","#2ad4ff","#55ddff","#80e5ff","#aaeeff","#d5f6ff","#0b2228","#164450","#216778","#2c89a0","#37abc8","#5fbcd3","#87cdde","#afdde9","#d7eef4","#1c2224","#374548","#53676c","#6f8a91","#93a7ac","#b7c4c8","#dbe2e3","#00112b","#002255","#003380","#0044aa","#0055d4","#0066ff","#2a7fff","#5599ff","#80b3ff","#aaccff","#d5e5ff","#0b1728","#162d50","#214478","#2c5aa0","#3771c8","#5f8dd3","#87aade","#afc6e9","#d7e3f4","#1c1f24","#373e48","#535d6c","#6f7c91","#939dac","#b7bec8","#dbdee3","#00002b","#000055","#000080","#0000aa","#0000d4","#0000ff","#2a2aff","#5555ff","#8080ff","#aaaaff","#d5d5ff","#0b0b28","#161650","#212178","#2c2ca0","#3737c8","#5f5fd3","#8787de","#afafe9","#d7d7f4","#1c1c24","#373748","#53536c","#6f6f91","#9393ac","#b7b7c8","#dbdbe3","#11002b","#220055","#330080","#4400aa","#5500d4","#6600ff","#7f2aff","#9955ff","#b380ff","#ccaaff","#e5d5ff","#170b28","#2d1650","#442178","#5a2ca0","#7137c8","#8d5fd3","#aa87de","#c6afe9","#e3d7f4","#1f1c24","#3e3748","#5d536c","#7c6f91","#9d93ac","#beb7c8","#dedbe3","#22002b","#440055","#660080","#8800aa","#aa00d4","#cc00ff","#d42aff","#dd55ff","#e580ff","#eeaaff","#f6d5ff","#220b28","#441650","#672178","#892ca0","#ab37c8","#bc5fd3","#cd87de","#ddafe9","#eed7f4","#221c24","#453748","#67536c","#8a6f91","#a793ac","#c4b7c8","#e2dbe3","#2b0022","#550044","#800066","#aa0088","#d400aa","#ff00cc","#ff2ad4","#ff55dd","#ff80e5","#ffaaee","#ffd5f6","#280b22","#501644","#782167","#a02c89","#c837ab","#d35fbc","#de87cd","#e9afdd","#f4d7ee","#241c22","#483745","#6c5367","#916f8a","#ac93a7","#c8b7c4","#e3dbe2","#2b0011","#550022","#800033","#aa0044","#d40055","#ff0066","#ff2a7f","#ff5599","#ff80b2","#ffaacc","#ffd5e5","#280b17","#50162d","#782144","#a02c5a","#c83771","#d35f8d","#de87aa","#e9afc6","#f4d7e3","#241c1f","#48373e","#6c535d","#916f7c","#ac939d","#c8b7be","#e3dbde"] palette = ["#000000","#202020","#404040","#606060","#808080","#a0a0a0","#c0c0c0","#e0e0e0","#ffffff","#800000","#ff0000","#808000","#ffff00","#008000","#00ff00","#008080","#00ffff","#000080","#0000ff","#800080","#ff00ff","#2b0000","#550000","#800000","#aa0000","#d40000","#ff0000","#ff2a2a","#ff5555","#ff8080","#ffaaaa","#ffd5d5","#280b0b","#501616","#782121","#a02c2c","#c83737","#d35f5f","#de8787","#e9afaf","#f4d7d7","#241c1c","#483737","#6c5353","#916f6f","#ac9393","#c8b7b7","#e3dbdb","#2b1100","#552200","#803300","#aa4400","#d45500","#ff6600","#ff7f2a","#ff9955","#ffb380","#ffccaa","#ffe6d5","#28170b","#502d16","#784421","#a05a2c","#c87137","#d38d5f","#deaa87","#e9c6af","#f4e3d7","#241f1c","#483e37","#6c5d53","#917c6f","#ac9d93","#c8beb7","#e3dedb","#2b2200","#554400","#806600","#aa8800","#d4aa00","#ffcc00","#ffd42a","#ffdd55","#ffe680","#ffeeaa","#fff6d5","#28220b","#504416","#786721","#a0892c","#c8ab37","#d3bc5f","#decd87","#e9ddaf","#f4eed7","#24221c","#484537","#6c6753","#918a6f","#aca793","#c8c4b7","#e3e2db","#222b00","#445500","#668000","#88aa00","#aad400","#ccff00","#d4ff2a","#ddff55","#e5ff80","#eeffaa","#f6ffd5","#22280b","#445016","#677821","#89a02c","#abc837","#bcd35f","#cdde87","#dde9af","#eef4d7","#22241c","#454837","#676c53","#8a916f","#a7ac93","#c4c8b7","#e2e3db","#112b00","#225500","#338000","#44aa00","#55d400","#66ff00","#7fff2a","#99ff55","#b3ff80","#ccffaa","#e5ffd5","#17280b","#2d5016","#447821","#5aa02c","#71c837","#8dd35f","#aade87","#c6e9af","#e3f4d7","#1f241c","#3e4837","#5d6c53","#7c916f","#9dac93","#bec8b7","#dee3db","#002b00","#005500","#008000","#00aa00","#00d400","#00ff00","#2aff2a","#55ff55","#80ff80","#aaffaa","#d5ffd5","#0b280b","#165016","#217821","#2ca02c","#37c837","#5fd35f","#87de87","#afe9af","#d7f4d7","#1c241c","#374837","#536c53","#6f916f","#93ac93","#b7c8b7","#dbe3db","#002b11","#005522","#008033","#00aa44","#00d455","#00ff66","#2aff80","#55ff99","#80ffb3","#aaffcc","#d5ffe6","#0b2817","#16502d","#217844","#2ca05a","#37c871","#5fd38d","#87deaa","#afe9c6","#d7f4e3","#1c241f","#37483e","#536c5d","#6f917c","#93ac9d","#b7c8be","#dbe3de","#002b22","#005544","#008066","#00aa88","#00d4aa","#00ffcc","#2affd5","#55ffdd","#80ffe6","#aaffee","#d5fff6","#0b2822","#165044","#217867","#2ca089","#37c8ab","#5fd3bc","#87decd","#afe9dd","#d7f4ee","#1c2422","#374845","#536c67","#6f918a","#93aca7","#b7c8c4","#dbe3e2","#00222b","#004455","#006680","#0088aa","#00aad4","#00ccff","#2ad4ff","#55ddff","#80e5ff","#aaeeff","#d5f6ff","#0b2228","#164450","#216778","#2c89a0","#37abc8","#5fbcd3","#87cdde","#afdde9","#d7eef4","#1c2224","#374548","#53676c","#6f8a91","#93a7ac","#b7c4c8","#dbe2e3","#00112b","#002255","#003380","#0044aa","#0055d4","#0066ff","#2a7fff","#5599ff","#80b3ff","#aaccff","#d5e5ff","#0b1728","#162d50","#214478","#2c5aa0","#3771c8","#5f8dd3","#87aade","#afc6e9","#d7e3f4","#1c1f24","#373e48","#535d6c","#6f7c91","#939dac","#b7bec8","#dbdee3","#00002b","#000055","#000080","#0000aa","#0000d4","#0000ff","#2a2aff","#5555ff","#8080ff","#aaaaff","#d5d5ff","#0b0b28","#161650","#212178","#2c2ca0","#3737c8","#5f5fd3","#8787de","#afafe9","#d7d7f4","#1c1c24","#373748","#53536c","#6f6f91","#9393ac","#b7b7c8","#dbdbe3","#11002b","#220055","#330080","#4400aa","#5500d4","#6600ff","#7f2aff","#9955ff","#b380ff","#ccaaff","#e5d5ff","#170b28","#2d1650","#442178","#5a2ca0","#7137c8","#8d5fd3","#aa87de","#c6afe9","#e3d7f4","#1f1c24","#3e3748","#5d536c","#7c6f91","#9d93ac","#beb7c8","#dedbe3","#22002b","#440055","#660080","#8800aa","#aa00d4","#cc00ff","#d42aff","#dd55ff","#e580ff","#eeaaff","#f6d5ff","#220b28","#441650","#672178","#892ca0","#ab37c8","#bc5fd3","#cd87de","#ddafe9","#eed7f4","#221c24","#453748","#67536c","#8a6f91","#a793ac","#c4b7c8","#e2dbe3","#2b0022","#550044","#800066","#aa0088","#d400aa","#ff00cc","#ff2ad4","#ff55dd","#ff80e5","#ffaaee","#ffd5f6","#280b22","#501644","#782167","#a02c89","#c837ab","#d35fbc","#de87cd","#e9afdd","#f4d7ee","#241c22","#483745","#6c5367","#916f8a","#ac93a7","#c8b7c4","#e3dbe2","#2b0011","#550022","#800033","#aa0044","#d40055","#ff0066","#ff2a7f","#ff5599","#ff80b2","#ffaacc","#ffd5e5","#280b17","#50162d","#782144","#a02c5a","#c83771","#d35f8d","#de87aa","#e9afc6","#f4d7e3","#241c1f","#48373e","#6c535d","#916f7c","#ac939d","#c8b7be","#e3dbde"],
var isMac = false; //(navigator.platform.indexOf("Mac") != -1); isMac = false, //(navigator.platform.indexOf("Mac") != -1);
var modKey = ""; //(isMac ? "meta+" : "ctrl+"); modKey = "", //(isMac ? "meta+" : "ctrl+");
var svgCanvas = new SvgCanvas(document.getElementById("svgcanvas")); svgCanvas = new SvgCanvas(document.getElementById("svgcanvas")),
var path = svgCanvas.pathActions; path = svgCanvas.pathActions,
var default_img_url = "images/logo.png"; default_img_url = "images/logo.png",
var workarea = $("#workarea"); workarea = $("#workarea");
// Store and retrieve preferences // Store and retrieve preferences
$.pref = function(key, val) { $.pref = function(key, val) {
if(val) curPrefs[key] = val; if(val) curPrefs[key] = val;
key = 'svg-edit-'+key; key = 'svg-edit-'+key;
var host = location.hostname; var host = location.hostname,
var onweb = host && host.indexOf('.') != -1; onweb = host && host.indexOf('.') != -1,
var store = (val != undefined); store = (val != undefined),
var storage = false; storage = false;
// Some FF versions throw security errors here // Some FF versions throw security errors here
try { try {
if(window.localStorage && onweb) { if(window.localStorage && onweb) {
@ -210,10 +210,6 @@ function svg_edit_setup() {
// if the element changed was the svg, then it could be a resolution change // if the element changed was the svg, then it could be a resolution change
if (elem && elem.tagName == "svg") { if (elem && elem.tagName == "svg") {
// var vb = elem.getAttribute("viewBox").split(' ');
// changeResolution(parseInt(vb[2]),
// parseInt(vb[3]));
populateLayers(); populateLayers();
updateCanvas(); updateCanvas();
} }
@ -234,14 +230,6 @@ function svg_edit_setup() {
updateContextPanel(); updateContextPanel();
}; };
// var updateBgImage = function() {
// var bg_img = $('#background_img');
// if(!bg_img.length) return;
// var img = bg_img.find('img');
// var zoomlevel = svgCanvas.getZoom();
// img.width(zoomlevel*100 + '%');
// }
var zoomChanged = function(window, bbox, autoCenter) { var zoomChanged = function(window, bbox, autoCenter) {
var scrbar = 15; var scrbar = 15;
var res = svgCanvas.getResolution(); var res = svgCanvas.getResolution();
@ -407,7 +395,7 @@ function svg_edit_setup() {
} }
// Elements in this array cannot be converted to a path // Elements in this array cannot be converted to a path
var no_path = $.inArray(elname, ['image', 'text', 'path', 'g']) == -1; var no_path = $.inArray(elname, ['image', 'text', 'path', 'g', 'use']) == -1;
$('#tool_topath').toggle(no_path); $('#tool_topath').toggle(no_path);
$('#tool_reorient').toggle(elname == 'path'); $('#tool_reorient').toggle(elname == 'path');
$('#tool_reorient').toggleClass('tool_button_disabled', angle == 0); $('#tool_reorient').toggleClass('tool_button_disabled', angle == 0);

View File

@ -22,10 +22,9 @@ if(window.opera) {
function SvgCanvas(container) function SvgCanvas(container)
{ {
var isOpera = !!window.opera; var isOpera = !!window.opera,
var isWebkit = navigator.userAgent.indexOf("AppleWebKit") != -1; isWebkit = navigator.userAgent.indexOf("AppleWebKit") != -1,
support = {},
var support = {};
// this defines which elements and attributes that we support // this defines which elements and attributes that we support
// TODO: add <a> elements to this // TODO: add <a> elements to this
@ -34,8 +33,7 @@ var support = {};
// TODO: add <pattern> to this // TODO: add <pattern> to this
// TODO: add <symbol> to this // TODO: add <symbol> to this
// TODO: add <tspan> to this // TODO: add <tspan> to this
// TODO: add <use> to this svgWhiteList = {
var svgWhiteList = {
"circle": ["cx", "cy", "fill", "fill-opacity", "fill-rule", "id", "opacity", "r", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "systemLanguage", "transform"], "circle": ["cx", "cy", "fill", "fill-opacity", "fill-rule", "id", "opacity", "r", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "systemLanguage", "transform"],
"defs": [], "defs": [],
"desc": [], "desc": [],
@ -53,7 +51,8 @@ var svgWhiteList = {
"switch": ["id", "requiredFeatures", "systemLanguage"], "switch": ["id", "requiredFeatures", "systemLanguage"],
"svg": ["id", "height", "requiredFeatures", "systemLanguage", "transform", "viewBox", "width", "xmlns", "xmlns:xlink"], "svg": ["id", "height", "requiredFeatures", "systemLanguage", "transform", "viewBox", "width", "xmlns", "xmlns:xlink"],
"text": ["fill", "fill-opacity", "fill-rule", "font-family", "font-size", "font-style", "font-weight", "id", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "systemLanguage", "transform", "text-anchor", "x", "xml:space", "y"], "text": ["fill", "fill-opacity", "fill-rule", "font-family", "font-size", "font-style", "font-weight", "id", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "systemLanguage", "transform", "text-anchor", "x", "xml:space", "y"],
"title": [] "title": [],
"use": ["height", "width", "x", "xlink:href", "y"]
}; };
@ -1375,6 +1374,11 @@ function BatchCommand(text) {
changes["width"] = scalew(changes["width"]); changes["width"] = scalew(changes["width"]);
changes["height"] = scaleh(changes["height"]); changes["height"] = scaleh(changes["height"]);
break; break;
case "use":
var pt1 = remap(changes["x"],changes["y"]);
changes["x"] = pt1.x;
changes["y"] = pt1.y;
break;
case "text": case "text":
// if it was a translate, then just update x,y // if it was a translate, then just update x,y
if (m.a == 1 && m.b == 0 && m.c == 0 && m.d == 1 && if (m.a == 1 && m.b == 0 && m.c == 0 && m.d == 1 &&
@ -1478,6 +1482,11 @@ function BatchCommand(text) {
changes.height = Math.abs(changes.height); changes.height = Math.abs(changes.height);
assignAttributes(selected, changes, 1000); assignAttributes(selected, changes, 1000);
break; break;
case "use":
// changes.x = changes.x-0 + Math.min(0,changes.width);
// changes.y = changes.y-0 + Math.min(0,changes.height);
assignAttributes(selected, changes, 1000);
break;
case "ellipse": case "ellipse":
changes.rx = Math.abs(changes.rx); changes.rx = Math.abs(changes.rx);
changes.ry = Math.abs(changes.ry); changes.ry = Math.abs(changes.ry);
@ -1609,10 +1618,11 @@ function BatchCommand(text) {
break; break;
case "rect": case "rect":
case "image": case "image":
changes["x"] = selected.getAttribute("x");
changes["y"] = selected.getAttribute("y");
changes["width"] = selected.getAttribute("width"); changes["width"] = selected.getAttribute("width");
changes["height"] = selected.getAttribute("height"); changes["height"] = selected.getAttribute("height");
case "use":
changes["x"] = selected.getAttribute("x");
changes["y"] = selected.getAttribute("y");
break; break;
case "text": case "text":
changes["x"] = selected.getAttribute("x"); changes["x"] = selected.getAttribute("x");
@ -1911,7 +1921,8 @@ function BatchCommand(text) {
// if we had [M][T][S][T] we want to extract the matrix equivalent of // if we had [M][T][S][T] we want to extract the matrix equivalent of
// [T][S][T] and push it down to the element // [T][S][T] and push it down to the element
if (N >= 3 && tlist.getItem(N-2).type == 3 && if (N >= 3 && tlist.getItem(N-2).type == 3 &&
tlist.getItem(N-3).type == 2 && tlist.getItem(N-1).type == 2) tlist.getItem(N-3).type == 2 && tlist.getItem(N-1).type == 2 &&
selected.nodeName != "use")
{ {
operation = 3; // scale operation = 3; // scale
m = transformListToTransform(tlist,N-3,N-1).matrix; m = transformListToTransform(tlist,N-3,N-1).matrix;
@ -2346,6 +2357,10 @@ function BatchCommand(text) {
start_x = x; start_x = x;
start_y = y; start_y = y;
// if it was a <use>, Opera and WebKit return the SVGElementInstance
if (mouse_target.correspondingUseElement)
mouse_target = mouse_target.correspondingUseElement;
// go up until we hit a child of a layer // go up until we hit a child of a layer
while (mouse_target.parentNode.parentNode.tagName == "g") { while (mouse_target.parentNode.parentNode.tagName == "g") {
mouse_target = mouse_target.parentNode; mouse_target = mouse_target.parentNode;
@ -5925,6 +5940,10 @@ function BatchCommand(text) {
selected.parentNode.removeChild(newg); selected.parentNode.removeChild(newg);
} else if(elem.nodeName == 'path' && isWebkit) { } else if(elem.nodeName == 'path' && isWebkit) {
ret = getPathBBox(selected); ret = getPathBBox(selected);
} else if(elem.nodeName == 'use' && !isWebkit) {
ret = selected.getBBox();
ret.x += parseFloat(selected.getAttribute('x'));
ret.y += parseFloat(selected.getAttribute('y'));
} else { } else {
try { ret = selected.getBBox(); } try { ret = selected.getBBox(); }
catch(e) { ret = null; } catch(e) { ret = null; }