source: subversion/applications/editors/potlatch/undo.as @ 14716

Last change on this file since 14716 was 12386, checked in by richard, 11 years ago

some more putway fixes - this actually creates new ways with 0.6 Potlatch now

File size: 6.8 KB
Line 
1
2        // =====================================================================================
3        // undo.as
4        // Potlatch undo stack code
5        // =====================================================================================
6
7        function UndoStack() {
8                this.sp=0;
9        };
10
11        UndoStack.prototype=new Array();
12
13        UndoStack.prototype.append=function(task,params,tooltip) {
14                // add to stack
15                if (_root.undoing) { return; }
16                this[this.sp]=new Array(task,params,tooltip); this.sp++;
17                this.setTooltip(tooltip);
18        };
19
20        UndoStack.prototype.rollback=function() {
21                if (_root.undoing) { return; }          // Stop any routines from adding to the
22                _root.undoing=true;                                     //  | undo stack
23                if (this.sp==0) { return; }
24                var popped=this[this.sp-1];                     // Same as this.pop, but works :)
25                this.sp--;                                                      //      |
26                popped[0].call(this,popped[1]);
27                if (this.sp)     { this.setTooltip(this[this.sp-1][2]); }
28                                        else { this.setTooltip(""); }
29                _root.undoing=false;                            // Permit adding to undo stack
30        };
31
32        UndoStack.prototype.setTooltip=function(str) {
33                if (str=='') {
34                        _root.panel.i_undo.onRollOver=function() { setFloater(iText("Nothing to undo",'tip_noundo')); };
35                        _root.panel.i_undo._alpha=50;
36                } else {
37                        _root.panel.i_undo.onRollOver=function() { setFloater(iText("Undo $1 (Z)",'tip_undo',str)); };
38                        _root.panel.i_undo._alpha=100;
39                }
40        };
41       
42        UndoStack.prototype.clear=function() { this.sp=0; };
43
44        // ---- Individual undo methods
45       
46        //              Added point into way
47
48        UndoStack.prototype.undo_addpoint=function(params) {
49                var waylist=params[0]; var poslist=params[1]; var w;
50                for (var i in waylist) {
51                        w=waylist[i];
52                        w.removeAnchorPoint(poslist[i]);
53                        w.clean=false;
54                }
55                w.select();
56                stopDrawing();
57        };
58
59        //              Moved node
60       
61        UndoStack.prototype.undo_movenode=function(params) {
62                var nodecopy=params[0];
63                var w=_root.nodes[nodecopy.id].moveTo(nodecopy.x,nodecopy.y,null);
64                if (w) { 
65                        _root.map.ways[w].clean=false;
66                        _root.map.ways[w].select();
67                }
68        };
69       
70        //              Merged ways
71
72        UndoStack.prototype.undo_mergeways=function(params) {
73                var way=params[0];
74                if (way) {
75                        way.attr=params[1];
76                        way.splitWay(params[3],params[2]);
77                } else {
78                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
79                        this.clear();
80                }
81        };
82
83        //              Split way
84
85        UndoStack.prototype.undo_splitway=function(params) {
86                var way1=params[0]; var way2=params[1];
87                if (way1.mergeAtCommonPoint(way2)) {
88                        way2.redraw(); way2.select();
89                } else {
90                        handleError(-1,new Array(iText("Ways $1 and $2 don't share a common point any more, so I can't undo the split.",'error_nosharedpoint',way1,way2)));
91                        this.clear();
92                }
93        };
94
95        //              Changed tags
96        //              ** to do - relations support
97       
98        UndoStack.prototype.undo_waytags=function(params) {
99                var way=params[0]; if (!way) {
100                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
101                        this.clear(); return;
102                } else {
103                        way.attr=params[1];
104                        way.clean=false;
105                        way.redraw();
106                        way.select();
107                }
108        };
109        UndoStack.prototype.undo_pointtags=function(params) {
110                var way=params[0]; var point=params[1]; if (!way) {
111                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
112                        this.clear(); return;
113                } else {
114                        way.path[point].attr=params[2];
115                        way.path[point].markDirty();
116                        way.clean=false;
117                        way.select(); _root.map.anchors[point].select();
118                }
119        };
120        UndoStack.prototype.undo_poitags=function(params) {
121                var poi=params[0]; if (!poi) {
122                        handleError(-1,new Array(iText("The POI cannot be found (perhaps you've panned away?) so I can't undo.",'error_nopoi')));
123                        this.clear(); return;
124                } else {
125                        poi.attr=params[1];
126                        poi.clean=false;
127                        poi.select();
128                }
129        };
130       
131        //              Removed point from way(s) (at x,y,tags if it no longer exists)
132
133        UndoStack.prototype.undo_deletepoint=function(params) {
134                var last;
135                var nodecopy=params[0]; var id=nodecopy.id;
136                var waylist=params[1];
137                var poslist=params[2];
138
139                // create node if no longer in existence
140                if (_root.nodes(id)) { }
141                                                else { _root.nodes[id]=new Node(id,nodecopy.x,nodecopy.y,nodecopy.attr,nodecopy.version); }
142
143                // reinstate at each place
144                for (qway in waylist) {
145                        last=waylist[qway];     // select last one
146                        _root.nodes[id].addWay(last);
147                        _root.map.ways[last].path.splice(poslist[qway],0,_root.nodes[id]);
148                        _root.map.ways[last].clean=false;
149                        _root.map.ways[last].redraw();
150                }
151                stopDrawing();
152                _root.map.ways[last].select();
153        };
154
155        //              Moved POI
156
157        UndoStack.prototype.undo_movepoi=function(params) {
158                var poi=params[0]; if (!poi) {
159                        handleError(-1,new Array(iText("The POI cannot be found (perhaps you've panned away?) so I can't undo.",'error_nopoi')));
160                        this.clear(); return;
161                } else {
162                        poi._x=params[1]; poi._y=params[2];
163                        poi.clean=false; poi.select();
164                }
165        };
166
167        //              Moved way (and any nodes used in other ways)
168
169        UndoStack.prototype.undo_movenodes=function(params) {
170                var way=params[0]; if (!way) {
171                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
172                        this.clear(); return;
173                } else {
174                        way.moveNodes(-params[1],-params[2]);
175                        way.redraw();
176                        way.select();
177                }
178        };
179
180        //              Reversed way
181
182        UndoStack.prototype.undo_reverse=function(params) {
183                var way=params[0]; if (!way) {
184                        handleError(-1,new Array(iText("Way $1 cannot be found (perhaps you've panned away?) so I can't undo.",'error_noway',way)));
185                        this.clear(); return;
186                } else {
187                        way.reverseWay();
188                }
189        };
190
191        //              Deleted POI
192
193        UndoStack.prototype.undo_deletepoi=function(params) {
194                var poi=params[0];
195                stopDrawing();
196                if (_root.map.pois[poi]) {} else {
197                        _root.map.pois.attachMovie("poi",poi,++poidepth);
198                }
199                _root.map.pois[poi]._x=params[1];
200                _root.map.pois[poi]._y=params[2];
201                _root.map.pois[poi].attr=params[3];
202                _root.map.pois[poi].select();
203                _root.map.pois[poi].clean=false;
204                markClean(false);
205        };
206       
207        //              Deleted way
208
209        UndoStack.prototype.undo_deleteway=function(params) {
210                var way=params[0];
211                stopDrawing();
212                _root.map.ways.attachMovie("way",way,++waydepth);
213                _root.map.ways[way]._x=params[1];
214                _root.map.ways[way]._y=params[2];
215                _root.map.ways[way].attr=params[3];
216                _root.map.ways[way].path=params[4];
217                _root.map.ways[way].redraw();
218                _root.map.ways[way].select();
219                _root.map.ways[way].clean=false;
220                markClean(false);
221        };
222
223        //              Created POI
224
225        UndoStack.prototype.undo_createpoi=function(params) {
226                poi=params[0]; poi.remove();
227                markClean(false);
228        };
229       
230        //              Created ways (e.g. parallel)
231       
232        UndoStack.prototype.undo_makeways=function(params) {
233                for (i in params) { _root.map.ways[params[i]].remove(); }
234        };
235
236
237        // Trace stuff - not used
238        // from .append
239// _root.chat.text="Stack now "+l;
240// _root.chat.text+="\nAppended "+task+","+params;
241        // from .rollback
242// _root.chat.text="Stack was "+this.length+"\n";
243// _root.chat.text+="rollback\npopped: "+popped[0]+";"+popped[1]+";"+popped[2]+"\n";
244// _root.chat.text+="\nStack now "+this.length;
245
Note: See TracBrowser for help on using the repository browser.