8
|
1 define([ "dojo/_base/declare", "ol", "dojo/Evented" ], function(declare, ol,
|
|
2 Evented) {
|
|
3
|
|
4 var peekFirstFeature = function(map, coordinate, pixel) {
|
|
5 return map.forEachFeatureAtPixel(function(ft, layer) {
|
|
6 return ft;
|
|
7 });
|
|
8 };
|
|
9
|
|
10 var cls = declare([ ol.interaction.Pointer ], {
|
|
11 "-chains-" : {
|
|
12 constructor : "manual"
|
|
13 },
|
|
14
|
|
15 _peek : null,
|
|
16
|
|
17 _feature : null,
|
|
18
|
|
19 _coordinate : null,
|
|
20
|
|
21 cursor : "pointer",
|
|
22
|
|
23 _oldCursor : undefined,
|
|
24
|
|
25 /**
|
|
26 * Создает новый объект
|
|
27 *
|
|
28 * @param {Object}
|
|
29 * opts опции
|
|
30 * @param {Function}
|
|
31 * opts.peek Функция выбора фичи для перетаскивания
|
|
32 * function(map,coordinate,pixel), возвращает фичу
|
|
33 * @param {String}
|
|
34 * opts.cursor css курсор который будет использован при
|
|
35 * наведении и перетаскивании фичи
|
|
36 *
|
|
37 */
|
|
38 constructor : function(opts) {
|
|
39
|
|
40 ol.interaction.Pointer.apply(this, [{
|
|
41 handleDownEvent : this.handleDownEvent,
|
|
42 handleDragEvent : this.handleDragEvent,
|
|
43 handleMoveEvent : this.handleMoveEvent,
|
|
44 handleUpEvent : this.handleUpEvent
|
|
45 }]);
|
|
46 Evented.apply(this);
|
|
47
|
|
48 if (opts) {
|
|
49 if (opts.peek) {
|
|
50 this._peek = opts.peek;
|
|
51 } else {
|
|
52 this._peek = peekFirstFeature;
|
|
53 }
|
|
54 if ("cursor" in opts)
|
|
55 this.cursor = opts.cursor;
|
|
56 }
|
|
57 },
|
|
58
|
|
59 handleDownEvent : function(evt) {
|
|
60 var c = evt.coordinate;
|
|
61
|
|
62 var ft = this._peek(evt.map, c, evt.pixel);
|
|
63
|
|
64 if (ft) {
|
|
65 this._feature = ft;
|
|
66 this._coordinate = c;
|
|
67 this._emit("dragbegin", { feature : ft });
|
|
68 return true;
|
|
69 }
|
|
70
|
|
71 return false;
|
|
72 },
|
|
73
|
|
74 handleDragEvent : function(evt) {
|
|
75 var c1 = this._coordinate, c2 = evt.coordinate;
|
|
76
|
|
77 var dx = c2[0] - c1[0];
|
|
78 var dy = c2[1] - c1[1];
|
|
79
|
|
80 this._emit("dragging", { feature : this._feature, fromCoord : c1, toCoord : c2 });
|
|
81
|
|
82 this._feature.getGeometry().translate(dx, dy);
|
|
83
|
|
84 this._coordinate = c2;
|
|
85 },
|
|
86
|
|
87 handleUpEvent : function(evt) {
|
|
88 if (this._feature)
|
|
89 this._emit("dragend", { feature : this._feature });
|
|
90
|
|
91 this._feature = null;
|
|
92 this._coordinate = null;
|
|
93 return false;
|
|
94 },
|
|
95
|
|
96 handleMoveEvent : function(evt) {
|
|
97 if (this.cursor) {
|
|
98 var ft = this._feature || this._peek(evt.map, evt.coordinate , evt.pixel);
|
|
99
|
|
100 var element = evt.map.getTargetElement();
|
|
101 if (ft) {
|
|
102 if (element.style.cursor != this.cursor) {
|
|
103 this._oldCursor = element.style.cursor;
|
|
104 element.style.cursor = this.cursor;
|
|
105 }
|
|
106 } else if (this._oldCursor !== undefined) {
|
|
107 element.style.cursor = this._oldCursor;
|
|
108 this._oldCursor = undefined;
|
|
109 }
|
|
110 }
|
|
111 },
|
|
112
|
|
113 _emit : function(name, data) {
|
|
114 var evt = new ol.source.VectorEvent(name,this);
|
|
115
|
|
116 for(var p in data)
|
|
117 evt[p] = data[p];
|
|
118 this.dispatchEvent(evt);
|
|
119 }
|
|
120 });
|
|
121
|
|
122 return cls;
|
|
123 }); |