source: gs3-extensions/map-editor/DrawingManager/index.js@ 32721

Last change on this file since 32721 was 32721, checked in by ak19, 5 years ago

Fixed selection bug and added colour, thickness and opacity change to history.

File size: 12.8 KB
Line 
1var debug = false;
2var redoPressed = false;
3var undoPressed = 0;
4var shiftKeyPressed = false;
5var dragFired = false;
6var selectionPass = true;
7var chosen;
8var enableSelectionFeature = false;
9var beingDragged = false;
10
11
12var deselectedLog = []
13var selectedShapesLog = [];
14var prevShape = [];
15var nextShape = [];
16var prevLog = [];
17var nextLog = [];
18var dragged = 0;
19var colors = ['#1E90FF', '#FF1493', '#4B0082', '#32CD32', '#FF8C00', '#000000'];
20var selectedColor;
21var colorButtons = {};
22var thicknessValue = 1;
23var opacityValue = 0.4;
24var polyOptions = {
25 fillColor: '#CA4A2F',
26 strokeWeight: thicknessValue,
27 fillOpacity: opacityValue,
28 editable: true,
29 draggable: true,
30 geodesic: false,
31};
32
33var overlays = [];
34var drawingManager;
35var selectedShape;
36var selectedShapes = [];
37
38var map = null;
39
40
41
42$(document).ready(function() {
43 //Update thickness
44 var thicknessSlider = document.getElementById("thicknessRange");
45 var thicknessSliderOutput = document.getElementById("thicknessRangeVal");
46 thicknessSliderOutput.innerHTML = thicknessSlider.value / 20;
47
48 thicknessSlider.oninput = function () {
49 thicknessSliderOutput.innerHTML = this.value / 20;
50 thicknessValue = this.value / 20;
51 polyOptions.strokeWeight = thicknessValue;
52 setSelectedThickness(thicknessValue);
53 }
54 //Update opacity
55 var opacitySlider = document.getElementById("colourOpacity");
56 var opacitySliderOutput = document.getElementById("opacityRangeVal");
57 opacitySliderOutput.innerHTML = "% " + Math.round(opacitySlider.value);
58
59 opacitySlider.oninput = function () {
60 opacityValue = this.value / 100;
61 polyOptions.fillOpacity = opacityValue;
62 opacitySliderOutput = opacityValue;
63 opacityRangeVal.innerHTML = "% " + Math.round(opacitySliderOutput * 100);
64 setSelectedOpacity(opacityValue);
65 }
66
67 document.getElementById("thicknessRange").addEventListener("mousedown", shapeSpecsChange);
68 document.getElementById("colourOpacity").addEventListener("mousedown", shapeSpecsChange);
69 document.getElementById("color-palette1").addEventListener("mousedown", shapeSpecsChange);
70});
71
72function shapeSpecsChange() {
73 if (selectedShapes.length > 0) {
74 historyOverlayPush();
75
76 }
77}
78
79function makeColorButton(color) {
80 var button = document.createElement('span');
81 button.className = 'color-buttons1';
82 button.style.backgroundColor = color;
83 google.maps.event.addDomListener(button, 'click', function () {
84 selectColor(color);
85 setSelectedShapeColor(color);
86 });
87 return button;
88}
89function buildColorPalette() {
90 var colorPalette = document.getElementById('color-palette1');
91 for (var i = 0; i < colors.length; ++i) {
92 var currColor = colors[i];
93 var colorButton = makeColorButton(currColor);
94 colorPalette.appendChild(colorButton);
95 colorButtons[currColor] = colorButton;
96 }
97 selectColor(colors[0]);
98};
99function selectColor(color) {
100 selectedColor = color;
101 for (var i = 0; i < colors.length; ++i) {
102 var currColor = colors[i];
103 colorButtons[currColor].style.border = currColor == color ? '2px solid #789' : '2px solid #fff';
104 }
105
106 // Retrieves the current options from the drawing manager and replaces the
107 // stroke or fill color as appropriate.
108 var polylineOptions = drawingManager.get('polylineOptions');
109 polylineOptions.strokeColor = color;
110 drawingManager.set('polylineOptions', polylineOptions);
111
112 var rectangleOptions = drawingManager.get('rectangleOptions');
113 rectangleOptions.fillColor = color;
114 drawingManager.set('rectangleOptions', rectangleOptions);
115
116 var circleOptions = drawingManager.get('circleOptions');
117 circleOptions.fillColor = color;
118 drawingManager.set('circleOptions', circleOptions);
119
120 var polygonOptions = drawingManager.get('polygonOptions');
121 polygonOptions.fillColor = color;
122 drawingManager.set('polygonOptions', polygonOptions);
123}
124
125function initMap() {
126
127 map = new google.maps.Map(document.getElementById('map'), {
128 center: {
129 lat: -34.397,
130 lng: 150.644
131 },
132 zoom: 2,
133 //mapTypeId: 'map'
134
135 });
136
137 drawingManager = new google.maps.drawing.DrawingManager({
138 drawingMode: google.maps.drawing.OverlayType.RECTANGLE,
139 drawingControl: true,
140 drawingControlOptions: {
141 position: google.maps.ControlPosition.TOP_CENTER,
142 drawingModes: ['marker', 'circle', 'polygon', 'polyline', 'rectangle']
143 },
144 markerOptions: {
145 draggable: true
146 },
147 circleOptions: polyOptions,
148 polylineOptions: polyOptions,
149 polygonOptions: polyOptions,
150 rectangleOptions: polyOptions,
151 });
152
153 drawingManager.setMap(map);
154
155 //overlays.push(event.overlay); // store reference to added overlay
156 google.maps.event.addListener(drawingManager, 'overlaycomplete', function (e) {
157
158 console.log(e)
159
160 historyOverlayPush();
161
162 overlays.push(e.overlay); // store reference to added overlay
163 var newShape = e.overlay;
164 newShape.type = e.type;
165
166 //historyOverlayPush();
167
168 if (e.type !== google.maps.drawing.OverlayType.MARKER) {
169 addShapeListeners(newShape,e);
170 setSelection(newShape, e);
171 } else {
172
173 addMarkerListeners(newShape,e);
174 setSelection(newShape, e);
175 }
176 });
177
178 //Clears selection if clicked on the map when shift is not presseed
179 google.maps.event.addListener(map, 'click', function () {
180 if (shiftKeyPressed == false) {
181 clearSelection();
182 if (chosen !== null) {
183 deselectedLog.push("deselected")
184 deselectedLog = [];
185 chosen = null;
186 selectedShape = null;
187
188 }
189 }
190 });
191
192 //Setting drawing tool option
193 document.addEventListener('keydown', function () {
194 //if (event.code == 'KeyX' && (event.ctrlKey || event.metaKey))
195 if (event.code == 'Digit0' || event.code == 'Numpad0' || event.code == 'Backquote') {
196 //clearSelection();
197 drawingManager.setDrawingMode(null);
198 } else if (event.code == 'Digit1') {
199 drawingManager.setDrawingMode('marker');
200 } else if (event.code == 'Digit2') {
201 drawingManager.setDrawingMode('circle');
202 } else if (event.code == 'Digit3') {
203 drawingManager.setDrawingMode('polygon');
204 } else if (event.code == 'Digit4') {
205 drawingManager.setDrawingMode('polyline');
206 } else if (event.code == 'Digit5') {
207 drawingManager.setDrawingMode('rectangle');
208 } else if (event.code == 'KeyQ') {
209 printHistory();
210 }
211 // console.log(event.code);
212 });
213
214 //Sets shift as pressed
215 document.addEventListener('keydown', function () {
216 if (event.code == 'ShiftLeft' || event.code == 'ShiftRight') {
217 shiftKeyPressed = true;
218
219 }
220
221 });
222
223 //Sets shift as unpressed
224 document.addEventListener('keyup', function () {
225 if (event.code == 'ShiftLeft' || event.code == 'ShiftRight') {
226 shiftKeyPressed = false;
227 }
228
229 });
230
231 buildColorPalette();
232}
233
234 //Deletes a vertex if clicked on it
235 function vertexAndPolyDel(e, newShape) {
236 var vertex = e.vertex;
237
238 if (e.vertex !== undefined) {
239 if (newShape.type === google.maps.drawing.OverlayType.POLYGON) {
240 var path = newShape.getPaths().getAt(e.path);
241 path.removeAt(e.vertex);
242 if (path.length < 3) {
243 newShape.setMap(null);
244 }
245 }
246 if (newShape.type === google.maps.drawing.OverlayType.POLYLINE) {
247 var path = newShape.getPath();
248 path.removeAt(e.vertex);
249 if (path.length < 2) {
250 newShape.setMap(null);
251 }
252 }
253 }
254 }
255
256function addMarkerListeners(newShape,e)
257{
258 //cLICK EVENT IF A MARKER IS CREATED
259 google.maps.event.addListener(newShape, 'click', function (e) {
260 setSelection(newShape, e);
261 });
262}
263function addShapeListeners(newShape,e)
264{
265 // Switch back to non-drawing mode after drawing a shape.
266 //drawingManager.setDrawingMode(null);
267
268 // Add an event listener that selects the newly-drawn shape when the user
269 // mouses down on it.
270 google.maps.event.addListener(newShape, 'click', function (e) {
271 vertexAndPolyDel(e, newShape);
272 console.log(e.edge);
273 });
274
275 google.maps.event.addListener(newShape, 'dragstart', function () {
276 beingDragged = true;
277 historyOverlayPush();
278 });
279
280 google.maps.event.addListener(newShape, 'dragend', function () {
281 beingDragged = false;
282 });
283
284 //Store information after the event ends
285 google.maps.event.addListener(newShape, 'bounds_changed', function () {
286 console.log("bounds_changed");
287 if (beingDragged == false){
288 historyOverlayPush();
289 }
290 });
291
292 google.maps.event.addListener(newShape, 'resize', function () {
293 console.log("lmao");
294 //historyOverlayPush();
295
296 });
297
298 //Add an event listener to select a shape if the mouse hovers over it
299 google.maps.event.addListener(newShape, 'mousedown', function (e) {
300 if (drawingManager.drawingMode == null) {
301 setSelection(newShape, e);
302 }
303 });
304}
305function clearSelection() {
306 if (selectedShape) {
307 if (selectedShape.type !== 'marker') {
308 selectedShape.setEditable(false);
309 if (shiftKeyPressed == false) {
310 for (var i = 0; i < selectedShapes.length; i++) {
311 selectedShapes[i].setEditable(false);
312 }
313 selectedShapes = [];
314 }
315 }
316 selectedShape = null;
317 }
318 }
319
320//Set selection for the selected overlay
321 function setSelection(shape, e) {
322 if (shape.type !== 'marker') {
323 if (shiftKeyPressed == false) {
324 if (e.vertex == undefined) {
325 //if ((shape.type != google.maps.drawing.OverlayType.POLYLINE)
326 //&& (shape.type != google.maps.drawing.OverlayType.POLYGON)) {
327 clearSelection();
328 shape.setEditable(true);
329 }
330 }
331 if (selectedShapes.includes(shape)) {
332
333 //shape.setEditable(false);
334 const index = selectedShapes.indexOf(shape);
335 selectedShapes.splice(index, 1);
336 } else {
337 shape.setEditable(true);
338 selectedShapes.push(shape);
339 }
340
341 if (debug) {
342 console.log(" len = " + selectedShapes.length);
343 }
344 //Send the values to be updated
345 var thi = shape.strokeWeight;
346 var opa = shape.fillOpacity;
347 var fCol = shape.fillColor;
348 var sCol = shape.strokeColor;
349 updateMenuValues(thi, opa, fCol, sCol);
350
351 } else if (shape.type == 'marker') {
352 clearSelection();
353 }
354
355 selectedShape = shape;
356
357 if (selectionPass == true) {
358
359 selectedShapesLog.push("selected", shiftKeyPressed, selectedShape);
360 nextLog.push(selectedShapesLog);
361 chosen = selectedShape;
362 selectionPass = false
363 }
364
365 var lastItem = nextLog[nextLog.length - 1];
366
367 if (chosen !== selectedShape) {
368 if (dragFired == false) {
369 selectedShapesLog.push("selected", shiftKeyPressed, selectedShape)
370 chosen = selectedShape;
371 }
372 }
373
374 //console.log(prevLog);
375 selectedShapesLog = [];
376 }
377
378//Set selected thickness
379function setSelectedThickness(sWeight) {
380 if (selectedShapes.length > 0) {
381 //historyOverlayPush();
382 for (var i = 0; i < selectedShapes.length; i++) {
383 selectedShapes[i].set('strokeWeight', sWeight);
384 //console.log(selectedShapes.length);
385 }
386 }
387}
388
389//Set selected opacity
390function setSelectedOpacity(fOpacity) {
391
392 if (selectedShapes.length > 0) {
393 for (var i = 0; i < selectedShapes.length; i++) {
394 selectedShapes[i].set('fillOpacity', fOpacity);
395 }
396 }
397}
398
399//set selected fill colour
400function setSelectedShapeColor(color) {
401 if (selectedShapes.length > 0) {
402 for (var i = 0; i < selectedShapes.length; i++) {
403 selectedShapes[i].set('fillColor', color);
404 selectedShapes[i].set('strokeColor', color);
405 }
406 }
407}
408
409function updateMenuValues(thi, opa, fCol, sCol) {
410
411 //Update thickness slider and value on the settings menu
412 var thicknessSliderOutput = document.getElementById("thicknessRangeVal");
413 thicknessSliderOutput.innerHTML = thi;
414 document.getElementById("thicknessRange").value = thi * 20;
415
416 //Update the opacity slider and value on the settings menu
417 var opacitySliderOutput = document.getElementById("opacityRangeVal");
418 opacitySliderOutput.innerHTML = "% " + opa * 100;
419 document.getElementById("colourOpacity").value = opa * 100;
420
421 if (drawingManager.drawingMode == null) {
422 selectColor(fCol);
423 }
424}
425
426function redoMovement() {
427
428 var lastItem = nextLog[nextLog.length - 1];
429 var secondToLastItem = nextLog[nextLog.length - 2];
430 var correctIndex;
431
432 if (undoPressed >= 1) {
433 correctIndex = lastItem;
434 } else {
435 correctIndex = secondToLastItem;
436 undoPressed++;
437 }
438
439 //If the history log is not empty
440 if (nextLog.length > 1) {
441 prevLog.push(lastItem);
442
443 //If undo has been pressed
444
445 if (lastItem[1] == ("polygon") || lastItem[1] == ("polyline")) {
446 selectedShape.setPath(correctIndex[2]);
447 } else {
448 selectedShape.setBounds(correctIndex[2]);
449 }
450
451 undoPressed = false;
452 redoPressed = true;
453 nextLog.pop();
454 }
455}
456
457function printHistory() {
458
459 console.log(prevOverlays);
460 console.log(selectedShapes);
461}
462
463function deleteSelectedShape() {
464 for (var i = 0; i < selectedShapes.length; i++) {
465 selectedShapes[i].setMap(null);
466 }
467 selectedShapes = [];
468}
469
470function deleteAllShape() {
471 for (var i = 0; i < overlays.length; i++) {
472 overlays[i].setMap(null);
473
474 }
475 overlays = [];
476}
477
Note: See TracBrowser for help on using the repository browser.