fix regression where drawing accurately is not possible anymore, r=jorix,bbinet (closes #3272)

git-svn-id: http://svn.openlayers.org/trunk/openlayers@11962 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
Éric Lemoine
2011-05-09 09:34:19 +00:00
parent e87e1c0c57
commit fef7e4febf
4 changed files with 70 additions and 60 deletions
+16 -6
View File
@@ -35,6 +35,14 @@ OpenLayers.Handler.Path = OpenLayers.Class(OpenLayers.Handler.Point, {
*/ */
maxVertices: null, maxVertices: null,
/**
* Property: doubleTouchTolerance
* {Number} Maximum number of pixels between two touches for
* the gesture to be considered a "finalize feature" action.
* Default is 20.
*/
doubleTouchTolerance: 20,
/** /**
* Property: freehand * Property: freehand
* {Boolean} In freehand mode, the handler starts the path on mouse down, * {Boolean} In freehand mode, the handler starts the path on mouse down,
@@ -241,9 +249,9 @@ OpenLayers.Handler.Path = OpenLayers.Class(OpenLayers.Handler.Point, {
*/ */
touchstart: function(evt) { touchstart: function(evt) {
if (this.timerId && if (this.timerId &&
this.passesTolerance(this.lastTouchPx, evt.xy, this.dblclickTolerance)) { this.passesTolerance(this.lastTouchPx, evt.xy,
this.doubleTouchTolerance)) {
// double-tap, finalize the geometry // double-tap, finalize the geometry
this.lastTouchPx = evt.xy; // for up() to detect dblclick and do nothing
this.finishGeometry(); this.finishGeometry();
window.clearTimeout(this.timerId); window.clearTimeout(this.timerId);
this.timerId = null; this.timerId = null;
@@ -277,7 +285,9 @@ OpenLayers.Handler.Path = OpenLayers.Class(OpenLayers.Handler.Point, {
if(this.freehandMode(evt)) { if(this.freehandMode(evt)) {
stopDown = true; stopDown = true;
} }
if (!this.touch && (!this.lastDown || !this.passesTolerance(this.lastDown, evt.xy, this.pixelTolerance))) { if (!this.touch && (!this.lastDown ||
!this.passesTolerance(this.lastDown, evt.xy,
this.pixelTolerance))) {
this.modifyFeature(evt.xy, !!this.lastUp); this.modifyFeature(evt.xy, !!this.lastUp);
} }
this.mouseDown = true; this.mouseDown = true;
@@ -323,13 +333,13 @@ OpenLayers.Handler.Path = OpenLayers.Class(OpenLayers.Handler.Point, {
* {Boolean} Allow event propagation * {Boolean} Allow event propagation
*/ */
up: function (evt) { up: function (evt) {
if (this.mouseDown && (!this.lastUp || !this.passesTolerance( if (this.mouseDown && (!this.lastUp || !this.lastUp.equals(evt.xy))) {
this.lastUp, evt.xy, this.dblclickTolerance))) {
if(this.stoppedDown && this.freehandMode(evt)) { if(this.stoppedDown && this.freehandMode(evt)) {
this.removePoint(); this.removePoint();
this.finalize(); this.finalize();
} else { } else {
if (this.passesTolerance(this.lastDown, evt.xy, this.pixelTolerance)) { if (this.passesTolerance(this.lastDown, evt.xy,
this.pixelTolerance)) {
if (this.touch) { if (this.touch) {
this.modifyFeature(evt.xy); this.modifyFeature(evt.xy);
} }
+2 -14
View File
@@ -106,13 +106,6 @@ OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, {
*/ */
pixelTolerance: 5, pixelTolerance: 5,
/**
* APIProperty: dblclickTolerance
* {Number} Maximum number of pixels between two touchend for an
* event to be considered a dblclick. Default is 20.
*/
dblclickTolerance: 20,
/** /**
* Property: touch * Property: touch
* {Boolean} Indcates the support of touch events. * {Boolean} Indcates the support of touch events.
@@ -526,8 +519,7 @@ OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, {
return true; return true;
} }
// ignore double-clicks // ignore double-clicks
if (this.lastUp && this.passesTolerance(this.lastUp, evt.xy, if (this.lastUp && this.lastUp.equals(evt.xy)) {
this.dblclickTolerance)) {
return true; return true;
} }
if (this.lastDown && this.passesTolerance(this.lastDown, evt.xy, if (this.lastDown && this.passesTolerance(this.lastDown, evt.xy,
@@ -564,13 +556,9 @@ OpenLayers.Handler.Point = OpenLayers.Class(OpenLayers.Handler, {
/** /**
* Method: passesTolerance * Method: passesTolerance
* Determine whether the event is within the optional pixel tolerance. * Determine whether the event is within the optional pixel tolerance.
* Note that the pixel tolerance check only works if mousedown events get
* to the listeners registered here. If they are stopped by other
* elements, <pixelTolerance> and <dblclickTolerance> will have no effect
* here (this method will always return true).
* *
* Returns: * Returns:
* {Boolean} The click is within the pixel tolerance (if specified). * {Boolean} The event is within the pixel tolerance (if specified).
*/ */
passesTolerance: function(pixel1, pixel2, tolerance) { passesTolerance: function(pixel1, pixel2, tolerance) {
var passes = true; var passes = true;
+36 -30
View File
@@ -179,8 +179,7 @@
} }
}, },
{ {
pixelTolerance: 0, pixelTolerance: 0
dblclickTolerance: 0
}); });
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -577,10 +576,10 @@
// added here each a non-working sequence is found. // added here each a non-working sequence is found.
// //
// stopDown:true, stopUp:true // stopDown:true, stopUp:true, pixelTolerance:1
// a) click on (0, 0) // a) click on (0, 0)
// b) mousedown on (0.5, 0.5) // b) mousedown on (1, 1)
// c) mouseup on (1, 1) // c) mouseup on (2, 2)
// d) dblclick on (10, 10) // d) dblclick on (10, 10)
function test_sequence1(t) { function test_sequence1(t) {
t.plan(1); t.plan(1);
@@ -595,7 +594,7 @@
var control = new OpenLayers.Control({}); var control = new OpenLayers.Control({});
var handler = new OpenLayers.Handler.Path(control, var handler = new OpenLayers.Handler.Path(control,
{done: function(g) { log.geometry = g; }}, {done: function(g) { log.geometry = g; }},
{stopDown: true, stopUp: true} {stopDown: true, stopUp: true, pixelTolerance: 1}
); );
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -611,16 +610,16 @@
{type: "mousedown", xy: new OpenLayers.Pixel(0, 0)}); {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
handler.mouseup( handler.mouseup(
{type: "mouseup", xy: new OpenLayers.Pixel(0, 0)}); {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
// b) mousedown on (0.5, 0.5) // b) mousedown on (1, 1)
handler.mousemove(
{type: "mousemove", xy: new OpenLayers.Pixel(0.5, 0.5)});
handler.mousedown(
{type: "mousedown", xy: new OpenLayers.Pixel(0.5, 0.5)});
// c) mouseup on (1, 1)
handler.mousemove( handler.mousemove(
{type: "mousemove", xy: new OpenLayers.Pixel(1, 1)}); {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
handler.mousedown(
{type: "mousedown", xy: new OpenLayers.Pixel(1, 1)});
// c) mouseup on (2, 2)
handler.mousemove(
{type: "mousemove", xy: new OpenLayers.Pixel(2, 2)});
handler.mouseup( handler.mouseup(
{type: "mouseup", xy: new OpenLayers.Pixel(1, 1)}); {type: "mouseup", xy: new OpenLayers.Pixel(2, 2)});
// d) dblclick on (10, 10) // d) dblclick on (10, 10)
handler.mousemove( handler.mousemove(
{type: "mousemove", xy: new OpenLayers.Pixel(10, 10)}); {type: "mousemove", xy: new OpenLayers.Pixel(10, 10)});
@@ -637,10 +636,10 @@
]), "geometry is correct"); ]), "geometry is correct");
} }
// stopDown:false, stopUp:false // stopDown:false, stopUp:false, pixelTolerance:1
// a) click on (0, 0) // a) click on (0, 0)
// b) mousedown on (0.5, 0.5) // b) mousedown on (1, 1)
// c) mouseup on (1, 1) // c) mouseup on (2, 2)
// d) dblclick on (10, 10) // d) dblclick on (10, 10)
function test_sequence2(t) { function test_sequence2(t) {
t.plan(1); t.plan(1);
@@ -655,7 +654,7 @@
var control = new OpenLayers.Control({}); var control = new OpenLayers.Control({});
var handler = new OpenLayers.Handler.Path(control, var handler = new OpenLayers.Handler.Path(control,
{done: function(g) { log.geometry = g; }}, {done: function(g) { log.geometry = g; }},
{stopDown: false, stopUp: false} {stopDown: false, stopUp: false, pixelTolerance: 1}
); );
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -671,16 +670,16 @@
{type: "mousedown", xy: new OpenLayers.Pixel(0, 0)}); {type: "mousedown", xy: new OpenLayers.Pixel(0, 0)});
handler.mouseup( handler.mouseup(
{type: "mouseup", xy: new OpenLayers.Pixel(0, 0)}); {type: "mouseup", xy: new OpenLayers.Pixel(0, 0)});
// b) mousedown on (0.5, 0.5) // b) mousedown on (1, 1)
handler.mousemove(
{type: "mousemove", xy: new OpenLayers.Pixel(0.5, 0.5)});
handler.mousedown(
{type: "mousedown", xy: new OpenLayers.Pixel(0.5, 0.5)});
// c) mouseup on (1, 1)
handler.mousemove( handler.mousemove(
{type: "mousemove", xy: new OpenLayers.Pixel(1, 1)}); {type: "mousemove", xy: new OpenLayers.Pixel(1, 1)});
handler.mousedown(
{type: "mousedown", xy: new OpenLayers.Pixel(1, 1)});
// c) mouseup on (2, 2)
handler.mousemove(
{type: "mousemove", xy: new OpenLayers.Pixel(2, 2)});
handler.mouseup( handler.mouseup(
{type: "mouseup", xy: new OpenLayers.Pixel(1, 1)}); {type: "mouseup", xy: new OpenLayers.Pixel(2, 2)});
// d) dblclick on (10, 10) // d) dblclick on (10, 10)
handler.mousemove( handler.mousemove(
{type: "mousemove", xy: new OpenLayers.Pixel(10, 10)}); {type: "mousemove", xy: new OpenLayers.Pixel(10, 10)});
@@ -714,8 +713,7 @@
var control = new OpenLayers.Control({}); var control = new OpenLayers.Control({});
var handler = new OpenLayers.Handler.Path(control, {}, var handler = new OpenLayers.Handler.Path(control, {},
{ {
pixelTolerance: 0, pixelTolerance: 0
dblclickTolerance: 0
}); });
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -819,7 +817,7 @@
// a) tap // a) tap
// c) doubletap // c) doubletap
function test_touch_sequence1(t) { function test_touch_sequence1(t) {
t.plan(17); t.plan(19);
// set up // set up
@@ -841,7 +839,7 @@
log = {type: 'modify', geometry: g, feature: f}; log = {type: 'modify', geometry: g, feature: f};
} }
}, { }, {
dblclickTolerance: 2 doubleTouchTolerance: 2
}); });
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -888,6 +886,10 @@
new OpenLayers.Geometry.Point(-149, 75), // (1, 0) new OpenLayers.Geometry.Point(-149, 75), // (1, 0)
new OpenLayers.Geometry.Point(-140, 65) // (10, 10) new OpenLayers.Geometry.Point(-140, 65) // (10, 10)
]), "[touchstart] final geometry is correct"); ]), "[touchstart] final geometry is correct");
log = null;
ret = handler.touchend({});
t.ok(ret, '[touchend] event propagates');
t.eq(log, null, '[touchend] feature not finalized or modified');
// tear down // tear down
@@ -898,7 +900,7 @@
// b) tap-move // b) tap-move
// c) doubletap // c) doubletap
function test_touch_sequence2(t) { function test_touch_sequence2(t) {
t.plan(23); t.plan(25);
// set up // set up
@@ -920,7 +922,7 @@
log = {type: 'modify', geometry: g, feature: f}; log = {type: 'modify', geometry: g, feature: f};
} }
}, { }, {
dblclickTolerance: 2 doubleTouchTolerance: 2
}); });
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -979,6 +981,10 @@
new OpenLayers.Geometry.Point(-149, 75), // (1, 0) new OpenLayers.Geometry.Point(-149, 75), // (1, 0)
new OpenLayers.Geometry.Point(-140, 65) // (10, 10) new OpenLayers.Geometry.Point(-140, 65) // (10, 10)
]), "[touchstart] final geometry is correct"); ]), "[touchstart] final geometry is correct");
log = null;
ret = handler.touchend({});
t.ok(ret, '[touchend] event propagates');
t.eq(log, null, '[touchend] feature not finalized or modified');
// tear down // tear down
+16 -10
View File
@@ -170,8 +170,7 @@
} }
}, },
{ {
pixelTolerance: 0, pixelTolerance: 0
dblclickTolerance: 0
}); });
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -563,8 +562,7 @@
OpenLayers.Handler.Polygon, OpenLayers.Handler.Polygon,
{handlerOptions: { {handlerOptions: {
holeModifier: "altKey", holeModifier: "altKey",
pixelTolerance: 0, pixelTolerance: 0
dblclickTolerance: 0
}} }}
); );
map.addControl(draw); map.addControl(draw);
@@ -780,7 +778,7 @@
var handler = new OpenLayers.Handler.Polygon(control, var handler = new OpenLayers.Handler.Polygon(control,
{done: function(g) { log.geometry = g; }}, {done: function(g) { log.geometry = g; }},
{stopDown: true, stopUp: true, {stopDown: true, stopUp: true,
pixelTolerance: 0, dblclickTolerance: 0} pixelTolerance: 0}
); );
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -852,7 +850,7 @@
var handler = new OpenLayers.Handler.Polygon(control, var handler = new OpenLayers.Handler.Polygon(control,
{done: function(g) { log.geometry = g; }}, {done: function(g) { log.geometry = g; }},
{stopDown: false, stopUp: false, {stopDown: false, stopUp: false,
pixelTolerance: 0, dblclickTolerance: 0} pixelTolerance: 0}
); );
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -908,7 +906,7 @@
// b) tap // b) tap
// c) doubletap // c) doubletap
function test_touch_sequence1(t) { function test_touch_sequence1(t) {
t.plan(24); t.plan(26);
// set up // set up
@@ -930,7 +928,7 @@
log = {type: 'modify', geometry: g, feature: f}; log = {type: 'modify', geometry: g, feature: f};
} }
}, { }, {
dblclickTolerance: 2 doubleTouchTolerance: 2
}); });
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -994,6 +992,10 @@
new OpenLayers.Geometry.Point(-140, 65) // (10, 10) new OpenLayers.Geometry.Point(-140, 65) // (10, 10)
]) ])
]), "[touchstart] geometry is correct"); ]), "[touchstart] geometry is correct");
log = null;
ret = handler.touchend({});
t.ok(ret, '[touchend] event propagates');
t.eq(log, null, '[touchend] feature not finalized or modified');
// tear down // tear down
@@ -1005,7 +1007,7 @@
// c) tap // c) tap
// d) doubletap // d) doubletap
function test_touch_sequence2(t) { function test_touch_sequence2(t) {
t.plan(30); t.plan(32);
// set up // set up
@@ -1027,7 +1029,7 @@
log = {type: 'modify', geometry: g, feature: f}; log = {type: 'modify', geometry: g, feature: f};
} }
}, { }, {
dblclickTolerance: 2 doubleTouchTolerance: 2
}); });
control.handler = handler; control.handler = handler;
map.addControl(control); map.addControl(control);
@@ -1103,6 +1105,10 @@
new OpenLayers.Geometry.Point(-140, 65) // (10, 10) new OpenLayers.Geometry.Point(-140, 65) // (10, 10)
]) ])
]), "[touchstart] geometry is correct"); ]), "[touchstart] geometry is correct");
log = null;
ret = handler.touchend({});
t.ok(ret, '[touchend] event propagates');
t.eq(log, null, '[touchend] feature not finalized or modified');
// tear down // tear down