source: subversion/applications/editors/potlatch/anchorpoint.as @ 30679

Last change on this file since 30679 was 19959, checked in by richard, 10 years ago

make sure we're setting the way as unclean

File size: 8.8 KB
RevLine 
[6739]1
2        // =====================================================================================
3        // OOP classes - AnchorPoint
4        // click behaviour:
5        // - click and drag: move point
6        // - click (not drag) start/end point: go into draw mode extend line
7       
8        function AnchorPoint() {
[8894]9                this.way=null;
[6739]10                this.node=0;
11        };
12        AnchorPoint.prototype=new MovieClip();
13        AnchorPoint.prototype.onPress=function() {
[8894]14                removeWelcome(true);
[7604]15                var t=new Date();
[8894]16                if (this._name==0 && this.way.path.length==1) {
[6739]17                        // solo double-click - create new POI
18                        stopDrawing();
[15136]19                        _root.map.pois.attachMovie("poi",--newnodeid,++poidepth);
20                        _root.map.pois[newnodeid]._x=_root.map._xmouse;
21                        _root.map.pois[newnodeid]._y=_root.map._ymouse;
22                        _root.map.pois[newnodeid].select();
23                        _root.map.pois[newnodeid].clean=false;
[6739]24                        markClean(false);
[7718]25                        _root.undo.append(UndoStack.prototype.undo_createpoi,
[17776]26                                                          [_root.map.pois[newnodeid]],iText('action_createpoi'));
[7718]27
[11859]28                } else if (Key.isDown(Key.SHIFT) && !this.way.historic) {
[7984]29                        _root.junction=true;                            // flag to prevent elastic band stopping on _this_ mouseUp
[8894]30                        startNewWay(this.node);
[7604]31                } else if (this._name==_root.drawpoint ||
32                                  (this._name==_root.lastpoint && (t.getTime()-_root.lastpointtime)<700)) {
[6739]33                        // double-click at end of route
[7604]34                        _root.lastpoint=_root.drawpoint;        // trap triple-click
35                        _root.lastpointtime=new Date();         //  |
[6739]36                        stopDrawing();
37                } else {
38//                      _root.lastxmouse=_root._xmouse;
39//                      _root.lastymouse=_root._ymouse;
40                        _root.clicktime=new Date();
41                        this.beginDrag();
[7658]42                        this.select();
[6739]43                }
44        };
45
[7658]46        AnchorPoint.prototype.select=function() {
[8894]47                _root.panel.properties.tidy();
[7658]48                _root.panel.properties.saveAttributes();
49                _root.pointselected=this._name;
[8894]50                this.way.highlight();
[17776]51                setTypeText(iText('point'),this.node);
[16416]52                removeIconPanel();
[7658]53                _root.panel.properties.init('point',getPanelColumns(),4);
54                _root.panel.presets.init(_root.panel.properties);
55                updateButtons();
56                updateScissors(true);
[16888]57                updateInspector();
[17776]58                setTooltip(iText('hint_pointselected'),0);
[7658]59        };
60
[6739]61        AnchorPoint.prototype.beginDrag=function() {
62                this.onMouseMove=function() { this.trackDrag(); };
63                this.onMouseUp  =function() { this.endDrag();   };
64                _root.firstxmouse=_root.map._xmouse;
65                _root.firstymouse=_root.map._ymouse;
[16412]66                _root.oldx=_root.ws.path[this._name].x;
67                _root.oldy=_root.ws.path[this._name].y;
[16888]68                this.oldclean=_root.ws.path[this._name].clean;
[16412]69                clearFloater();
[6739]70        };
71
72        AnchorPoint.prototype.trackDrag=function() {
73                this._x=_root.map._xmouse;
74                this._y=_root.map._ymouse;
[16882]75                _root.ws.path[this._name].moveTo(this._x,this._y,undefined,true);
[16412]76                _root.ws.highlight();
[6739]77        };
78       
79        AnchorPoint.prototype.endDrag=function() {
[10776]80                delete this.onMouseMove;
81                delete this.onMouseUp;
[6739]82                var newx=_root.map._xmouse;
83                var newy=_root.map._ymouse;
84                var t=new Date();
85                var xdist=Math.abs(newx-_root.firstxmouse);
86                var ydist=Math.abs(newy-_root.firstymouse);
87                var longclick=(t.getTime()-_root.clicktime)>300;
88
89                if ((xdist>=tolerance   || ydist>=tolerance  ) ||
90                   ((xdist>=tolerance/2 || ydist>=tolerance/2) && longclick)) {
91                        // ==== Move existing point
[16412]92                        _root.ws.path[this._name].x=_root.oldx; // just so it's saved for undo
93                        _root.ws.path[this._name].y=_root.oldy; //  |
[7658]94                        _root.undo.append(UndoStack.prototype.undo_movenode,
[10776]95                                                          new Array(deepCopy(_root.ws.path[this._name])),
[17776]96                                                          iText('action_movepoint'));
[10776]97                        _root.ws.path[this._name].moveTo(newx,newy,undefined);
[6739]98                        _root.ws.highlightPoints(5000,"anchor");
99                        _root.ws.highlight();
[8894]100                        _root.ws.redraw();
[6739]101                        _root.ws.clean=false;
102                        markClean(false);
103
104                } else {
[16412]105                        _root.ws.path[this._name].moveTo(_root.oldx,_root.oldy,undefined);      // Return point to original position
[16888]106                        _root.ws.path[this._name].clean=this.oldclean;                                          //  | (don't make dirty)
[6739]107                        if ((this._name==0 || this._name==_root.ws.path.length-1) && !Key.isDown(17)) {
108                                // ===== Clicked at start or end of line
109                                if (_root.drawpoint==0 || _root.drawpoint==_root.ws.path.length-1) {
110                                        // - Join looping path
[8894]111                                        addEndPoint(_root.ws.path[this._name]);
[7604]112                                        _root.lastpoint=_root.drawpoint;        // trap triple-click
113                                        _root.lastpointtime=new Date();         //  |
[6739]114                                        stopDrawing();
115                                } else if (_root.drawpoint==-1) {
116                                        // - Start elastic line for adding new point
[17776]117                                        setTooltip(iText('hint_drawmode'),0);
[6739]118                                        _root.drawpoint=this._name;
119                                        this.startElastic();
120                                }
121       
122                        } else {
123                                // ===== Clicked elsewhere in line
124                                if (_root.drawpoint>-1) {
[8894]125                                        addEndPoint(_root.ws.path[this._name]);
[6739]126                                        _root.junction=true; restartElastic();
127                                }
128                        }
129                }
130        };
131
132        AnchorPoint.prototype.startElastic=function() {
133                this.onMouseMove=function() { this.trackElastic(); };
134                this.onMouseUp  =function() { this.endElastic();   };
135        };
136       
137        AnchorPoint.prototype.trackElastic=function() {
138                _root.map.elastic.clear();
[7604]139                _root.map.elastic.lineStyle(Math.min(linewidth,6),0x000000,100,false,"none");
[6739]140                _root.map.elastic.moveTo(_root.map._xmouse,_root.map._ymouse);
141                _root.map.elastic.lineTo(this._x,this._y);
142        };
143       
144        AnchorPoint.prototype.endElastic=function() {
145                if (_root.junction) { _root.junction=false; }
[10776]146                                           else { delete this.onMouseMove; 
147                                                          delete this.onMouseUp; }
[6739]148        };
149
150        function restartElastic() {
151                if (_root.drawpoint!=-1) {
152                        _root.map.anchors[_root.drawpoint].startElastic();
153                        _root.map.anchors[_root.drawpoint].trackElastic();
154                }
155        }
156
157        AnchorPoint.prototype.onRollOver=function() {
158                if (_root.drawpoint>-1) {
[8894]159                        if (this._name==0 || this._name==this.way.path.length-1) {
[6739]160                                setPointer('penso');
161                        } else {
162                                setPointer('penx');
163                        }
164                } else {
165                        setPointer('');
166                }
[14904]167                var a=getName(_root.nodes[this.node].attr,nodenames); if (a) { setFloater(a); }
[6739]168        };
[14904]169       
[16901]170        AnchorPoint.prototype.joinNodes=function() {
[19957]171
172                // First, remove any dupe nodes
173                // ** needs undo
174                var joinedways=new Object();    // Don't try and add new intersections to any ways containing these nodes
175                if (_root.nodes[this.node].isDupe()) {
176                        joinedways=_root.nodes[this.node].removeDupes(joinedways);
177                }
178
179                // Now add intersections to ways which cross
[16901]180                var t=new Object(); t.x=this._x; t.y=this._y;
181                _root.map.localToGlobal(t);
182
183                var waylist=new Array(); var poslist=new Array();
184                for (qway in _root.map.ways) {
[19957]185                        if (_root.map.ways[qway].hitTest(t.x,t.y,true) && qway!=this.way._name && !_root.nodes[this.node].ways[qway] && !joinedways[qway]) {
[16901]186                                poslist.push(_root.map.ways[qway].insertAnchorPoint(_root.nodes[this.node]));
187                                waylist.push(_root.map.ways[qway]);
188                        }
189                }
[19957]190                if (poslist.length) {
191                        _root.undo.append(UndoStack.prototype.undo_addpoint,
192                                                          new Array(waylist,poslist), iText('action_insertnode'));
193                }
194                _root.ws.redraw();
[16901]195                _root.ws.highlightPoints(5000,"anchor");
196                updateInspector();
197        };
198       
[19957]199        AnchorPoint.prototype.unjoinNodes=function() {
200                var qway,w,i,t,z;
201                t=_root.nodes[this.node];
202                if (t.numberOfWays()<2) { return; }
203
204                z=t.ways; for (qway in z) {
205                        if (qway!=_root.wayselected) {
206                                _root.newnodeid--;
207                                n=new Node(newnodeid,t.x,t.y,shallowCopy(t.attr),0); n.addWay(qway);
208                                w=_root.map.ways[qway];
209                                for (i=0; i<w.path.length; i++) {
210                                        if (w.path[i].id==this.node) {
[19959]211                                                w.path[i]=n; w.clean=false;
[19957]212                                        }
213                                }
214                        }
215                }
216                t.ways=new Object(); t.ways[_root.wayselected]=true;
217                _root.ws.redraw();
218                _root.ws.highlightPoints(5000,"anchor");
219                updateInspector();
[19959]220                markClean(false);
[19957]221        };
222       
[14904]223        AnchorPoint.prototype.onRollOut=function() { clearFloater(); };
[6739]224
225        Object.registerClass("anchor",AnchorPoint);
[15136]226        Object.registerClass("anchor_junction",AnchorPoint);
[19957]227        Object.registerClass("anchor_dupe",AnchorPoint);
[6739]228
229
230
231        // =====================================================================================
232        // OOP classes - AnchorHint
233
234        function AnchorHint() {
[8894]235                this.way=null;
[6739]236                this.node=0;
237        };
238        AnchorHint.prototype=new MovieClip();
239        AnchorHint.prototype.onRollOver=function() {
[8894]240                if (this._name==0 || this._name==this.way.path.length-1) {
[17776]241                        setTooltip(iText('hint_overendpoint',this.node));
[6739]242                        setPointer('peno');
243                } else {
[17776]244                        setTooltip(iText('hint_overpoint',this.node));
[6739]245                        setPointer('penx');
246                }
[14904]247                var a=getName(_root.nodes[this.node].attr,nodenames); if (a) { setFloater(a); }
[6739]248        };
249        AnchorHint.prototype.onRollOut=function() {
250                clearTooltip();
[14904]251                clearFloater();
[6739]252        };
253
254        AnchorHint.prototype.onPress=function() {
[11859]255                if (this.way.historic) {
[6739]256                        _root.junction=true;
257                        restartElastic(); return;       // can't merge/join to historic ways
258                }
259                var i,z;
[16882]260                if (Key.isDown(Key.SHIFT) && (this._name==0 || this._name==this.way.path.length-1)) {
[6739]261                        // Merge ways
[16882]262                        var w=this.way;
263                        addEndPoint(_root.nodes[this.node]);
264                        _root.drawpoint=-1; clearTooltip();
265                        _root.map.elastic.clear();
266                        mergeWayKeepingID(w,_root.ws);
[6739]267                } else { 
268                        // Join ways (i.e. junction)
[11040]269                        addEndPoint(_root.nodes[this.node]);
[6739]270                        _root.junction=true;                                            // flag to prevent elastic band stopping on _this_ mouseUp
271                        restartElastic();
272                }
273        };
274        Object.registerClass("anchorhint",AnchorHint);
[15136]275        Object.registerClass("anchorhint_junction",AnchorHint);
[19957]276        Object.registerClass("anchorhint_dupe",AnchorHint);
[6739]277
Note: See TracBrowser for help on using the repository browser.