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

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

Potential fix for a history bug found after resizing rectangles and circles

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