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

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

Potlatch 0.9

File size: 6.7 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("Nothing to undo"); };
35                        _root.panel.i_undo._alpha=50;
36                } else {
37                        _root.panel.i_undo.onRollOver=function() { setFloater("Undo "+str+" (Z)"); };
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 w=moveNode(params[0],params[1],params[2],undefined);
63                if (w) { 
64                        _root.map.ways[w].clean=false;
65                        _root.map.ways[w].select();
66                }
67        };
68       
69        //              Merged ways
70
71        UndoStack.prototype.undo_mergeways=function(params) {
72                var way=params[0];
73                if (way) {
74                        way.attr=params[1];
75                        way.splitWay(params[3],params[2]);
76                } else {
77                        handleError(-1,new Array("Way "+way+" cannot be found (perhaps you've panned away?) so I can't undo."));
78                        this.clear();
79                }
80        };
81
82        //              Split way
83
84        UndoStack.prototype.undo_splitway=function(params) {
85                var way1=params[0]; var way2=params[1];
86                if (way1.mergeAtCommonPoint(way2)) {
87                        way2.redraw(); way2.select();
88                } else {
89                        handleError(-1,new Array("Ways "+way1+" and "+way2+" don't share a common point any more, so I can't undo the split."));
90                        this.clear();
91                }
92        };
93
94        //              Changed tags
95        //              ** to do - relations support
96       
97        UndoStack.prototype.undo_waytags=function(params) {
98                var way=params[0]; if (!way) {
99                        handleError(-1,new Array("Way "+way+" cannot be found (perhaps you've panned away?) so I can't undo."));
100                        this.clear(); return;
101                } else {
102                        way.attr=params[1];
103                        way.clean=false;
104                        way.redraw();
105                        way.select();
106                }
107        };
108        UndoStack.prototype.undo_pointtags=function(params) {
109                var way=params[0]; var point=params[1]; if (!way) {
110                        handleError(-1,new Array("Way "+way+" cannot be found (perhaps you've panned away?) so I can't undo."));
111                        this.clear(); return;
112                } else {
113                        way.path[point][4]=params[2];
114                        way.clean=false;
115                        way.select(); _root.map.anchors[point].select();
116                }
117        };
118        UndoStack.prototype.undo_poitags=function(params) {
119                var poi=params[0]; if (!poi) {
120                        handleError(-1,new Array("The POI cannot be found (perhaps you've panned away?) so I can't undo."));
121                        this.clear(); return;
122                } else {
123                        poi.attr=params[1];
124                        poi.clean=false;
125                        poi.select();
126                }
127        };
128       
129        //              Removed point from way(s) (at x,y,tags if it no longer exists)
130
131        UndoStack.prototype.undo_deletepoint=function(params) {
132                var paramid=params[0]; var x=params[1]; var y=params[2]; var attr=params[3];
133                var id=undefined;
134                var qway,last;
135                // look if node is used in any other ways, take it from there if so
136                for (qway in _root.map.ways) {
137                        for (qs=0; qs<_root.map.ways[qway].path.length; qs+=1) {
138                                if (_root.map.ways[qway].path[qs][2]==paramid) {
139                                        id=paramid;
140                                        x=_root.map.ways[qway].path[qs][0];
141                                        y=_root.map.ways[qway].path[qs][1];
142                                        attr=_root.map.ways[qway].path[qs][4];
143                                }
144                        }
145                }
146                if (!id) { _root.newnodeid--; id=newnodeid; }
147                // reinstate at each place
148                var waylist=params[4];
149                var poslist=params[5];
150                var newpoint=new Array(x,y,id,1,attr,0);
151                for (qway in waylist) {
152                        _root.map.ways[waylist[qway]].path.splice(poslist[qway],0,newpoint);
153                        _root.map.ways[waylist[qway]].clean=false;
154                        _root.map.ways[waylist[qway]].redraw();
155                        last=waylist[qway];     // select last one
156                }
157                stopDrawing();
158                _root.map.ways[last].select();
159        };
160
161        //              Moved POI
162
163        UndoStack.prototype.undo_movepoi=function(params) {
164                var poi=params[0]; if (!poi) {
165                        handleError(-1,new Array("The POI cannot be found (perhaps you've panned away?) so I can't undo."));
166                        this.clear(); return;
167                } else {
168                        poi._x=params[1]; poi._y=params[2];
169                        poi.clean=false; poi.select();
170                }
171        };
172
173        //              Moved way (and any nodes used in other ways)
174
175        UndoStack.prototype.undo_movenodes=function(params) {
176                var way=params[0]; if (!way) {
177                        handleError(-1,new Array("Way "+way+" cannot be found (perhaps you've panned away?) so I can't undo."));
178                        this.clear(); return;
179                } else {
180                        way.moveNodes(-params[1],-params[2]);
181                        way.redraw();
182                        way.select();
183                }
184        };
185
186        //              Reversed way
187
188        UndoStack.prototype.undo_reverse=function(params) {
189                var way=params[0]; if (!way) {
190                        handleError(-1,new Array("Way "+way+" cannot be found (perhaps you've panned away?) so I can't undo."));
191                        this.clear(); return;
192                } else {
193                        way.reverseWay();
194                }
195        };
196
197        //              Deleted POI
198
199        UndoStack.prototype.undo_deletepoi=function(params) {
200                var poi=params[0];
201                stopDrawing();
202                if (_root.map.pois[poi]) {} else {
203                        _root.map.pois.attachMovie("poi",poi,++poidepth);
204                }
205                _root.map.pois[poi]._x=params[1];
206                _root.map.pois[poi]._y=params[2];
207                _root.map.pois[poi].attr=params[3];
208                _root.map.pois[poi].select();
209                _root.map.pois[poi].clean=false;
210                markClean(false);
211        };
212       
213        //              Deleted way
214
215        UndoStack.prototype.undo_deleteway=function(params) {
216                var way=params[0];
217                stopDrawing();
218                _root.map.ways.attachMovie("way",way,++waydepth);
219                _root.map.ways[way]._x=params[1];
220                _root.map.ways[way]._y=params[2];
221                _root.map.ways[way].attr=params[3];
222                _root.map.ways[way].path=params[4];
223                _root.map.ways[way].redraw();
224                _root.map.ways[way].select();
225                _root.map.ways[way].clean=false;
226                markClean(false);
227        };
228
229        //              Created POI
230
231        UndoStack.prototype.undo_createpoi=function(params) {
232                poi=params[0]; poi.remove();
233                markClean(false);
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.