source: gs3-extensions/map-editor/DrawingManager/historyManager.js@ 32732

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

Work to eliminate a undo history bug, and fixed the selection issue.

File size: 8.3 KB
RevLine 
[32710]1var prevOverlays = [];
[32722]2var presentOverlays = [];
3var undoneOverlays = [];
[32732]4var cycleComplete = true;
[32710]5
[32721]6function undo() {
[32732]7
[32710]8 for (var i = 0; i < overlays.length; i++) {
9 overlays[i].setMap(null);
10 }
[32722]11 if (prevOverlays.length != 0) {
12 selectedShapes = [];
[32721]13 overlays = [];
[32722]14 undoneOverlaysPush();
[32721]15 var prev_overlay = prevOverlays.pop();
[32732]16
17 if (prev_overlay.length > 0) {
[32722]18 for (var i = 0; i < prev_overlay.length; i++) {
[32732]19 overlays[i] = prev_overlay[i];
20 overlays[i].setMap(map);
21 overlays[i].draggable = draggableState;
[32722]22 }
[32721]23 }
24 }
[32722]25}
26
27function redo() {
[32732]28
[32722]29 if (undoneOverlays.length != 0) {
30 selectedShapes = [];
31 for (var i = 0; i < overlays.length; i++) {
32 overlays[i].setMap(null);
33 }
[32732]34
[32722]35 overlays = [];
36 var lastEntry = undoneOverlays[undoneOverlays.length - 1];
37 for (var i = 0; i < lastEntry.length; i++) {
38 overlays[i] = lastEntry[i];
39 overlays[i].setMap(map);
[32732]40 overlays[i].draggable = draggableState;
[32722]41 }
[32732]42
43 var conditionPrevious = presentOverlays[0];
44 if (conditionPrevious !== undefined) {
45 if (conditionPrevious.length == 0) {
46 prevOverlays.push(presentOverlays[0]);
47 } else {
48 var overlays_copy = [];
49 for (var i = 0; i < presentOverlays[0].length; i++) {
50 var clone_shape = cloneShape(presentOverlays[0][i]);
51 if (overlayItemIsShape(clone_shape)) {
52 addShapeListeners(clone_shape, null);
53 } else {
54 addMarkerListeners(clone_shape, null);
55 }
56 overlays_copy[i] = clone_shape;
57 }
58 prevOverlays.push(overlays_copy);
59 }
[32722]60 }
61 presentOverlays = [];
62 presentOverlays.push(undoneOverlays[undoneOverlays.length - 1]);
63 undoneOverlays.pop();
[32721]64 }
[32710]65}
66
[32722]67function clonePath(path) {
[32710]68 var clone_path = [];
[32722]69
[32710]70 for (var i = 0; i < path.length; i++) {
71 var lati = path.getAt(i).lat();
72 var lngi = path.getAt(i).lng();
73 clone_lat_lng = {
74 lat: lati,
75 lng: lngi
76 };
77 clone_path.push(clone_lat_lng);
78 }
[32722]79
[32710]80 return clone_path;
81}
82
[32722]83function clonePolyline(polyline) {
84 var path = polyline.getPath();
85 var geodesic = polyline.geodesic;
86 var strokeColor = polyline.strokeColor;
[32710]87 var strokeOpacity = polyline.strokeOpacity;
[32722]88 var strokeWeight = polyline.strokeWeight;
89 var clone_path = clonePath(path);
[32721]90 //var editable = rect.editable;
[32722]91
[32710]92 var clone_polyline = new google.maps.Polyline({
[32722]93 geodesic: geodesic,
94 strokeColor: strokeColor,
95 strokeOpacity: strokeOpacity,
96 strokeWeight: strokeWeight,
97 path: clone_path,
[32732]98 draggable: draggableState,
[32722]99 editable: false
100 });
101
[32710]102 clone_polyline.type = google.maps.drawing.OverlayType.POLYLINE;
[32722]103
[32710]104 return clone_polyline;
105}
106
[32722]107function clonePolygon(polygon) {
108 var path = polygon.getPath();
109 var geodesic = polygon.geodesic;
110 var strokeColor = polygon.strokeColor;
[32710]111 var strokeOpacity = polygon.strokeOpacity;
[32722]112 var strokeWeight = polygon.strokeWeight;
113 var fillColor = polygon.fillColor;
114 var fillOpacity = polygon.fillOpacity;
115 var clone_path = clonePath(path);
[32721]116 //var editable = rect.editable;
[32722]117
[32710]118 var clone_polygon = new google.maps.Polygon({
[32722]119 geodesic: geodesic,
120 strokeColor: strokeColor,
121 strokeOpacity: strokeOpacity,
122 strokeWeight: strokeWeight,
123 fillColor: fillColor,
124 fillOpacity: fillOpacity,
125 path: clone_path,
[32732]126 draggable: draggableState,
[32722]127 editable: false
128 });
129
[32710]130 clone_polygon.type = google.maps.drawing.OverlayType.POLYGON;
[32722]131
[32710]132 return clone_polygon;
133}
134
[32722]135function cloneRectangle(rect) {
136 var strokeColor = rect.strokeColor;
[32710]137 var strokeOpacity = rect.strokeOpacity;
[32722]138 var strokeWeight = rect.strokeWeight;
139 var fillColor = rect.fillColor;
140 var fillOpacity = rect.fillOpacity;
141 var bounds = rect.getBounds();
[32724]142 var type = rect.type;
[32721]143 //var editable = rect.editable;
[32722]144
[32710]145 var clone_rect = new google.maps.Rectangle({
[32722]146 strokeColor: strokeColor,
147 strokeOpacity: strokeOpacity,
148 strokeWeight: strokeWeight,
149 fillColor: fillColor,
150 fillOpacity: fillOpacity,
151 bounds: bounds,
[32732]152 draggable: draggableState,
[32724]153 editable: false,
154 type: type
[32722]155 });
156
[32710]157 clone_rect.type = google.maps.drawing.OverlayType.RECTANGLE;
[32722]158
[32710]159 return clone_rect;
160}
161
[32722]162function cloneCircle(circ) {
163 var strokeColor = circ.strokeColor;
[32710]164 var strokeOpacity = circ.strokeOpacity;
[32722]165 var strokeWeight = circ.strokeWeight;
166 var fillColor = circ.fillColor;
167 var fillOpacity = circ.fillOpacity;
168 var center = circ.center;
169 var radius = circ.radius;
[32721]170 //var editable = rect.editable;
[32722]171
[32710]172 var clone_circ = new google.maps.Circle({
[32722]173 strokeColor: strokeColor,
174 strokeOpacity: strokeOpacity,
175 strokeWeight: strokeWeight,
176 fillColor: fillColor,
177 fillOpacity: fillOpacity,
178 center: center,
179 radius: radius,
[32732]180 draggable: draggableState,
[32722]181 editable: false
182 });
183
[32710]184 clone_circ.type = google.maps.drawing.OverlayType.CIRCLE;
[32722]185
[32710]186 return clone_circ;
187}
188
[32723]189function cloneMarker(marker) {
190 var position = marker.getPosition();
191 var anchorPoint = marker.anchorPoint;
[32732]192 var clone_marker = new google.maps.Marker({
193 anchorPoint: anchorPoint,
194 position: position,
195 clickable: true,
196 draggable: draggableState,
197 editable: false
198 })
199 clone_marker.type = google.maps.drawing.OverlayType.MARKER;
200
[32723]201 return clone_marker;
202}
203
[32722]204function cloneShape(shape) {
[32710]205 if (shape.type === google.maps.drawing.OverlayType.POLYLINE) {
206 var clone_polyline = clonePolyline(shape);
207 return clone_polyline;
[32722]208 } else if (shape.type === google.maps.drawing.OverlayType.POLYGON) {
[32710]209 var clone_polygon = clonePolygon(shape);
210 return clone_polygon;
[32722]211 } else if (shape.type === google.maps.drawing.OverlayType.RECTANGLE) {
[32710]212 var clone_rect = cloneRectangle(shape);
213 return clone_rect;
[32722]214
215 } else if (shape.type === google.maps.drawing.OverlayType.CIRCLE) {
[32710]216 var clone_circ = cloneCircle(shape);
217 return clone_circ;
[32722]218
219 } else {
[32723]220 var clone_marker = cloneMarker(shape);
221 return clone_marker;
[32710]222 }
223}
224
[32722]225function overlayItemIsShape(overlay_item) {
[32721]226 var type = overlay_item.type;
[32722]227
[32721]228 is_shape = (type === google.maps.drawing.OverlayType.POLYLINE)
229 || (type === google.maps.drawing.OverlayType.POLYGON)
230 || (type === google.maps.drawing.OverlayType.RECTANGLE)
231 || (type === google.maps.drawing.OverlayType.CIRCLE);
[32722]232
233 return is_shape;
[32721]234}
235
[32722]236function historyOverlayPush() {
[32732]237 if (cycleComplete) {
[32724]238 var overlays_copy = [];
239 for (var i = 0; i < overlays.length; i++) {
240 var clone_shape = cloneShape(overlays[i]);
[32732]241
[32724]242 if (overlayItemIsShape(clone_shape)) {
243 addShapeListeners(clone_shape, null); // don't have an overlay event!
244 } else {
245 addMarkerListeners(clone_shape, null); // don't have an overlay event!
246 }
247 overlays_copy[i] = clone_shape;
[32721]248 }
[32732]249 undoneOverlays = [];
250 prevOverlays.push(overlays_copy);
251 }
252
253 cycleComplete = false;
[32722]254}
255function presentOverlayPush() {
[32724]256
[32732]257 OVbeforeClearing = overlays;
258 PObeforeClearing = presentOverlays;
[32722]259 presentOverlays = [];
260 var overlays_copy = [];
261 for (var i = 0; i < overlays.length; i++) {
262 var clone_shape = cloneShape(overlays[i]);
263 if (overlayItemIsShape(clone_shape)) {
264 addShapeListeners(clone_shape, null); // don't have an overlay event!
265 } else {
266 addMarkerListeners(clone_shape, null); // don't have an overlay event!
[32721]267 }
[32710]268 overlays_copy[i] = clone_shape;
269 }
[32722]270 presentOverlays.push(overlays_copy);
[32732]271 cycleComplete = true;
272
[32710]273}
[32722]274
275function undoneOverlaysPush() {
[32732]276
[32723]277 var conditionUndone = presentOverlays[presentOverlays.length - 1] !== undefined;
[32722]278
279 if (conditionUndone) {
[32732]280 var overlays_copy = [];
281 for (var i = 0; i < presentOverlays[0].length; i++) {
282 var clone_shape = cloneShape(presentOverlays[0][i]);
283 if (overlayItemIsShape(clone_shape)) {
284 addShapeListeners(clone_shape, null); // don't have an overlay event!
285 } else {
286 addMarkerListeners(clone_shape, null); // don't have an overlay event!
287 }
288 overlays_copy[i] = clone_shape;
289 }
290 undoneOverlays.push(overlays_copy);
[32722]291 }
[32732]292
[32723]293 var conditionPresent = prevOverlays[prevOverlays.length - 1] !== undefined;
[32722]294
295 if (conditionPresent) {
[32732]296 presentOverlays = [];
297 var overlays_copy = [];
298 for (var i = 0; i < prevOverlays[prevOverlays.length - 1].length; i++) {
299 var clone_shape = cloneShape(prevOverlays[prevOverlays.length - 1][i]);
300 if (overlayItemIsShape(clone_shape)) {
301 addShapeListeners(clone_shape, null); // don't have an overlay event!
302 } else {
303 addMarkerListeners(clone_shape, null); // don't have an overlay event!
304 }
305 overlays_copy[i] = clone_shape;
306 }
307 presentOverlays.push(overlays_copy);
[32722]308 }
309}
Note: See TracBrowser for help on using the repository browser.