Added drop-down list for segment types, made some code more efficient, made polys go into polyedit mode after creation

git-svn-id: http://svg-edit.googlecode.com/svn/trunk@786 eee81c28-f429-11dd-99c0-75d572ba1ddd
master
Alexis Deveria 2009-10-09 15:29:40 +00:00
parent 48a2aa8dc7
commit efbf55f1a2
3 changed files with 150 additions and 99 deletions

View File

@ -250,6 +250,10 @@ script type="text/javascript" src="locale/locale.min.js"></script-->
<input id="poly_node_x" class="poly_node_tool attr_changer" title="Change node's x coordinate" size="3" data-attr="x"/> <input id="poly_node_x" class="poly_node_tool attr_changer" title="Change node's x coordinate" size="3" data-attr="x"/>
<label class="poly_node_tool">y:</label> <label class="poly_node_tool">y:</label>
<input id="poly_node_y" class="poly_node_tool attr_changer" title="Change node's y coordinate" size="3" data-attr="y"/> <input id="poly_node_y" class="poly_node_tool attr_changer" title="Change node's y coordinate" size="3" data-attr="y"/>
<select id="seg_type" class="poly_node_tool" title="Change Segment type">
<option selected="selected" value="5">Straight</option>
<option value="7">Curve</option>
</select>
<img class="tool_button" id="tool_node_clone" src="images/clone.png" title="Clone Node" alt="Clone"/> <img class="tool_button" id="tool_node_clone" src="images/clone.png" title="Clone Node" alt="Clone"/>
<img class="tool_button" id="tool_node_delete" src="images/delete.png" title="Delete Node" alt="Delete"/> <img class="tool_button" id="tool_node_delete" src="images/delete.png" title="Delete Node" alt="Delete"/>
</div> </div>

View File

@ -210,8 +210,9 @@ function svg_edit_setup() {
$('#poly_node_panel').show(); $('#poly_node_panel').show();
var point = svgCanvas.getNodePoint(); var point = svgCanvas.getNodePoint();
if(point) { if(point) {
$('#poly_node_x').val(point[0]); $('#poly_node_x').val(point.x);
$('#poly_node_y').val(point[1]); $('#poly_node_y').val(point.y);
$('#seg_type').val(point.type);
} }
return; return;
} }
@ -353,6 +354,10 @@ function svg_edit_setup() {
svgCanvas.setFontFamily(this.options[this.selectedIndex].value); svgCanvas.setFontFamily(this.options[this.selectedIndex].value);
}); });
$('#seg_type').change(function() {
svgCanvas.setSegType($(this).val());
});
$('#text').keyup(function(){ $('#text').keyup(function(){
svgCanvas.setTextContent(this.value); svgCanvas.setTextContent(this.value);
}); });
@ -633,15 +638,15 @@ function svg_edit_setup() {
} }
}; };
var cloneNode = function() { var clonePolyNode = function() {
if (svgCanvas.getNodePoint()) { if (svgCanvas.getNodePoint()) {
svgCanvas.cloneNode(); svgCanvas.clonePolyNode();
} }
}; };
var deleteNode = function() { var deletePolyNode = function() {
if (svgCanvas.getNodePoint()) { if (svgCanvas.getNodePoint()) {
svgCanvas.deleteNode(); svgCanvas.deletePolyNode();
} }
}; };
@ -858,8 +863,8 @@ function svg_edit_setup() {
$('#tool_docprops').click(showDocProperties); $('#tool_docprops').click(showDocProperties);
$('#tool_delete').click(deleteSelected); $('#tool_delete').click(deleteSelected);
$('#tool_delete_multi').click(deleteSelected); $('#tool_delete_multi').click(deleteSelected);
$('#tool_node_clone').click(cloneNode); $('#tool_node_clone').click(clonePolyNode);
$('#tool_node_delete').click(deleteNode); $('#tool_node_delete').click(deletePolyNode);
$('#tool_move_top').click(moveToTopSelected); $('#tool_move_top').click(moveToTopSelected);
$('#tool_move_bottom').click(moveToBottomSelected); $('#tool_move_bottom').click(moveToBottomSelected);
$('#tool_undo').click(clickUndo); $('#tool_undo').click(clickUndo);

View File

@ -1007,8 +1007,6 @@ function BatchCommand(text) {
// if there was a rotation transform, re-set it, otherwise empty out the transform attribute // if there was a rotation transform, re-set it, otherwise empty out the transform attribute
var angle = canvas.getRotationAngle(selected); var angle = canvas.getRotationAngle(selected);
var pointGripContainer = document.getElementById("polypointgrip_container");
var ctrlPointGripContainer = document.getElementById("ctrlpointgrip_container");
if (angle) { if (angle) {
// this is our old center upon which we have rotated the shape // this is our old center upon which we have rotated the shape
var tr_x = round(box.x + box.width/2), var tr_x = round(box.x + box.width/2),
@ -1068,26 +1066,14 @@ function BatchCommand(text) {
var changes = {}; var changes = {};
changes["transform"] = ["rotate(", angle, " ", tr_x, ",", tr_y, ")"].join(''); changes["transform"] = ["rotate(", angle, " ", tr_x, ",", tr_y, ")"].join('');
batchCmd.addSubCommand(new ChangeElementCommand(selected, changes)); batchCmd.addSubCommand(new ChangeElementCommand(selected, changes));
if(pointGripContainer) { setPointContainerTransform(rotate);
pointGripContainer.setAttribute("transform", rotate);
}
if(ctrlPointGripContainer) {
ctrlPointGripContainer.setAttribute("transform", rotate);
}
} }
else { else {
// This fixes Firefox 2- behavior - which does not reset values when the attribute has // This fixes Firefox 2- behavior - which does not reset values when the attribute has
// been removed, see https://bugzilla.mozilla.org/show_bug.cgi?id=320622 // been removed, see https://bugzilla.mozilla.org/show_bug.cgi?id=320622
selected.setAttribute("transform", ""); selected.setAttribute("transform", "");
selected.removeAttribute("transform"); selected.removeAttribute("transform");
if(pointGripContainer) { setPointContainerTransform("");
pointGripContainer.setAttribute("transform", "");
pointGripContainer.removeAttribute("transform");
}
if(ctrlPointGripContainer) {
ctrlPointGripContainer.setAttribute("transform", "");
ctrlPointGripContainer.removeAttribute("transform");
}
} }
// if it's a group, transfer the transform attribute to each child element // if it's a group, transfer the transform attribute to each child element
@ -2046,6 +2032,16 @@ function BatchCommand(text) {
svgroot.unsuspendRedraw(sr); svgroot.unsuspendRedraw(sr);
}; };
var setPointContainerTransform = function(value) {
var conts = $('#polypointgrip_container,#ctrlpointgrip_container');
$.each(conts,function() {
this.setAttribute("transform", value);
if(!value) {
this.removeAttribute("transform");
}
});
}
var recalcPolyPoints = function() { var recalcPolyPoints = function() {
current_poly_pts = []; current_poly_pts = [];
var segList = current_poly.pathSegList; var segList = current_poly.pathSegList;
@ -2093,7 +2089,7 @@ function BatchCommand(text) {
$('#ctrlpointgrip_container *').attr('display','none'); $('#ctrlpointgrip_container *').attr('display','none');
}; };
var addAllPointGripsToPoly = function() { var addAllPointGripsToPoly = function(pointToSelect) {
// loop through and show all pointgrips // loop through and show all pointgrips
var len = current_poly_pts.length; var len = current_poly_pts.length;
for (var i = 0; i < len; i += 2) { for (var i = 0; i < len; i += 2) {
@ -2122,8 +2118,6 @@ function BatchCommand(text) {
addControlPointGrip(cur_x + item.x2,cur_y + item.y2, next_x,next_y, index+'c2'); addControlPointGrip(cur_x + item.x2,cur_y + item.y2, next_x,next_y, index+'c2');
} }
} }
var pointGripContainer = document.getElementById("polypointgrip_container");
var ctrlPointGripContainer = document.getElementById("ctrlpointgrip_container");
// FIXME: we cannot just use the same transform as the poly because we might be // FIXME: we cannot just use the same transform as the poly because we might be
// at a different zoom level // at a different zoom level
var angle = canvas.getRotationAngle(current_poly); var angle = canvas.getRotationAngle(current_poly);
@ -2132,8 +2126,10 @@ function BatchCommand(text) {
var cx = (bbox.x + bbox.width/2) * current_zoom, var cx = (bbox.x + bbox.width/2) * current_zoom,
cy = (bbox.y + bbox.height/2) * current_zoom; cy = (bbox.y + bbox.height/2) * current_zoom;
var xform = ["rotate(", angle, " ", cx, ",", cy, ")"].join(""); var xform = ["rotate(", angle, " ", cx, ",", cy, ")"].join("");
pointGripContainer.setAttribute("transform", xform); setPointContainerTransform(xform);
if(ctrlPointGripContainer) ctrlPointGripContainer.setAttribute("transform", xform); }
if(pointToSelect != null) {
canvas.addNodeToSelection(pointToSelect);
} }
}; };
@ -2163,61 +2159,11 @@ function BatchCommand(text) {
pointGrip = pointGripContainer.appendChild(pointGrip); pointGrip = pointGripContainer.appendChild(pointGrip);
var grip = $('#polypointgrip_'+index); var grip = $('#polypointgrip_'+index);
grip.mouseover( function() { this.setAttribute("stroke", "#F00"); } ); // grip.mouseover( function() { this.setAttribute("stroke", "#F00"); } );
grip.mouseout( function() {this.setAttribute("stroke", "#00F"); } ); // grip.mouseout( function() {this.setAttribute("stroke", "#00F"); } );
grip.dblclick( function() { grip.dblclick( function() {
var old_d = current_poly.getAttribute('d');
// Index could have changed by deleting nodes canvas.setSegType();
index = grip[0].id.split('_')[1] - 0;
var last_index = current_poly_pts.length/2 - 1;
var is_closed = current_poly.getAttribute('d').toLowerCase().indexOf('z') != -1;
if(!is_closed && index == last_index) {
return; // Last point of unclosed poly should do nothing
} else if(index >= last_index && is_closed) {
index = 0;
}
var batchCmd = new BatchCommand("Toggle Poly Segment Type");
// Toggle segment to curve/straight line
var type = current_poly.pathSegList.getItem(index+1).pathSegType;
var next_index = index+1;
var cur_x = getPolyPoint(index)[0];
var cur_y = getPolyPoint(index)[1];
var next_x = getPolyPoint(next_index)[0];
var next_y = getPolyPoint(next_index)[1];
var next_rel_x = next_x - cur_x;
var next_rel_y = next_y - cur_y;
if(type != 7) { // 6 = abs, 7 = rel
// Change to CubicRel curve
var ct1_x = (next_y/-2 - cur_y/-2);
var ct1_y = (next_x/-2 - cur_x/-2);
var ct2_x = (next_y/-2 - cur_y/-2);
var ct2_y = (next_x/-2 - cur_x/-2);
replacePathSeg(7, next_index, [next_rel_x,next_rel_y, ct1_x,ct1_y, ct2_x+next_rel_x,ct2_y+next_rel_y]);
// Add the control points + lines
addControlPointGrip(ct1_x+cur_x,ct1_y+cur_y, cur_x,cur_y, index+'c1');
addControlPointGrip(ct2_x+next_x,ct2_y+next_y, next_x,next_y, index+'c2');
} else {
// Revert to relative line
replacePathSeg(5, next_index, [next_rel_x,next_rel_y]);
removeControlPointGrips(index);
}
batchCmd.addSubCommand(new ChangeElementCommand(current_poly, {d: old_d}));
addCommandToHistory(batchCmd);
call("changed", [current_poly]);
}); });
} }
@ -2229,6 +2175,28 @@ function BatchCommand(text) {
}); });
}; };
// Hack for Webktit to change the segment list from absolute values
// back to relative values. Probably inefficient, so not currently used
// var fixWebkitNodes = function() {
// var list = current_poly.pathSegList;
// var pts = current_poly_pts;
// var num = list.numberOfItems;
// for(var i = 0; i<num; i++) {
// var item = list.getItem(i);
// if(item.pathSegType == 4) {
// list.removeItem(i);
// var rel_x = pts[i*2] - pts[(i-1)*2];
// var rel_y = pts[i*2 + 1] - pts[(i-1)*2 + 1];
// var seg = current_poly.createSVGPathSegLinetoRel(rel_x, rel_y);
// list.insertItemBefore(seg, i);
// i--;
// }
// }
// for(var i = 0; i<num; i++) {
// var item = list.getItem(i);
// }
// }
var updatePoly = function(mouse_x, mouse_y, old_poly_pts) { var updatePoly = function(mouse_x, mouse_y, old_poly_pts) {
var x = mouse_x / current_zoom; var x = mouse_x / current_zoom;
var y = mouse_y / current_zoom; var y = mouse_y / current_zoom;
@ -2864,16 +2832,11 @@ function BatchCommand(text) {
oldvalues["transform"] = current_poly.getAttribute("rotate"); oldvalues["transform"] = current_poly.getAttribute("rotate");
current_poly.setAttribute("transform", rotate); current_poly.setAttribute("transform", rotate);
var pointGripContainer = document.getElementById("polypointgrip_container"); if(document.getElementById("polypointgrip_container")) {
var ctrlPointGripContainer = document.getElementById("ctrlpointgrip_container");
if(pointGripContainer) {
var pcx = newcx * current_zoom, var pcx = newcx * current_zoom,
pcy = newcy * current_zoom; pcy = newcy * current_zoom;
var xform = ["rotate(", (angle*180.0/Math.PI), " ", pcx, ",", pcy, ")"].join(""); var xform = ["rotate(", (angle*180.0/Math.PI), " ", pcx, ",", pcy, ")"].join("");
pointGripContainer.setAttribute("transform", xform); setPointContainerTransform(xform);
if(ctrlPointGripContainer) {
ctrlPointGripContainer.setAttribute("transform", xform);
}
} }
} // if rotated } // if rotated
@ -2924,7 +2887,16 @@ function BatchCommand(text) {
element.setAttribute("opacity", cur_shape.opacity); element.setAttribute("opacity", cur_shape.opacity);
cleanupElement(element); cleanupElement(element);
selectorManager.update(); selectorManager.update();
canvas.addToSelection([element], true);
if(current_mode == "poly") {
current_poly = element;
// selectedBBoxes[0] = canvas.getBBox(current_poly);
current_mode = "polyedit";
recalcPolyPoints();
addAllPointGripsToPoly(current_poly_pts.length/2 - 1);
} else {
canvas.addToSelection([element], true);
}
// we create the insert command that is stored on the stack // we create the insert command that is stored on the stack
// undo means to call cmd.unapply(), redo means to call cmd.apply() // undo means to call cmd.unapply(), redo means to call cmd.apply()
addCommandToHistory(new InsertElementCommand(element)); addCommandToHistory(new InsertElementCommand(element));
@ -3296,13 +3268,22 @@ function BatchCommand(text) {
this.getNodePoint = function() { this.getNodePoint = function() {
if(current_poly_pt != -1) { if(current_poly_pt != -1) {
return getPolyPoint(current_poly_pt, true); var pt = getPolyPoint(current_poly_pt, true);
var segtype = current_poly.pathSegList.getItem(current_poly_pt+1).pathSegType;
return {
x: pt[0],
y: pt[1],
type: segtype
}
} else { } else {
return false; return false;
} }
} }
this.cloneNode = function() { this.clonePolyNode = function() {
// fixWebkitNodes();
var pt = current_poly_pt, list = current_poly.pathSegList; var pt = current_poly_pt, list = current_poly.pathSegList;
var next_item = list.getItem(pt+1); var next_item = list.getItem(pt+1);
@ -3329,7 +3310,7 @@ function BatchCommand(text) {
// Add new grip // Add new grip
addPointGripToPoly(abs_x, abs_y, last_num); addPointGripToPoly(abs_x, abs_y, last_num);
// Update poly_pts // Update poly_pts
current_poly_pts.splice(pt*2 + 2, 0, abs_x, abs_y); current_poly_pts.splice(pt*2 + 2, 0, abs_x, abs_y);
@ -3337,7 +3318,7 @@ function BatchCommand(text) {
this.addNodeToSelection(pt+1); this.addNodeToSelection(pt+1);
} }
this.deleteNode = function() { this.deletePolyNode = function() {
var last_pt = current_poly_pts.length/2 - 1; var last_pt = current_poly_pts.length/2 - 1;
var pt = current_poly_pt, list = current_poly.pathSegList; var pt = current_poly_pt, list = current_poly.pathSegList;
var cur_item = list.getItem(pt); var cur_item = list.getItem(pt);
@ -3762,12 +3743,8 @@ function BatchCommand(text) {
this.changeSelectedAttribute("transform",rotate,selectedElements); this.changeSelectedAttribute("transform",rotate,selectedElements);
} }
var pointGripContainer = document.getElementById("polypointgrip_container"); var pointGripContainer = document.getElementById("polypointgrip_container");
var ctrlPointGripContainer = document.getElementById("ctrlpointgrip_container");
if(elem.nodeName == "path" && pointGripContainer) { if(elem.nodeName == "path" && pointGripContainer) {
pointGripContainer.setAttribute("transform", rotate); setPointContainerTransform(rotate);
if(ctrlPointGripContainer) {
ctrlPointGripContainer.setAttribute("transform", rotate);
}
} }
selectorManager.requestSelector(selectedElements[0]).updateGripCursors(val); selectorManager.requestSelector(selectedElements[0]).updateGripCursors(val);
}; };
@ -3870,6 +3847,71 @@ function BatchCommand(text) {
} }
}; };
this.setSegType = function(new_type) {
var grip = $('#polypointgrip_' + current_poly_pt);
var old_d = current_poly.getAttribute('d');
var index = grip[0].id.split('_')[1] - 0;
var last_index = current_poly_pts.length/2 - 1;
var is_closed = current_poly.getAttribute('d').toLowerCase().indexOf('z') != -1;
if(!is_closed && index == last_index) {
return; // Last point of unclosed poly should do nothing
} else if(index >= last_index && is_closed) {
index = 0;
}
var next_index = index+1;
var cur_x = getPolyPoint(index)[0];
var cur_y = getPolyPoint(index)[1];
var next_x = getPolyPoint(next_index)[0];
var next_y = getPolyPoint(next_index)[1];
var next_rel_x = next_x - cur_x;
var next_rel_y = next_y - cur_y;
if(!new_type) { // double-click, so just toggle
var batchCmd = new BatchCommand("Toggle Poly Segment Type");
// Toggle segment to curve/straight line
var old_type = current_poly.pathSegList.getItem(index+1).pathSegType;
new_type = (old_type == 7) ? 5 : 7;
} else {
new_type -= 0;
var batchCmd = new BatchCommand("Change Poly Segment Type");
}
var points;
switch ( new_type ) {
case 7:
var ct1_x = (next_y/-2 - cur_y/-2);
var ct1_y = (next_x/-2 - cur_x/-2);
var ct2_x = (next_y/-2 - cur_y/-2);
var ct2_y = (next_x/-2 - cur_x/-2);
points = [next_rel_x,next_rel_y, ct1_x,ct1_y, ct2_x+next_rel_x,ct2_y+next_rel_y];
// Add the control points + lines
addControlPointGrip(ct1_x+cur_x,ct1_y+cur_y, cur_x,cur_y, index+'c1');
addControlPointGrip(ct2_x+next_x,ct2_y+next_y, next_x,next_y, index+'c2');
break;
case 5:
points = [next_rel_x,next_rel_y];
removeControlPointGrips(index);
break;
}
replacePathSeg(new_type, next_index, points);
batchCmd.addSubCommand(new ChangeElementCommand(current_poly, {d: old_d}));
addCommandToHistory(batchCmd);
call("changed", [current_poly]);
}
this.quickClone = function(elem) { this.quickClone = function(elem) {
// Hack for Firefox bugs where text element features aren't updated // Hack for Firefox bugs where text element features aren't updated
if(navigator.userAgent.indexOf('Gecko/') == -1) return elem; if(navigator.userAgent.indexOf('Gecko/') == -1) return elem;