From fcdddca621c2a741993600729e88b679e8dbe0b7 Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Mon, 17 May 2010 10:27:03 +0000 Subject: [PATCH] remove node from this way only, and some fixes --- TODO.txt | 3 -- .../potlatch2/controller/ControllerState.as | 15 ++++++-- .../potlatch2/controller/DragWayNode.as | 12 +++--- net/systemeD/potlatch2/controller/DrawWay.as | 2 +- .../potlatch2/controller/SelectedWay.as | 17 ++++----- .../potlatch2/controller/SelectedWayNode.as | 37 ++++++++++++------- 6 files changed, 51 insertions(+), 35 deletions(-) diff --git a/TODO.txt b/TODO.txt index 3269cfc0..aca15f2e 100644 --- a/TODO.txt +++ b/TODO.txt @@ -4,7 +4,6 @@ Potlatch 2: main outstanding issues == Core geometry == * Undo/redo: split -* Remove node from this way only (will require SelectedWayNode to become aware of currently selected index) * Bit more work required on relations when splitting ways @@ -40,8 +39,6 @@ Potlatch 2: main outstanding issues * CSS editing * Toolbox fixes (see comments in file) * Quick-search on add-relations-to-way dialog (RelationSelectPanel) -* Bug: when drawing a way, delete should delete the previous node ("unzipping" way) -* Bug: when way highlighted, then junction node clicked, sometimes other way is selected (lowest osm_id?) * Bug: when drawing way, escape ends drawing. Should revert to previous way. * Mouse icon should indicate when a join is being made (blue nodes might not be visible) * Bug: when joining way to existing, a blue node is shown until mouse moves diff --git a/net/systemeD/potlatch2/controller/ControllerState.as b/net/systemeD/potlatch2/controller/ControllerState.as index 8d586ec5..23946f43 100644 --- a/net/systemeD/potlatch2/controller/ControllerState.as +++ b/net/systemeD/potlatch2/controller/ControllerState.as @@ -59,12 +59,12 @@ package net.systemeD.potlatch2.controller { } else if ( focus is Node ) { // select POI node return new DragPOINode(entity as Node,event,false); -// } else if ( entity is Node && selectedWay && entity.hasParent(selectedWay) ) { -// // select node within this way -// return new DragWayNode(selectedWay, Node(entity), event, false); + } else if ( entity is Node && selectedWay && entity.hasParent(selectedWay) ) { + // select node within this way + return new DragWayNode(selectedWay, getNodeIndex(selectedWay,entity as Node), event, false); } else if ( entity is Node && focus is Way ) { // select way node - return new DragWayNode(focus as Way,entity as Node,event,false); + return new DragWayNode(focus as Way, getNodeIndex(focus as Way,entity as Node), event, false); } } else if ( event.type == MouseEvent.MOUSE_UP && focus == null && map.dragstate!=map.DRAGGING ) { return new NoSelection(); @@ -97,6 +97,13 @@ package net.systemeD.potlatch2.controller { return null; } + protected function getNodeIndex(way:Way,node:Node):uint { + for (var i:uint=0; i= 0 ) { @@ -94,12 +93,12 @@ package net.systemeD.potlatch2.controller { var undo:Function = MainUndoStack.getGlobalStack().addAction; // find common point - if (way1 == way2) { return false; } + if (way1 == way2) { return this; } if (way1.getNode(0) ==way2.getNode(0) ) { way1.mergeWith(way2,0,0,undo); } else if (way1.getNode(0) ==way2.getLastNode()) { way1.mergeWith(way2,0,way2.length-1,undo); } else if (way1.getLastNode()==way2.getNode(0) ) { way1.mergeWith(way2,way1.length-1,0,undo); } else if (way1.getLastNode()==way2.getLastNode()) { way1.mergeWith(way2,way1.length-1,way2.length-1,undo); } - return true; + return new SelectedWay(way1); } public function deleteWay():ControllerState { diff --git a/net/systemeD/potlatch2/controller/SelectedWayNode.as b/net/systemeD/potlatch2/controller/SelectedWayNode.as index 551db6b0..502644b0 100644 --- a/net/systemeD/potlatch2/controller/SelectedWayNode.as +++ b/net/systemeD/potlatch2/controller/SelectedWayNode.as @@ -7,22 +7,25 @@ package net.systemeD.potlatch2.controller { import net.systemeD.halcyon.Globals; public class SelectedWayNode extends SelectedWay { - protected var initNode:Node; + protected var selectedIndex:int; + protected var initIndex:int; - public function SelectedWayNode(way:Way,node:Node) { + public function SelectedWayNode(way:Way,index:int) { super (way); - initNode = node; + initIndex = index; } - protected function selectNode(way:Way,node:Node):void { + protected function selectNode(way:Way,index:int):void { + var node:Node=way.getNode(index); if ( way == selectedWay && node == selectedNode ) return; clearSelection(); controller.setSelectedEntity(node); controller.map.setHighlight(way, { showNodes: true, nodeSelected: node.id }); - selectedWay = way; initWay = way; - selectedNode = node; initNode = node; + selectedWay = way; initWay = way; + selectedIndex = index; initIndex = index; + selectedNode = node; } override protected function clearSelection():void { @@ -45,7 +48,7 @@ package net.systemeD.potlatch2.controller { return new DrawWay(way, true, false); } else if ( event.type == MouseEvent.MOUSE_UP && entity is Node && focus == selectedWay ) { // select node within way - return selectOrEdit(selectedWay, Node(entity)); + return selectOrEdit(selectedWay, getNodeIndex(selectedWay,Node(entity))); } else if ( event.type == MouseEvent.MOUSE_DOWN && entity is Way && focus==selectedWay && event.shiftKey) { // insert node within way (shift-click) var d:DragWayNode=new DragWayNode(selectedWay, addNode(event), event, true); @@ -59,7 +62,8 @@ package net.systemeD.potlatch2.controller { override public function processKeyboardEvent(event:KeyboardEvent):ControllerState { switch (event.keyCode) { - case 88: return splitWay(); + case 189: return removeNode(); // '-' + case 88: return splitWay(); // 'X' case Keyboard.BACKSPACE: return deleteNode(); case Keyboard.DELETE: return deleteNode(); } @@ -67,7 +71,7 @@ package net.systemeD.potlatch2.controller { } override public function enterState():void { - selectNode(initWay,initNode); + selectNode(initWay,initIndex); Globals.vars.root.addDebug("**** -> "+this); } override public function exitState():void { @@ -79,13 +83,14 @@ package net.systemeD.potlatch2.controller { return "SelectedWayNode"; } - public static function selectOrEdit(selectedWay:Way, entity:Node):ControllerState { + public static function selectOrEdit(selectedWay:Way, index:int):ControllerState { var isFirst:Boolean = false; var isLast:Boolean = false; - isFirst = selectedWay.getNode(0) == entity; - isLast = selectedWay.getNode(selectedWay.length - 1) == entity; + var node:Node = selectedWay.getNode(index); + isFirst = selectedWay.getNode(0) == node; + isLast = selectedWay.getNode(selectedWay.length - 1) == node; if ( isFirst == isLast ) // both == looped, none == central node - return new SelectedWayNode(selectedWay, entity); + return new SelectedWayNode(selectedWay, index); else return new DrawWay(selectedWay, isLast, true); } @@ -100,6 +105,12 @@ package net.systemeD.potlatch2.controller { return new SelectedWay(selectedWay); } + public function removeNode():ControllerState { + if (selectedNode.numParentWays==1) { return deleteNode(); } + selectedWay.removeNodeByIndex(selectedIndex, MainUndoStack.getGlobalStack().addAction); + return new SelectedWay(selectedWay); + } + public function deleteNode():ControllerState { selectedNode.remove(MainUndoStack.getGlobalStack().addAction); return new SelectedWay(selectedWay); -- 2.36.1