Extract MoveWay action

This commit is contained in:
John Firebaugh
2012-12-13 14:01:43 -08:00
parent ee3f5cc768
commit 209b87f7e8
6 changed files with 40 additions and 9 deletions

View File

@@ -54,6 +54,7 @@
<script src="js/id/actions/delete_node.js"></script>
<script src="js/id/actions/delete_way.js"></script>
<script src='js/id/actions/move_node.js'></script>
<script src='js/id/actions/move_way.js'></script>
<script src='js/id/actions/noop.js'></script>
<script src='js/id/actions/remove_relation_member.js'></script>
<script src='js/id/actions/remove_way_node.js'></script>

14
js/id/actions/move_way.js Normal file
View File

@@ -0,0 +1,14 @@
iD.actions.MoveWay = function(wayId, dxdy, projection) {
return function(graph) {
var way = graph.entity(wayId);
_.uniq(way.nodes).forEach(function(id) {
var node = graph.entity(id),
start = projection(node.loc),
end = projection.invert([start[0] + dxdy[0], start[1] + dxdy[1]]);
graph = iD.actions.MoveNode(id, end)(graph);
});
return graph;
};
};

View File

@@ -22,15 +22,7 @@ iD.modes.Select = function (entity) {
mode.history.perform(iD.actions.Noop());
}
_.uniq(_.pluck(entity.nodes, 'id'))
.forEach(function(id) {
var node = mode.history.graph().entity(id),
start = mode.map.projection(node.loc),
end = mode.map.projection.invert([
start[0] + d3.event.dx,
start[1] + d3.event.dy]);
mode.history.replace(iD.actions.Move(id, end));
});
mode.history.replace(iD.actions.MoveWay(entity.id, [d3.event.dx, d3.event.dy], mode.map.projection));
})
.on('dragend', function () {
if (!dragging) return;

View File

@@ -55,6 +55,7 @@
<script src="../js/id/actions/delete_node.js"></script>
<script src="../js/id/actions/delete_way.js"></script>
<script src='../js/id/actions/move_node.js'></script>
<script src='../js/id/actions/move_way.js'></script>
<script src='../js/id/actions/noop.js'></script>
<script src='../js/id/actions/remove_relation_member.js'></script>
<script src='../js/id/actions/remove_way_node.js'></script>
@@ -95,6 +96,7 @@
<script src="spec/actions/delete_node.js"></script>
<script src="spec/actions/delete_way.js"></script>
<script src="spec/actions/move_node.js"></script>
<script src="spec/actions/move_way.js"></script>
<script src="spec/actions/noop.js"></script>
<script src="spec/actions/remove_way_node.js"></script>
<script src="spec/actions/remove_relation_member.js"></script>

View File

@@ -32,6 +32,7 @@
<script src="spec/actions/delete_node.js"></script>
<script src="spec/actions/delete_way.js"></script>
<script src="spec/actions/move_node.js"></script>
<script src="spec/actions/move_way.js"></script>
<script src="spec/actions/noop.js"></script>
<script src="spec/actions/remove_way_node.js"></script>
<script src="spec/actions/remove_relation_member.js"></script>

View File

@@ -0,0 +1,21 @@
describe("iD.actions.MoveWay", function () {
it("moves all nodes in a way by the given amount", function () {
var node1 = iD.Node({loc: [0, 0]}),
node2 = iD.Node({loc: [5, 10]}),
way = iD.Way({nodes: [node1.id, node2.id]}),
dxdy = [2, 3],
projection = d3.geo.mercator(),
graph = iD.actions.MoveWay(way.id, dxdy, projection)(iD.Graph([node1, node2, way]));
expect(graph.entity(node1.id).loc).to.eql([1.4400000000000002, -2.1594885414215783]);
expect(graph.entity(node2.id).loc).to.eql([6.440000000000008, 7.866329874099955]);
});
it("moves repeated nodes only once", function () {
var node = iD.Node({loc: [0, 0]}),
way = iD.Way({nodes: [node.id, node.id]}),
dxdy = [2, 3],
projection = d3.geo.mercator(),
graph = iD.actions.MoveWay(way.id, dxdy, projection)(iD.Graph([node, way]));
expect(graph.entity(node.id).loc).to.eql([1.4400000000000002, -2.1594885414215783]);
});
});