Fix Issue 227: Move elements to a different layer. Also document all of the Layer API functions of SvgCanvas.
git-svn-id: http://svg-edit.googlecode.com/svn/trunk@796 eee81c28-f429-11dd-99c0-75d572ba1dddmaster
parent
eab1e7ccb6
commit
2549e8ddd6
|
@ -113,5 +113,9 @@
|
||||||
{"id":"straight_segments","textContent":"Straight"},
|
{"id":"straight_segments","textContent":"Straight"},
|
||||||
{"id":"curve_segments","textContent":"Curve"},
|
{"id":"curve_segments","textContent":"Curve"},
|
||||||
{"id":"tool_node_clone","title":"Clone Node"},
|
{"id":"tool_node_clone","title":"Clone Node"},
|
||||||
{"id":"tool_node_delete","title":"Delete Node"}
|
{"id":"tool_node_delete","title":"Delete Node"},
|
||||||
|
{"id":"selLayerLabel","textContent":"layer:"},
|
||||||
|
{"id":"selLayerNames","title":"Move selected elements to a different layer"}
|
||||||
|
{"id":"mselLayerLabel","textContent":"layer:"},
|
||||||
|
{"id":"mselLayerNames","title":"Move selected elements to a different layer"}
|
||||||
];
|
];
|
||||||
|
|
|
@ -117,6 +117,10 @@ script type="text/javascript" src="locale/locale.min.js"></script-->
|
||||||
</select>
|
</select>
|
||||||
<span id="angleLabel" class="selected_tool">angle:</span>
|
<span id="angleLabel" class="selected_tool">angle:</span>
|
||||||
<input id="angle" class="selected_tool" title="Change rotation angle" size="2" value="0" type="text"/>
|
<input id="angle" class="selected_tool" title="Change rotation angle" size="2" value="0" type="text"/>
|
||||||
|
<span id="selLayerLabel" class="selected_tool">layer:</span>
|
||||||
|
<select id="selLayerNames" class="selected_tool" title="Move selected elements to a different layer">
|
||||||
|
<option selected="selected" value="layer1">Layer 1</option>
|
||||||
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Buttons when multiple elements are selected -->
|
<!-- Buttons when multiple elements are selected -->
|
||||||
|
@ -139,6 +143,10 @@ script type="text/javascript" src="locale/locale.min.js"></script-->
|
||||||
<option id="page" value="page">page</option>
|
<option id="page" value="page">page</option>
|
||||||
</select>
|
</select>
|
||||||
<img class="tool_sep" src="images/sep.png" alt="|"/>
|
<img class="tool_sep" src="images/sep.png" alt="|"/>
|
||||||
|
<span id="mselLayerLabel" class="selected_tool">layer:</span>
|
||||||
|
<select id="mselLayerNames" class="selected_tool" title="Move selected elements to a different layer">
|
||||||
|
<option selected="selected" value="layer1">Layer 1</option>
|
||||||
|
</select>
|
||||||
<img class="tool_button" id="tool_group" src="images/shape_group.png" title="Group Elements [G]" alt="Group"/>
|
<img class="tool_button" id="tool_group" src="images/shape_group.png" title="Group Elements [G]" alt="Group"/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -190,6 +190,7 @@ function svg_edit_setup() {
|
||||||
// updates the context panel tools based on the selected element
|
// updates the context panel tools based on the selected element
|
||||||
var updateContextPanel = function() {
|
var updateContextPanel = function() {
|
||||||
var elem = selectedElement;
|
var elem = selectedElement;
|
||||||
|
var currentLayer = svgCanvas.getCurrentLayer();
|
||||||
|
|
||||||
// No need to update anything else in rotate mode
|
// No need to update anything else in rotate mode
|
||||||
if (svgCanvas.getMode() == 'rotate' && elem != null) {
|
if (svgCanvas.getMode() == 'rotate' && elem != null) {
|
||||||
|
@ -205,6 +206,18 @@ function svg_edit_setup() {
|
||||||
var is_node = (elem.id && elem.id.indexOf('polypointgrip') == 0);
|
var is_node = (elem.id && elem.id.indexOf('polypointgrip') == 0);
|
||||||
|
|
||||||
if(!is_node) {
|
if(!is_node) {
|
||||||
|
// update the selected elements' layer
|
||||||
|
var opts = $('#selLayerNames option');
|
||||||
|
for (var i = 0; i < opts.length; ++i) {
|
||||||
|
var opt = opts[i];
|
||||||
|
if (currentLayer == opt.textContent) {
|
||||||
|
opt.setAttribute('selected', 'selected');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
opt.removeAttribute('selected');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$('#selected_panel').show();
|
$('#selected_panel').show();
|
||||||
} else {
|
} else {
|
||||||
$('#poly_node_panel').show();
|
$('#poly_node_panel').show();
|
||||||
|
@ -231,7 +244,6 @@ function svg_edit_setup() {
|
||||||
var el_name = elem.tagName;
|
var el_name = elem.tagName;
|
||||||
|
|
||||||
if(panels[el_name]) {
|
if(panels[el_name]) {
|
||||||
|
|
||||||
var cur_panel = panels[el_name];
|
var cur_panel = panels[el_name];
|
||||||
|
|
||||||
|
|
||||||
|
@ -261,14 +273,26 @@ function svg_edit_setup() {
|
||||||
if (svgCanvas.addedNew) {
|
if (svgCanvas.addedNew) {
|
||||||
$('#text').focus().select();
|
$('#text').focus().select();
|
||||||
}
|
}
|
||||||
}
|
} // text
|
||||||
else if(el_name == 'image') {
|
else if(el_name == 'image') {
|
||||||
var xlinkNS="http://www.w3.org/1999/xlink";
|
var xlinkNS="http://www.w3.org/1999/xlink";
|
||||||
$('#image_url').val(elem.getAttributeNS(xlinkNS, "href"));
|
$('#image_url').val(elem.getAttributeNS(xlinkNS, "href"));
|
||||||
}
|
} // image
|
||||||
}
|
}
|
||||||
} // if (elem != null)
|
} // if (elem != null)
|
||||||
else if (multiselected) {
|
else if (multiselected) {
|
||||||
|
// update the selected layer
|
||||||
|
var opts = $('#mselLayerNames option');
|
||||||
|
for (var i = 0; i < opts.length; ++i) {
|
||||||
|
var opt = opts[i];
|
||||||
|
if (currentLayer == opt.textContent) {
|
||||||
|
opt.setAttribute('selected', 'selected');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
opt.removeAttribute('selected');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$('#multiselected_panel').show();
|
$('#multiselected_panel').show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -343,7 +367,15 @@ function svg_edit_setup() {
|
||||||
$('select').change(function(){$(this).blur();});
|
$('select').change(function(){$(this).blur();});
|
||||||
|
|
||||||
$('#group_opacity').change(function(){
|
$('#group_opacity').change(function(){
|
||||||
svgCanvas.setOpacity(this.options[this.selectedIndex].value);
|
svgCanvas.setOpacity();
|
||||||
|
});
|
||||||
|
|
||||||
|
// fired when user wants to move elements to another layer
|
||||||
|
$('#selLayerNames,#mselLayerNames').change(function(){
|
||||||
|
var destLayer = this.options[this.selectedIndex].value;
|
||||||
|
if (destLayer) {
|
||||||
|
svgCanvas.moveSelectedToLayer(destLayer);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#font_size').change(function(){
|
$('#font_size').change(function(){
|
||||||
|
@ -1214,7 +1246,11 @@ function svg_edit_setup() {
|
||||||
|
|
||||||
var populateLayers = function(){
|
var populateLayers = function(){
|
||||||
var layerlist = $('#layerlist tbody');
|
var layerlist = $('#layerlist tbody');
|
||||||
|
var selLayerNames = $('#selLayerNames');
|
||||||
|
var mselLayerNames = $('#mselLayerNames');
|
||||||
layerlist.empty();
|
layerlist.empty();
|
||||||
|
selLayerNames.empty();
|
||||||
|
mselLayerNames.empty();
|
||||||
var layer = svgCanvas.getNumLayers();
|
var layer = svgCanvas.getNumLayers();
|
||||||
// we get the layers in the reverse z-order (the layer rendered on top is listed first)
|
// we get the layers in the reverse z-order (the layer rendered on top is listed first)
|
||||||
while (layer--) {
|
while (layer--) {
|
||||||
|
@ -1226,6 +1262,8 @@ function svg_edit_setup() {
|
||||||
else {
|
else {
|
||||||
layerlist.append("<tr class=\"layer\"><td class=\"layervis layerinvis\"/><td class=\"layername\" >" + name + "</td></tr>");
|
layerlist.append("<tr class=\"layer\"><td class=\"layervis layerinvis\"/><td class=\"layername\" >" + name + "</td></tr>");
|
||||||
}
|
}
|
||||||
|
selLayerNames.append("<option values=\"" + name + "\">" + name + "</option>");
|
||||||
|
mselLayerNames.append("<option values=\"" + name + "\">" + name + "</option>");
|
||||||
}
|
}
|
||||||
// if we only have one layer, then always make sure that layer is selected
|
// if we only have one layer, then always make sure that layer is selected
|
||||||
// (This is really only required upon first initialization)
|
// (This is really only required upon first initialization)
|
||||||
|
|
|
@ -3192,6 +3192,15 @@ function BatchCommand(text) {
|
||||||
return all_layers.length;
|
return all_layers.length;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Function: getLayer
|
||||||
|
// This function returns the name of the ith layer. If the index is out of range,
|
||||||
|
// then an empty string is returned.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// i - the zero-based index of the layer you are querying.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// The name of the ith layer
|
||||||
this.getLayer = function(i) {
|
this.getLayer = function(i) {
|
||||||
if (i >= 0 && i < canvas.getNumLayers()) {
|
if (i >= 0 && i < canvas.getNumLayers()) {
|
||||||
return all_layers[i][0];
|
return all_layers[i][0];
|
||||||
|
@ -3199,6 +3208,12 @@ function BatchCommand(text) {
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Function: getCurrentLayer
|
||||||
|
// This function returns the name of the currently selected layer. If an error occurs,
|
||||||
|
// an empty string is returned.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// The name of the currently active layer.
|
||||||
this.getCurrentLayer = function() {
|
this.getCurrentLayer = function() {
|
||||||
for (var i = 0; i < all_layers.length; ++i) {
|
for (var i = 0; i < all_layers.length; ++i) {
|
||||||
if (all_layers[i][1] == current_layer) {
|
if (all_layers[i][1] == current_layer) {
|
||||||
|
@ -3208,6 +3223,15 @@ function BatchCommand(text) {
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Function: setCurrentLayer
|
||||||
|
// This function sets the current layer. If the name is not a valid layer name, then this
|
||||||
|
// function returns false. Otherwise it returns true. This is not an undo-able action.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// name - the name of the layer you want to switch to.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// true if the current layer was switched, otherwise false
|
||||||
this.setCurrentLayer = function(name) {
|
this.setCurrentLayer = function(name) {
|
||||||
name = toXml(name);
|
name = toXml(name);
|
||||||
for (var i = 0; i < all_layers.length; ++i) {
|
for (var i = 0; i < all_layers.length; ++i) {
|
||||||
|
@ -3224,6 +3248,17 @@ function BatchCommand(text) {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Function: renameCurrentLayer
|
||||||
|
// This function renames the current layer. This is an undo-able action. If the layer name
|
||||||
|
// is not valid (i.e. unique), then this function does nothing and returns false, otherwise
|
||||||
|
// it returns true.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// newname - the new name you want to give the current layer. This name must be unique
|
||||||
|
// among all layer names.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// true if the rename succeeded, false otherwise.
|
||||||
this.renameCurrentLayer = function(newname) {
|
this.renameCurrentLayer = function(newname) {
|
||||||
if (current_layer) {
|
if (current_layer) {
|
||||||
var oldLayer = current_layer;
|
var oldLayer = current_layer;
|
||||||
|
@ -3259,6 +3294,17 @@ function BatchCommand(text) {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Function: setCurrentLayerPosition
|
||||||
|
// This function changes the position of the current layer to the new value. This is an
|
||||||
|
// undo-able action. If the new index is not valid, this function does nothing and returns
|
||||||
|
// false, otherwise it returns true.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// newpos - The zero-based index of the new position of the layer. This should be between
|
||||||
|
// 0 and (number of layers - 1)
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// true if the current layer position was changed, false otherwise.
|
||||||
this.setCurrentLayerPosition = function(newpos) {
|
this.setCurrentLayerPosition = function(newpos) {
|
||||||
if (current_layer && newpos >= 0 && newpos < all_layers.length) {
|
if (current_layer && newpos >= 0 && newpos < all_layers.length) {
|
||||||
for (var oldpos = 0; oldpos < all_layers.length; ++oldpos) {
|
for (var oldpos = 0; oldpos < all_layers.length; ++oldpos) {
|
||||||
|
@ -3290,10 +3336,18 @@ function BatchCommand(text) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: if i differs, then MoveElementCommand
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Function: getLayerVisibility
|
||||||
|
// This function returns whether the layer is visible. If the layer name is not valid, then
|
||||||
|
// this function returns false.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// layername - the name of the layer which you want to query.
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// The visibility state of the layer, or false if the layer name was invalid.
|
||||||
this.getLayerVisibility = function(layername) {
|
this.getLayerVisibility = function(layername) {
|
||||||
// find the layer
|
// find the layer
|
||||||
var layer = null;
|
var layer = null;
|
||||||
|
@ -3307,6 +3361,16 @@ function BatchCommand(text) {
|
||||||
return (layer.getAttribute("display") != "none");
|
return (layer.getAttribute("display") != "none");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Function: setLayerVisibility
|
||||||
|
// This function sets the visibility of the layer. This is an undo-able action. If the
|
||||||
|
// layer name is not valid, this function return false, otherwise it returns true.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// layername - the name of the layer to change the visibility
|
||||||
|
// bVisible - true/false, whether the layer should be visible
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// true if the layer's visibility was set, false otherwise
|
||||||
this.setLayerVisibility = function(layername, bVisible) {
|
this.setLayerVisibility = function(layername, bVisible) {
|
||||||
// find the layer
|
// find the layer
|
||||||
var layer = null;
|
var layer = null;
|
||||||
|
@ -3331,6 +3395,46 @@ function BatchCommand(text) {
|
||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Function: moveSelectedToLayer
|
||||||
|
// This function moves the selected elements to layername. This is an undo-able action.
|
||||||
|
// If the name is not a valid layer name, then false is returned. Otherwise it returns true.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// layername - the name of the layer you want to which you want to move the selected elements
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// true if the selected elements were moved to the layer, false otherwise.
|
||||||
|
this.moveSelectedToLayer = function(layername) {
|
||||||
|
// find the layer
|
||||||
|
var layer = null;
|
||||||
|
for (var i = 0; i < all_layers.length; ++i) {
|
||||||
|
if (all_layers[i][0] == layername) {
|
||||||
|
layer = all_layers[i][1];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!layer) return false;
|
||||||
|
|
||||||
|
var batchCmd = new BatchCommand("Move Elements to Layer");
|
||||||
|
|
||||||
|
// loop for each selected element and move it
|
||||||
|
var selElems = selectedElements;
|
||||||
|
var i = selElems.length;
|
||||||
|
while (i--) {
|
||||||
|
var elem = selElems[i];
|
||||||
|
if (!elem) continue;
|
||||||
|
var oldNextSibling = elem.nextSibling;
|
||||||
|
// TODO: this is pretty brittle!
|
||||||
|
var oldLayer = elem.parentNode;
|
||||||
|
layer.appendChild(elem);
|
||||||
|
batchCmd.addSubCommand(new MoveElementCommand(elem, oldNextSibling, oldLayer));
|
||||||
|
}
|
||||||
|
|
||||||
|
addCommandToHistory(batchCmd);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
// used internally
|
// used internally
|
||||||
var getLayerName = function(g) {
|
var getLayerName = function(g) {
|
||||||
return $("title",g).text();
|
return $("title",g).text();
|
||||||
|
|
Loading…
Reference in New Issue