From 6bced5bcbd54a2dd64550050f57782ba0de920c8 Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Mon, 16 May 2016 23:35:14 -0400 Subject: [PATCH] Don't try to snap new way to offscreen area (closes #3114) --- js/id/behavior/draw.js | 16 +++++++++++++--- js/id/behavior/draw_way.js | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) 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(); }