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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user