Merge pull request #5261 from giohappy/master
add finishCondition to ol.interaction.Draw
This commit is contained in:
@@ -2585,6 +2585,7 @@ olx.interaction.DragZoomOptions.prototype.out;
|
|||||||
* type: ol.geom.GeometryType,
|
* type: ol.geom.GeometryType,
|
||||||
* maxPoints: (number|undefined),
|
* maxPoints: (number|undefined),
|
||||||
* minPoints: (number|undefined),
|
* minPoints: (number|undefined),
|
||||||
|
* finishCondition: (ol.events.ConditionType|undefined),
|
||||||
* style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
|
* style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
|
||||||
* geometryFunction: (ol.interaction.DrawGeometryFunctionType|undefined),
|
* geometryFunction: (ol.interaction.DrawGeometryFunctionType|undefined),
|
||||||
* geometryName: (string|undefined),
|
* geometryName: (string|undefined),
|
||||||
@@ -2659,6 +2660,15 @@ olx.interaction.DrawOptions.prototype.maxPoints;
|
|||||||
olx.interaction.DrawOptions.prototype.minPoints;
|
olx.interaction.DrawOptions.prototype.minPoints;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
|
||||||
|
* to indicate whether the drawing can be finished.
|
||||||
|
* @type {ol.events.ConditionType|undefined}
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
olx.interaction.DrawOptions.prototype.finishCondition;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Style for sketch features.
|
* Style for sketch features.
|
||||||
* @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
|
* @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
|
||||||
|
|||||||
@@ -160,6 +160,13 @@ ol.interaction.Draw = function(options) {
|
|||||||
*/
|
*/
|
||||||
this.maxPoints_ = options.maxPoints ? options.maxPoints : Infinity;
|
this.maxPoints_ = options.maxPoints ? options.maxPoints : Infinity;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A function to decide if a potential finish coordinate is permissable
|
||||||
|
* @private
|
||||||
|
* @type {ol.events.ConditionType}
|
||||||
|
*/
|
||||||
|
this.finishCondition_ = options.finishCondition ? options.finishCondition : goog.functions.TRUE;
|
||||||
|
|
||||||
var geometryFunction = options.geometryFunction;
|
var geometryFunction = options.geometryFunction;
|
||||||
if (!geometryFunction) {
|
if (!geometryFunction) {
|
||||||
if (this.type_ === ol.geom.GeometryType.CIRCLE) {
|
if (this.type_ === ol.geom.GeometryType.CIRCLE) {
|
||||||
@@ -404,7 +411,9 @@ ol.interaction.Draw.handleUpEvent_ = function(event) {
|
|||||||
} else if (this.mode_ === ol.interaction.DrawMode.CIRCLE) {
|
} else if (this.mode_ === ol.interaction.DrawMode.CIRCLE) {
|
||||||
this.finishDrawing();
|
this.finishDrawing();
|
||||||
} else if (this.atFinish_(event)) {
|
} else if (this.atFinish_(event)) {
|
||||||
this.finishDrawing();
|
if (this.finishCondition_(event)) {
|
||||||
|
this.finishDrawing();
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
this.addToDrawing_(event);
|
this.addToDrawing_(event);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -333,6 +333,55 @@ describe('ol.interaction.Draw', function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('drawing with a finishCondition', function() {
|
||||||
|
beforeEach(function() {
|
||||||
|
var draw = new ol.interaction.Draw({
|
||||||
|
source: source,
|
||||||
|
type: ol.geom.GeometryType.LINE_STRING,
|
||||||
|
finishCondition: function(event) {
|
||||||
|
if (ol.array.equals(event.coordinate,[30,-20])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
map.addInteraction(draw);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('draws a linestring failing to finish it first, the finishes it', function() {
|
||||||
|
var features;
|
||||||
|
|
||||||
|
// first point
|
||||||
|
simulateEvent('pointermove', 10, 20);
|
||||||
|
simulateEvent('pointerdown', 10, 20);
|
||||||
|
simulateEvent('pointerup', 10, 20);
|
||||||
|
|
||||||
|
// second point
|
||||||
|
simulateEvent('pointermove', 40, 30);
|
||||||
|
simulateEvent('pointerdown', 40, 30);
|
||||||
|
simulateEvent('pointerup', 40, 30);
|
||||||
|
|
||||||
|
// try to finish on this point
|
||||||
|
simulateEvent('pointerdown', 40, 30);
|
||||||
|
simulateEvent('pointerup', 40, 30);
|
||||||
|
|
||||||
|
features = source.getFeatures();
|
||||||
|
expect(features).to.have.length(0);
|
||||||
|
|
||||||
|
// third point
|
||||||
|
simulateEvent('pointermove', 30, 20);
|
||||||
|
simulateEvent('pointerdown', 30, 20);
|
||||||
|
simulateEvent('pointerup', 30, 20);
|
||||||
|
|
||||||
|
// finish on this point
|
||||||
|
simulateEvent('pointerdown', 30, 20);
|
||||||
|
simulateEvent('pointerup', 30, 20);
|
||||||
|
|
||||||
|
features = source.getFeatures();
|
||||||
|
expect(features).to.have.length(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('drawing multi-linestrings', function() {
|
describe('drawing multi-linestrings', function() {
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
@@ -811,6 +860,7 @@ describe('ol.interaction.Draw', function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
goog.require('ol.array');
|
||||||
goog.require('ol.events');
|
goog.require('ol.events');
|
||||||
goog.require('ol.Feature');
|
goog.require('ol.Feature');
|
||||||
goog.require('ol.Map');
|
goog.require('ol.Map');
|
||||||
|
|||||||
Reference in New Issue
Block a user