From: Richard Fairhurst Date: Sun, 12 Jun 2011 06:59:00 +0000 (+0100) Subject: Control-drag for selection by area X-Git-Tag: 2.2~1^2~18 X-Git-Url: https://git.openstreetmap.org/potlatch2.git/commitdiff_plain/134f37ce74d58cb06770129cd9674e73f1e62956 Control-drag for selection by area --- diff --git a/net/systemeD/halcyon/connection/Way.as b/net/systemeD/halcyon/connection/Way.as index 8cefcf1a..d5f991cf 100644 --- a/net/systemeD/halcyon/connection/Way.as +++ b/net/systemeD/halcyon/connection/Way.as @@ -51,7 +51,7 @@ package net.systemeD.halcyon.connection { (edge_b>top && edge_b>top ) || deleted) { return false; } return true; } - + public function getNode(index:uint):Node { return nodes[index]; } @@ -291,5 +291,51 @@ package net.systemeD.halcyon.connection { } return null; } + + public function intersects(left:Number,right:Number,top:Number,bottom:Number):Boolean { + // simple test first: are any nodes contained? + for (var i:uint=0; i0) { + top_intersection = (m*l + c); + bottom_intersection = (m*r + c); + } else { + top_intersection = (m*r + c); + bottom_intersection = (m*l + c); + } + + if (y0toptrianglepoint ? top_intersection : toptrianglepoint; + var botoverlap:Number = bottom_intersectionb))); + } + + } } diff --git a/net/systemeD/potlatch2/controller/ControllerState.as b/net/systemeD/potlatch2/controller/ControllerState.as index e7641c3f..c9645aeb 100644 --- a/net/systemeD/potlatch2/controller/ControllerState.as +++ b/net/systemeD/potlatch2/controller/ControllerState.as @@ -94,14 +94,14 @@ package net.systemeD.potlatch2.controller { var focus:Entity = getTopLevelFocusEntity(entity); if ( paint && paint.isBackground ) { - if ( event.type == MouseEvent.MOUSE_DOWN && entity.connection is SnapshotConnection) { - if (entity is Way) { return new SelectedBackgroundWay(entity as Way); } - else if (entity is Node) { return new SelectedBackgroundNode(entity as Node, paint); } - } else if ( event.type == MouseEvent.MOUSE_DOWN && ((event.shiftKey && event.ctrlKey) || event.altKey) ) { + if (event.type == MouseEvent.MOUSE_DOWN && ((event.shiftKey && event.ctrlKey) || event.altKey) ) { // alt-click to pull data out of vector background layer var newEntity:Entity=paint.pullThrough(entity,editableLayer); - if (entity is Way) { return new SelectedWay(newEntity as Way); } + if (entity is Way ) { return new SelectedWay(newEntity as Way); } else if (entity is Node) { return new SelectedPOINode(newEntity as Node); } + } else if (event.type == MouseEvent.MOUSE_DOWN) { + if (entity is Way ) { return new SelectedBackgroundWay(entity as Way); } + else if (entity is Node) { return new SelectedBackgroundNode(entity as Node, paint); } } else if (event.type == MouseEvent.MOUSE_DOWN && entity is Marker) { return new SelectedMarker(entity as Marker, paint); } else if ( event.type == MouseEvent.MOUSE_UP ) { @@ -123,6 +123,8 @@ package net.systemeD.potlatch2.controller { return new DragSelection(selection, event); } else if (entity) { return new DragSelection([entity], event); + } else if (event.ctrlKey) { + return new SelectArea(event.localX,event.localY); } } else if ( event.type == MouseEvent.CLICK && focus == null && map.dragstate!=map.DRAGGING && this is SelectedMarker) { // this is identical to the below, but needed for unselecting markers on vector background layers. diff --git a/net/systemeD/potlatch2/controller/SelectArea.as b/net/systemeD/potlatch2/controller/SelectArea.as new file mode 100644 index 00000000..73cb2fc5 --- /dev/null +++ b/net/systemeD/potlatch2/controller/SelectArea.as @@ -0,0 +1,69 @@ +package net.systemeD.potlatch2.controller { + + import flash.display.*; + import flash.events.*; + import net.systemeD.halcyon.connection.*; + + public class SelectArea extends ControllerState { + + private var startX:Number; + private var startY:Number; + private var endX:Number; + private var endY:Number; + private var box:Shape; + private const TOLERANCE:uint=4; + + public function SelectArea(x:Number,y:Number) { + startX=endX=x; + startY=endY=y; + } + + override public function processMouseEvent(event:MouseEvent, entity:Entity):ControllerState { + if (event.type==MouseEvent.MOUSE_MOVE) { + // ** FIXME: weird things happen if you mouse-over the drag-and-drop panel + endX=event.localX; + endY=event.localY; + drawSelectionBox(); + } else if (event.type==MouseEvent.MOUSE_UP) { + // select everything within boundary + var a:Number; + if (startX>endX) { a=startX; startX=endX; endX=a; } + if (startY>endY) { a=startY; startY=endY; endY=a; } + if (endX-startX