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

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

in progress

File size: 5.3 KB
Line 
1
2        // =====================================================================================
3        // undo.as
4        // Potlatch undo stack code
5        // =====================================================================================
6
7        // needs new hash of which nodes are in which ways
8        //              so you can undo changes to a renumbered node
9        //              also makes moving nodes faster, and enables (()) linked-node display
10
11        function UndoStack() {
12                this.sp=0;
13        };
14
15        UndoStack.prototype=new Array();
16
17        UndoStack.prototype.append=function(task,params,tooltip) {
18                // add to stack
19                if (_root.undoing) { return; }
20                this[this.sp]=new Array(task,params,tooltip); this.sp++;
21                this.setTooltip(tooltip);
22        };
23
24        UndoStack.prototype.rollback=function() {
25                if (_root.undoing) { return; }          // Stop any routines from adding to the
26                _root.undoing=true;                                     //  | undo stack
27                if (this.sp==0) { return; }
28                var popped=this[this.sp-1];                     // Same as this.pop, but works :)
29                this.sp--;                                                      //      |
30                popped[0].call(this,popped[1]);
31                if (this.sp)     { this.setTooltip(this[this.sp-1][2]); }
32                                        else { this.setTooltip(""); }
33                _root.undoing=false;                            // Permit adding to undo stack
34        };
35
36        UndoStack.prototype.setTooltip=function(str) {
37                if (str=='') {
38                        // Dim button, say "nothing to undo"
39                } else {
40                        // Light button, set tooltip to "Undo "+str+" (Z)"
41                }
42        };
43       
44        UndoStack.prototype.clear=function() { this.sp=0; };
45
46        // ---- Individual undo methods
47       
48        //              Added point into way
49        //              ** to do - add node into middle of way (shift-click)
50        //                                 including intersection variant
51
52        UndoStack.prototype.undo_addpoint=function(params) {
53                var waylist=params[0]; var poslist=params[1]; var w;
54                for (var i in waylist) {
55                        w=waylist[i];
56                        w.removeAnchorPoint(poslist[i]);
57                }
58                w.select();
59        };
60
61        //              Moved node
62       
63        UndoStack.prototype.undo_movenode=function(params) {
64                var w=moveNode(params[0],params[1],params[2]);
65                if (w) { _root.map.ways[w].select(); }
66        };
67       
68        //              Merged ways
69
70        UndoStack.prototype.undo_mergeways=function(params) {
71                var way=params[0];
72                if (way) {
73                        way.attr=params[1];
74                        way.splitWay(params[3],params[2]);
75                } else {
76                        handleError(-1,new Array("Way "+way+" cannot be found (perhaps you've panned away?) so I can't undo."));
77                        this.clear();
78                }
79        };
80
81        //              Split way
82
83        UndoStack.prototype.undo_splitway=function(params) {
84                var way1=params[0]; var way2=params[1];
85                if (way1.mergeAtCommonPoint(way2)) {
86                        way2.redraw(); way2.select();
87                } else {
88                        handleError(-1,new Array("Ways "+way1+" and "+way2+" don't share a common point any more, so I can't undo the split."));
89                        this.clear();
90                }
91        };
92
93        //              Changed tags
94        //              ** to do - relations support
95       
96        UndoStack.prototype.undo_waytags=function(params) {
97                var way=params[0]; if (!way) {
98                        handleError(-1,new Array("Way "+way+" cannot be found (perhaps you've panned away?) so I can't undo."));
99                        this.clear(); return;
100                } else {
101                        way.attr=params[1];
102                        way.redraw();
103                        way.select();
104                }
105        };
106        UndoStack.prototype.undo_pointtags=function(params) {
107                var way=params[0]; var point=params[1]; if (!way) {
108                        handleError(-1,new Array("Way "+way+" cannot be found (perhaps you've panned away?) so I can't undo."));
109                        this.clear(); return;
110                } else {
111                        way.path[point][4]=params[2];
112                        way.select(); _root.map.anchors[point].select();
113                }
114        };
115        UndoStack.prototype.undo_poitags=function(params) {
116                var poi=params[0]; if (!poi) {
117                        handleError(-1,new Array("The POI cannot be found (perhaps you've panned away?) so I can't undo."));
118                        this.clear(); return;
119                } else {
120                        poi.attr=params[1];
121                        poi.select();
122                }
123        };
124       
125        //              Removed point from way(s) (at x,y,tags if it no longer exists)
126
127        UndoStack.prototype.undo_deletepoint=function(params) {
128                var paramid=params[0]; var x=params[1]; var y=params[2]; var attr=params[3];
129                var id=undefined;
130                var qway,last;
131                // look if node is used in any other ways, take it from there if so
132                for (qway in _root.map.ways) {
133                        for (qs=0; qs<_root.map.ways[qway].path.length; qs+=1) {
134                                if (_root.map.ways[qway].path[qs][2]==paramid) {
135                                        id=paramid;
136                                        x=_root.map.ways[qway].path[qs][0];
137                                        y=_root.map.ways[qway].path[qs][1];
138                                        attr=_root.map.ways[qway].path[qs][4];
139                                }
140                        }
141                }
142                if (!id) { _root.newnodeid--; id=newnodeid; }
143                // reinstate at each place
144                var waylist=params[4];
145                var poslist=params[5];
146                var newpoint=new Array(x,y,id,1,attr,0);
147                for (qway in waylist) {
148                        _root.map.ways[waylist[qway]].path.splice(poslist[qway],0,newpoint);
149                        _root.map.ways[waylist[qway]].clean=false;
150                        _root.map.ways[waylist[qway]].redraw();
151                        last=waylist[qway];     // select last one
152                }
153                _root.map.ways[last].select();
154        };
155
156        //              Deleted way (also: Escape revert)
157        //              Merged ways and made junction
158        //              Created POI
159        //              Moved POI
160
161        UndoStack.prototype.undo_movepoi=function(params) {
162                var poi=params[0]; if (!poi) {
163                        handleError(-1,new Array("The POI cannot be found (perhaps you've panned away?) so I can't undo."));
164                        this.clear(); return;
165                } else {
166                        poi._x=params[1]; poi._y=params[2];
167                        poi.clean=false; poi.select();
168                }
169        };
170
171        //              Deleted POI
172       
173
174
175
176        // Trace stuff - not used
177        // from .append
178// _root.chat.text="Stack now "+l;
179// _root.chat.text+="\nAppended "+task+","+params;
180        // from .rollback
181// _root.chat.text="Stack was "+this.length+"\n";
182// _root.chat.text+="rollback\npopped: "+popped[0]+";"+popped[1]+";"+popped[2]+"\n";
183// _root.chat.text+="\nStack now "+this.length;
184
Note: See TracBrowser for help on using the repository browser.