Finished up changes to inline image behaviour, many fixes from last update

git-svn-id: http://svg-edit.googlecode.com/svn/trunk@953 eee81c28-f429-11dd-99c0-75d572ba1ddd
master
Alexis Deveria 2009-11-18 16:50:25 +00:00
parent 3380cc0326
commit 5f4caf6c53
5 changed files with 87 additions and 56 deletions

View File

@ -669,6 +669,20 @@
</svg>
</g>
<g id="warning">
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<defs>
<linearGradient y2="0.98047" x2="0.57813" y1="0.44922" x1="0.56641" id="svg_110">
<stop stop-opacity="1" stop-color="#ffff00" offset="0"/>
<stop stop-opacity="1" stop-color="#9e9e00" offset="1"/>
</linearGradient>
</defs>
<path d="m1.42857,21.55559l10.71429,-19.36489l10.71429,19.20352l-21.42857,0.16137z" id="svg_44" fill="url(#svg_110)" stroke="#916d1f" stroke-width="2"/>
<path stroke-width="0" stroke="#916d1f" fill="#000000" id="svg_103" d="m11.98371,14.68571c-0.57143,-3.82857 -1.82857,-6.4 0.11429,-6.4c2.11429,0 0.74286,2.57143 0.11429,6.4l-0.22857,0z"/>
<circle stroke-width="0" stroke="#916d1f" fill="#000000" id="svg_104" r="1.17578" cy="17.37143" cx="12.14308"/>
</svg>
</g>
<g id="svg_eof"/>
</svg>

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -470,6 +470,10 @@ span.zoom_tool {
font-style: italic;
}
#url_notice {
padding-top: 4px;
display: none;
}
#svg_editor #color_picker {
position: absolute;

View File

@ -183,7 +183,7 @@ script type="text/javascript" src="locale/locale.min.js"></script-->
<label class="image_tool">url:</label>
<input id="image_url" class="image_tool" type="text" title="Change URL" size="35"/>
<button id="change_image_url" style="display:none;">Change URL</button>
<div id="url_notice" title="NOTE: This image cannot be embedded. It will depend on this path to be displayed" style="display:none;">(!)</div>
<div id="url_notice" title="NOTE: This image cannot be embedded. It will depend on this path to be displayed"></div>
</div>
<div id="circle_panel">

View File

@ -20,7 +20,8 @@ function svg_edit_setup() {
'QwantToClear':'Do you want to clear the drawing?\nThis will also erase your undo history!',
'QerrorsRevertToSource':'There were parsing errors in your SVG source.\nRevert back to original SVG source?',
'QignoreSourceChanges':'Ignore changes made to SVG source?',
'featNotSupported':'Feature not supported'
'featNotSupported':'Feature not supported',
'enterNewImgURL':'Enter the new image URL'
};
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"]
@ -28,10 +29,11 @@ function svg_edit_setup() {
var isMac = false; //(navigator.platform.indexOf("Mac") != -1);
var modKey = ""; //(isMac ? "meta+" : "ctrl+");
var svgCanvas = new SvgCanvas(document.getElementById("svgcanvas"));
var default_img_url = "images/logo.png";
// Store and retrieve preferences
$.pref = function(key, val) {
curPrefs[key] = val;
if(val) curPrefs[key] = val;
key = 'svg-edit-'+key;
var host = location.hostname;
var onweb = host && host.indexOf('.') != -1;
@ -282,13 +284,13 @@ function svg_edit_setup() {
var updateContextPanel = function() {
var elem = selectedElement;
var currentLayer = svgCanvas.getCurrentLayer();
// No need to update anything else in rotate mode
if (svgCanvas.getMode() == 'rotate' && elem != null) {
$('#angle').val(svgCanvas.getRotationAngle(elem));
return;
} else if(svgCanvas.addedNew && elem.nodeName == 'image') {
promptImgURL();
}
var is_node = elem ? (elem.id && elem.id.indexOf('pathpointgrip') == 0) : false;
$('#selected_panel, #multiselected_panel, #g_panel, #rect_panel, #circle_panel,\
@ -429,6 +431,11 @@ function svg_edit_setup() {
if($.pref('bg_color')) {
setBackground($.pref('bg_color'), $.pref('bg_url'));
}
if($.pref('img_save')) {
curPrefs.img_save = $.pref('img_save');
$('#image_save_opts input').val([curPrefs.img_save]);
}
var pos = $('#tools_rect_show').position();
$('#tools_rect').css({'left': pos.left+4, 'top': pos.top+77});
@ -509,8 +516,7 @@ function svg_edit_setup() {
svgCanvas.setTextContent(this.value);
});
// TODO: consider only setting the URL once Enter has been pressed?
$('#image_url').keyup(function(){
$('#image_url').change(function(){
setImageURL(this.value);
});
@ -1019,6 +1025,7 @@ function svg_edit_setup() {
// set image save option
curPrefs.img_save = $('#image_save_opts :checked').val();
$.pref('img_save',curPrefs.img_save);
// set background
var color = $('#bg_blocks div.cur_background').css('background') || '#FFF';
@ -1061,7 +1068,7 @@ function svg_edit_setup() {
var size_num = icon_sizes[size];
// Change icon size
$('.tool_button, .push_button, .tool_button_current, .tool_button_disabled, .tool_flyout_button')
$('.tool_button, .push_button, .tool_button_current, .tool_button_disabled, .tool_flyout_button, #url_notice')
.find('> svg').each(function() {
this.setAttribute('width',size_num);
this.setAttribute('height',size_num);
@ -1276,10 +1283,17 @@ function svg_edit_setup() {
$('#tools_ellipse_show').click(clickCircle);
$('#tool_bold').mousedown(clickBold);
$('#tool_italic').mousedown(clickItalic);
$('#change_image_url').click(function() {
var url = prompt("Select the new image URL","http://");
if(url) setImageURL(url);
$('#url_notice').click(function() {
alert(this.title);
});
$('#change_image_url').click(promptImgURL);
function promptImgURL() {
var url = prompt(uiStrings.enterNewImgURL, default_img_url);
if(url) setImageURL(url);
}
function setImageURL(url) {
svgCanvas.setImageURL(url);
@ -1292,14 +1306,15 @@ function svg_edit_setup() {
} else {
// regular URL
var img = svgCanvas.embedImage(url);
if(img == url && curPrefs.img_save == 'embed') {
// Couldn't embed, so show warning
$('#url_notice').show();
} else {
$('#url_notice').hide();
}
svgCanvas.embedImage(url, function(datauri) {
if(!datauri) {
// Couldn't embed, so show warning
$('#url_notice').show();
} else {
$('#url_notice').hide();
}
default_img_url = url;
});
$('#image_url').show();
$('#change_image_url').hide();
}
@ -1423,8 +1438,8 @@ function svg_edit_setup() {
$(document).bind('keydown', {combi:item[0], disableInInput: disable}, item[1]);
});
$('.attr_changer').bind('keydown', {combi:'return', disableInInput: false},
function(evt) {$(this).change();evt.preventDefault();}
$('.attr_changer, #image_url').bind('keydown', {combi:'return', disableInInput: false},
function(evt) {console.log('now');$(this).change();evt.preventDefault();}
);
}
@ -1548,12 +1563,15 @@ function svg_edit_setup() {
// Test for embedImage support (use timeout to not interfere with page load)
setTimeout(function() {
var img = svgCanvas.embedImage('images/logo.png');
if(img.indexOf('data:') !== 0) {
// Disable option
$('#image_save_opts [value=embed]').attr('disabled','disabled');
$('#image_opt_embed').css('color','#666').attr('title',uiStrings.featNotSupported);
}
svgCanvas.embedImage('images/logo.png', function(datauri) {
if(!datauri) {
// Disable option
$('#image_save_opts [value=embed]').attr('disabled','disabled');
$('#image_save_opts input').val(['ref']);
curPrefs.img_save = 'ref';
$('#image_opt_embed').css('color','#666').attr('title',uiStrings.featNotSupported);
}
});
},1000);
$('#fill_color').click(function(){
@ -2082,6 +2100,8 @@ function setSVGIcons() {
'#tool_alignmiddle':'align_middle',
'#tool_alignbottom':'align_bottom',
'#url_notice':'warning',
'#layer_up':'go_up',
'#layer_down':'go_down',
'#layerlist td.layervis':'eye',

View File

@ -826,6 +826,8 @@ function BatchCommand(text) {
// z-ordered array of tuples containing layer names and <g> elements
// the first layer is the one at the bottom of the rendering
var all_layers = [];
var encodableImages = {};
var last_good_img_url = 'images/logo.png';
// pointer to the current layer <g>
var current_layer = null;
var save_options = {round_digits: 5};
@ -1114,7 +1116,8 @@ function BatchCommand(text) {
&& attr.localName == 'href'
&& save_options.images
&& save_options.images == 'embed') {
attrVal = canvas.embedImage(attrVal);
var img = encodableImages[attrVal];
if(img) attrVal = img;
}
// map various namespaces to our fixed namespace prefixes
// TODO: put this into a map and do a look-up instead of if-else
@ -1173,13 +1176,7 @@ function BatchCommand(text) {
return out.join('');
}; // end svgToString()
this.embedImage = function(val, img, attempts) {
var result;
if(!attempts) attempts = 0;
// Prevent endless loop if image cannot be loaded
if(attempts > 100) return val;
attempts++;
this.embedImage = function(val, callback) {
// Below is some code to fetch the data: URL representation
// of local image files. It is commented out until we figure out
@ -1187,29 +1184,24 @@ function BatchCommand(text) {
// does not work in Firefox at all :(
// load in the image and once it's loaded, get the dimensions
if(!img) {
img = document.createElement("img");
img.setAttribute("src", val);
}
if (img.width > 0 && img.height > 0) {
$(new Image()).load(function() {
// create a canvas the same size as the raster image
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
canvas.width = this.width;
canvas.height = this.height;
// load the raster image into the canvas
canvas.getContext("2d").drawImage(img,0,0);
canvas.getContext("2d").drawImage(this,0,0);
// retrieve the data: URL
try {
var urldata = ';svgedit_url=' + encodeURIComponent(val);
result = canvas.toDataURL().replace(';base64',urldata+';base64');
urldata = canvas.toDataURL().replace(';base64',urldata+';base64');
encodableImages[val] = urldata;
} catch(e) {
result = val;
encodableImages[val] = false;
}
}
if(result) return result;
return canvas.embedImage(val, img, attempts);
last_good_img_url = val;
if(callback) callback(encodableImages[val]);
}).attr('src',val);
}
// importNode, like cloneNode, causes the comma-to-period
@ -1220,9 +1212,9 @@ function BatchCommand(text) {
$.each(x_attrs, function(i, attr) {
if(attr.nodeValue.indexOf(',') == -1) return;
// attr val has comma, so let's get the good value
var ns = attr.nodeName == 'href' ? xlinkns :
var ns = attr.prefix == 'xlink' ? xlinkns :
attr.prefix == "xml" ? xmlns : null;
var good_attrval = orig_el.getAttribute(attr.nodeName);
var good_attrval = orig_el.getAttribute(attr.localName);
if(ns) {
elem.setAttributeNS(ns, attr.nodeName, good_attrval);
} else {
@ -2322,7 +2314,7 @@ function BatchCommand(text) {
"style": "pointer-events:inherit"
}
});
newImage.setAttributeNS(xlinkns, "href", "images/logo.png");
newImage.setAttributeNS(xlinkns, "href", last_good_img_url);
break;
case "square":
// FIXME: once we create the rect, we lose information that this was a square
@ -3848,7 +3840,6 @@ function BatchCommand(text) {
canvas.setMode("select");
}
} else if (element != null) {
canvas.addedNew = true;
element.setAttribute("opacity", cur_shape.opacity);
@ -3859,8 +3850,8 @@ function BatchCommand(text) {
current_mode = "pathedit";
recalcPathPoints();
addAllPointGripsToPath(current_path_pts.length/2 - 1);
} else if (current_mode == "text") {
// keep us in the tool we were in unless it was a text element
} else if (current_mode == "text" || current_mode == "image") {
// keep us in the tool we were in unless it was a text or image element
canvas.addToSelection([element], true);
}
// we create the insert command that is stored on the stack
@ -3963,6 +3954,8 @@ function BatchCommand(text) {
}).attr('src',url);
}
}
// Add to encodableImages if it loads
canvas.embedImage(val);
});
// Fix XML for Opera/Win/Non-EN