mirror of
https://github.com/FoggedLens/iD.git
synced 2026-05-15 05:30:35 +02:00
Try to insert relation members at a sensible index (#1539)
This commit is contained in:
@@ -1,5 +1,29 @@
|
||||
iD.actions.AddMember = function(relationId, member, memberIndex) {
|
||||
return function(graph) {
|
||||
return graph.replace(graph.entity(relationId).addMember(member, memberIndex));
|
||||
var relation = graph.entity(relationId);
|
||||
|
||||
if (isNaN(memberIndex) && member.type === 'way') {
|
||||
var members = relation.indexedMembers();
|
||||
members.push(member);
|
||||
|
||||
var joined = iD.geo.joinMemberWays(members, graph);
|
||||
for (var i = 0; i < joined.length; i++) {
|
||||
var segment = joined[i];
|
||||
for (var j = 0; j < segment.length && segment.length >= 2; j++) {
|
||||
if (segment[j] !== member)
|
||||
continue;
|
||||
|
||||
if (j === 0) {
|
||||
memberIndex = segment[j + 1].index;
|
||||
} else if (j === segment.length - 1) {
|
||||
memberIndex = segment[j - 1].index + 1;
|
||||
} else {
|
||||
memberIndex = Math.min(segment[j - 1].index + 1, segment[j + 1].index + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return graph.replace(relation.addMember(member, memberIndex));
|
||||
}
|
||||
};
|
||||
|
||||
@@ -31,6 +31,16 @@ _.extend(iD.Relation.prototype, {
|
||||
});
|
||||
},
|
||||
|
||||
// Return an array of members, each extended with an 'index' property whose value
|
||||
// is the member index.
|
||||
indexedMembers: function() {
|
||||
var result = new Array(this.members.length);
|
||||
for (var i = 0; i < this.members.length; i++) {
|
||||
result[i] = _.extend({}, this.members[i], {index: i})
|
||||
}
|
||||
return result;
|
||||
},
|
||||
|
||||
// Return the first member with the given role. A copy of the member object
|
||||
// is returned, extended with an 'index' property whose value is the member index.
|
||||
memberByRole: function(role) {
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
<script src='../js/id/ui/preset/combo.js'></script>
|
||||
|
||||
<script src='../js/id/actions.js'></script>
|
||||
<script src='../js/id/actions/add_member.js'></script>
|
||||
<script src="../js/id/actions/add_midpoint.js"></script>
|
||||
<script src='../js/id/actions/add_entity.js'></script>
|
||||
<script src='../js/id/actions/add_vertex.js'></script>
|
||||
@@ -188,6 +189,7 @@
|
||||
<script src="spec/lib/d3.keybinding.js"></script>
|
||||
<script src="spec/lib/locale.js"></script>
|
||||
|
||||
<script src="spec/actions/add_member.js"></script>
|
||||
<script src="spec/actions/add_midpoint.js"></script>
|
||||
<script src="spec/actions/add_entity.js"></script>
|
||||
<script src="spec/actions/change_member.js"></script>
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
<script src="spec/lib/d3.keybinding.js"></script>
|
||||
<script src="spec/lib/locale.js"></script>
|
||||
|
||||
<script src="spec/actions/add_member.js"></script>
|
||||
<script src="spec/actions/add_midpoint.js"></script>
|
||||
<script src="spec/actions/add_entity.js"></script>
|
||||
<script src="spec/actions/change_member.js"></script>
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
describe("iD.actions.AddMember", function() {
|
||||
it("adds an member to a relation at the specified index", function() {
|
||||
var r = iD.Relation({members: [{id: '1'}, {id: '3'}]}),
|
||||
g = iD.actions.AddMember(r.id, {id: '2'}, 1)(iD.Graph([r]));
|
||||
expect(g.entity(r.id).members).to.eql([{id: '1'}, {id: '2'}, {id: '3'}]);
|
||||
});
|
||||
|
||||
describe("inserts way members at a sensible index", function() {
|
||||
function members(graph) {
|
||||
return _.pluck(graph.entity('r').members, 'id');
|
||||
}
|
||||
|
||||
specify("no members", function() {
|
||||
var graph = iD.Graph({
|
||||
'a': iD.Node({id: 'a', loc: [0, 0]}),
|
||||
'b': iD.Node({id: 'b', loc: [0, 0]}),
|
||||
'-': iD.Way({id: '-', nodes: ['a', 'b']}),
|
||||
'r': iD.Relation({id: 'r'})
|
||||
});
|
||||
|
||||
graph = iD.actions.AddMember('r', {id: '-', type: 'way'})(graph);
|
||||
expect(members(graph)).to.eql(['-']);
|
||||
});
|
||||
|
||||
specify("not connecting", function() {
|
||||
// a--->b c===>d
|
||||
var graph = iD.Graph({
|
||||
'a': iD.Node({id: 'a', loc: [0, 0]}),
|
||||
'b': iD.Node({id: 'b', loc: [0, 0]}),
|
||||
'c': iD.Node({id: 'c', loc: [0, 0]}),
|
||||
'd': iD.Node({id: 'd', loc: [0, 0]}),
|
||||
'-': iD.Way({id: '-', nodes: ['a', 'b']}),
|
||||
'=': iD.Way({id: '=', nodes: ['c', 'd']}),
|
||||
'r': iD.Relation({id: 'r', members: [{id: '-', type: 'way'}]})
|
||||
});
|
||||
|
||||
graph = iD.actions.AddMember('r', {id: '=', type: 'way'})(graph);
|
||||
expect(members(graph)).to.eql(['-', '=']);
|
||||
});
|
||||
|
||||
specify("connecting at end", function() {
|
||||
// a--->b===>c
|
||||
var graph = iD.Graph({
|
||||
'a': iD.Node({id: 'a', loc: [0, 0]}),
|
||||
'b': iD.Node({id: 'b', loc: [0, 0]}),
|
||||
'c': iD.Node({id: 'c', loc: [0, 0]}),
|
||||
'-': iD.Way({id: '-', nodes: ['a', 'b']}),
|
||||
'=': iD.Way({id: '=', nodes: ['b', 'c']}),
|
||||
'r': iD.Relation({id: 'r', members: [{id: '-', type: 'way'}]})
|
||||
});
|
||||
|
||||
graph = iD.actions.AddMember('r', {id: '=', type: 'way'})(graph);
|
||||
expect(members(graph)).to.eql(['-', '=']);
|
||||
});
|
||||
|
||||
specify("connecting at beginning", function() {
|
||||
// a===>b--->c~~~>d
|
||||
var graph = iD.Graph({
|
||||
'a': iD.Node({id: 'a', loc: [0, 0]}),
|
||||
'b': iD.Node({id: 'b', loc: [0, 0]}),
|
||||
'c': iD.Node({id: 'c', loc: [0, 0]}),
|
||||
'd': iD.Node({id: 'd', loc: [0, 0]}),
|
||||
'=': iD.Way({id: '=', nodes: ['a', 'b']}),
|
||||
'-': iD.Way({id: '-', nodes: ['b', 'c']}),
|
||||
'~': iD.Way({id: '~', nodes: ['c', 'd']}),
|
||||
'r': iD.Relation({id: 'r', members: [{id: '-', type: 'way'}, {id: '~', type: 'way'}]})
|
||||
});
|
||||
|
||||
graph = iD.actions.AddMember('r', {id: '=', type: 'way'})(graph);
|
||||
expect(members(graph)).to.eql(['=', '-', '~']);
|
||||
});
|
||||
|
||||
specify("connecting in middle", function() {
|
||||
// a--->b===>c~~~>d
|
||||
var graph = iD.Graph({
|
||||
'a': iD.Node({id: 'a', loc: [0, 0]}),
|
||||
'b': iD.Node({id: 'b', loc: [0, 0]}),
|
||||
'c': iD.Node({id: 'c', loc: [0, 0]}),
|
||||
'd': iD.Node({id: 'd', loc: [0, 0]}),
|
||||
'-': iD.Way({id: '-', nodes: ['a', 'b']}),
|
||||
'=': iD.Way({id: '=', nodes: ['b', 'c']}),
|
||||
'~': iD.Way({id: '~', nodes: ['c', 'd']}),
|
||||
'r': iD.Relation({id: 'r', members: [{id: '-', type: 'way'}, {id: '~', type: 'way'}]})
|
||||
});
|
||||
|
||||
graph = iD.actions.AddMember('r', {id: '=', type: 'way'})(graph);
|
||||
expect(members(graph)).to.eql(['-', '=', '~']);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -99,6 +99,13 @@ describe('iD.Relation', function () {
|
||||
});
|
||||
});
|
||||
|
||||
describe("#indexedMembers", function () {
|
||||
it("returns an array of members extended with indexes", function () {
|
||||
var r = iD.Relation({members: [{id: '1'}, {id: '3'}]});
|
||||
expect(r.indexedMembers()).to.eql([{id: '1', index: 0}, {id: '3', index: 1}]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("#addMember", function () {
|
||||
it("adds a member at the end of the relation", function () {
|
||||
var r = iD.Relation();
|
||||
|
||||
Reference in New Issue
Block a user