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

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

Redo and undo working

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