diff --git a/js/id/behavior/draw.js b/js/id/behavior/draw.js index 9a5b59111..9abc9ab88 100644 --- a/js/id/behavior/draw.js +++ b/js/id/behavior/draw.js @@ -83,9 +83,19 @@ iD.behavior.Draw = function(context) { function click() { var d = datum(); if (d.type === 'way') { - var choice = iD.geo.chooseEdge(context.childNodes(d), context.mouse(), context.projection), - edge = [d.nodes[choice.index - 1], d.nodes[choice.index]]; - event.clickWay(choice.loc, edge); + var dims = context.map().dimensions(), + mouse = context.mouse(), + pad = 5, + trySnap = mouse[0] > pad && mouse[0] < dims[0] - pad && + mouse[1] > pad && mouse[1] < dims[1] - pad; + + if (trySnap) { + var choice = iD.geo.chooseEdge(context.childNodes(d), context.mouse(), context.projection), + edge = [d.nodes[choice.index - 1], d.nodes[choice.index]]; + event.clickWay(choice.loc, edge); + } else { + event.click(context.map().mouseCoordinates()); + } } else if (d.type === 'node') { event.clickNode(d); diff --git a/js/id/behavior/draw_way.js b/js/id/behavior/draw_way.js index bc7d1736c..5771c7147 100644 --- a/js/id/behavior/draw_way.js +++ b/js/id/behavior/draw_way.js @@ -30,9 +30,20 @@ iD.behavior.DrawWay = function(context, wayId, index, mode, baseGraph) { if (datum.type === 'node' && datum.id !== end.id) { loc = datum.loc; + } else if (datum.type === 'way' && datum.id !== segment.id) { - loc = iD.geo.chooseEdge(context.childNodes(datum), context.mouse(), context.projection).loc; - } else { + var dims = context.map().dimensions(), + mouse = context.mouse(), + pad = 5, + trySnap = mouse[0] > pad && mouse[0] < dims[0] - pad && + mouse[1] > pad && mouse[1] < dims[1] - pad; + + if (trySnap) { + loc = iD.geo.chooseEdge(context.childNodes(datum), context.mouse(), context.projection).loc; + } + } + + if (!loc) { loc = context.map().mouseCoordinates(); }