Mercurial > pub > ImplabJs
diff src/djol/interaction/FeatureDrag.js @ 10:8705103f074f
Слияние
author | cin |
---|---|
date | Mon, 21 Aug 2017 18:03:00 +0300 |
parents | f0035923ff3e |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/djol/interaction/FeatureDrag.js Mon Aug 21 18:03:00 2017 +0300 @@ -0,0 +1,123 @@ +define([ "dojo/_base/declare", "ol", "dojo/Evented" ], function(declare, ol, + Evented) { + + var peekFirstFeature = function(map, coordinate, pixel) { + return map.forEachFeatureAtPixel(function(ft, layer) { + return ft; + }); + }; + + var cls = declare([ ol.interaction.Pointer ], { + "-chains-" : { + constructor : "manual" + }, + + _peek : null, + + _feature : null, + + _coordinate : null, + + cursor : "pointer", + + _oldCursor : undefined, + + /** + * Создает новый объект + * + * @param {Object} + * opts опции + * @param {Function} + * opts.peek Функция выбора фичи для перетаскивания + * function(map,coordinate,pixel), возвращает фичу + * @param {String} + * opts.cursor css курсор который будет использован при + * наведении и перетаскивании фичи + * + */ + constructor : function(opts) { + + ol.interaction.Pointer.apply(this, [{ + handleDownEvent : this.handleDownEvent, + handleDragEvent : this.handleDragEvent, + handleMoveEvent : this.handleMoveEvent, + handleUpEvent : this.handleUpEvent + }]); + Evented.apply(this); + + if (opts) { + if (opts.peek) { + this._peek = opts.peek; + } else { + this._peek = peekFirstFeature; + } + if ("cursor" in opts) + this.cursor = opts.cursor; + } + }, + + handleDownEvent : function(evt) { + var c = evt.coordinate; + + var ft = this._peek(evt.map, c, evt.pixel); + + if (ft) { + this._feature = ft; + this._coordinate = c; + this._emit("dragbegin", { feature : ft }); + return true; + } + + return false; + }, + + handleDragEvent : function(evt) { + var c1 = this._coordinate, c2 = evt.coordinate; + + var dx = c2[0] - c1[0]; + var dy = c2[1] - c1[1]; + + this._emit("dragging", { feature : this._feature, fromCoord : c1, toCoord : c2 }); + + this._feature.getGeometry().translate(dx, dy); + + this._coordinate = c2; + }, + + handleUpEvent : function(evt) { + if (this._feature) + this._emit("dragend", { feature : this._feature }); + + this._feature = null; + this._coordinate = null; + return false; + }, + + handleMoveEvent : function(evt) { + if (this.cursor) { + var ft = this._feature || this._peek(evt.map, evt.coordinate , evt.pixel); + + var element = evt.map.getTargetElement(); + if (ft) { + if (element.style.cursor != this.cursor) { + this._oldCursor = element.style.cursor; + element.style.cursor = this.cursor; + } + } else if (this._oldCursor !== undefined) { + element.style.cursor = this._oldCursor; + this._oldCursor = undefined; + } + } + }, + + _emit : function(name, data) { + var evt = new ol.source.VectorEvent(name,this); + + for(var p in data) + evt[p] = data[p]; + this.dispatchEvent(evt); + } + }); + + return cls; +}); \ No newline at end of file