diff --git a/js/id/modes/drag_features.js b/js/id/modes/drag_features.js index 80017a306..2ed6caa44 100644 --- a/js/id/modes/drag_features.js +++ b/js/id/modes/drag_features.js @@ -1,45 +1,50 @@ iD.modes._dragFeatures = function(mode) { - var dragging; + var history = mode.history, + projection = mode.map.projection; - var dragbehavior = d3.behavior.drag() + var dragNode = iD.behavior.drag() + .delegate(".handle, .marker") .origin(function(entity) { - var p = mode.map.projection(entity.loc); - // d3.event.sourceEvent.stopPropagation(); - return { x: p[0], y: p[1] }; + return projection(entity.loc); }) - .on('drag', function(entity) { + .on('start', function() { + history.perform( + iD.actions.Noop()); + }) + .on('move', function(entity) { d3.event.sourceEvent.stopPropagation(); - - var loc = mode.map.projection.invert([d3.event.x, d3.event.y]); - - if (!dragging) { - if (entity.accuracy) { - dragging = iD.Node({loc: loc}); - mode.history.perform( - iD.actions.AddNode(dragging), - iD.actions.AddWayNode(entity.way, dragging.id, entity.index)); - } else { - dragging = entity; - mode.history.perform( - iD.actions.MoveNode(dragging.id, loc)); - } - } - - mode.history.replace(iD.actions.MoveNode(dragging.id, loc)); + history.replace( + iD.actions.MoveNode(entity.id, projection.invert(d3.event.loc))); }) - .on('dragend', function (entity) { - if (!dragging) return; - dragging = undefined; - - mode.history.replace( + .on('end', function() { + history.replace( iD.actions.Noop(), - entity.accuracy ? 'added a node to a way' : 'moved a node'); + 'moved a node'); + }); + + var dragAccuracy = iD.behavior.drag() + .delegate(".accuracy-handle") + .origin(function(d) { + return projection(d.loc); + }) + .on('start', function(d) { + d.node = iD.Node({loc: d.loc}); + history.perform( + iD.actions.AddNode(d.node), + iD.actions.AddWayNode(d.way, d.node.id, d.index)); + }) + .on('move', function(d) { + d3.event.sourceEvent.stopPropagation(); + history.replace( + iD.actions.MoveNode(d.node.id, projection.invert(d3.event.loc))); + }) + .on('end', function() { + history.replace( + iD.actions.Noop(), + 'added a node to a way'); }); mode.map.surface - .call(dragbehavior) - .call(d3.latedrag() - .filter(function(d) { - return (d.type === 'node' || d.accuracy); - })); + .call(dragNode) + .call(dragAccuracy); }; diff --git a/js/id/modes/select.js b/js/id/modes/select.js index a6022e1d8..46d6cd404 100644 --- a/js/id/modes/select.js +++ b/js/id/modes/select.js @@ -6,31 +6,7 @@ iD.modes.Select = function (entity) { }; var inspector = iD.Inspector(), - dragging, target; - - var dragWay = d3.behavior.drag() - .origin(function(entity) { - var p = mode.map.projection(entity.nodes[0].loc); - return { x: p[0], y: p[1] }; - }) - .on('drag', function(entity) { - d3.event.sourceEvent.stopPropagation(); - - if (!dragging) { - dragging = true; - mode.history.perform(iD.actions.Noop()); - } - - mode.history.replace(iD.actions.MoveWay(entity.id, [d3.event.dx, d3.event.dy], mode.map.projection)); - }) - .on('dragend', function () { - if (!dragging) return; - dragging = undefined; - - mode.history.replace( - iD.actions.Noop(), - 'moved a way'); - }); + target; function remove() { if (entity.type === 'way') { @@ -85,7 +61,26 @@ iD.modes.Select = function (entity) { }); if (entity.type === 'way') { - target.call(dragWay); + var history = mode.history, + projection = mode.map.projection; + + target.call(iD.behavior.drag() + .origin(function(entity) { + return projection(entity.nodes[0].loc); + }) + .on('start', function() { + history.perform(iD.actions.Noop()); + }) + .on('move', function(entity) { + d3.event.sourceEvent.stopPropagation(); + history.replace( + iD.actions.MoveWay(entity.id, d3.event.dxdy, projection)); + }) + .on('end', function() { + history.replace( + iD.actions.Noop(), + 'moved a way'); + })); } mode.map.surface.on('click.browse', function () {