public var mapheight:uint; // height (Flash pixels)
public var dragstate:uint=NOT_DRAGGING; // dragging map
+ private var _draggable:Boolean=true; // |
private var lastxmouse:Number; // |
private var lastymouse:Number; // |
private var downX:Number; // |
centre_lon=coord2lon(-x+mapwidth/2);
this.dispatchEvent(new MapEvent(MapEvent.MOVE, {lat:centre_lat, lon:centre_lon, scale:scale}));
}
+
+ public function nudgeBackground(x:Number,y:Number):void {
+ this.dispatchEvent(new MapEvent(MapEvent.NUDGE_BACKGROUND, { x: x, y: y }));
+ }
// Co-ordinate conversion functions
// ------------------------------------------------------------------------------------------
// Mouse events
+ public function set draggable(draggable:Boolean):void {
+ _draggable=draggable;
+ dragstate=NOT_DRAGGING;
+ }
+
public function mouseDownHandler(event:MouseEvent):void {
+ if (!_draggable) { return; }
dragstate=NOT_MOVED;
lastxmouse=downX=mouseX;
lastymouse=downY=mouseY;
}
public function mouseMoveHandler(event:MouseEvent):void {
- if (dragstate==NOT_DRAGGING) {
- return;
- }
+ if (!_draggable) { return; }
+ if (dragstate==NOT_DRAGGING) { return; }
if (dragstate==NOT_MOVED && Math.abs(downX - mouseX) < 3 && Math.abs(downY - mouseY) < 3) {
return;
public static const RESIZE:String = "resize";
public static const MOVE:String = "move";
public static const CLICK:String = "click";
+ public static const NUDGE_BACKGROUND:String = "nudge_background";
public var params:Object;
import flash.events.*;
import flash.net.*;
import flash.system.LoaderContext;
+ import net.systemeD.halcyon.MapEvent;
public class TileSet extends Sprite {
public var tile_b:int;
public var tile_t:int;
- public var xoffset:Number=0;
- public var yoffset:Number=0;
+ private var offset_lon:Number=0;
+ private var offset_lat:Number=0;
private var requests:Array=[];
private var tiles:Object={}; // key is "z,x,y"; value "true" (needed) or reference to sprite
this.map=map;
alpha=0.5;
createSprites();
+ map.addEventListener(MapEvent.NUDGE_BACKGROUND, nudgeHandler);
}
public function init(url:String=null, update:Boolean=false):void {
baseurl=url;
tiles={};
+ offset_lon=offset_lat=x=y=0;
while (numChildren) { removeChildAt(0); }
createSprites();
if (update) { this.update(); }
for (var i:uint=map.MINSCALE; i<=map.MAXSCALE; i++) {
this.getChildAt(i-map.MINSCALE).visible=(scale==i);
}
- // ** Should also double or halve xoffset/yoffset accordingly
+ x=map.lon2coord(map.centre_lon+offset_lon)-map.lon2coord(map.centre_lon);
+ y=map.lat2coord(map.centre_lat+offset_lat)-map.lat2coord(map.centre_lat);
}
// Update bounds - called on every move
public function update():void {
if (!baseurl) { return; }
- tile_l=lon2tile(map.edge_l+xoffset);
- tile_r=lon2tile(map.edge_r+xoffset);
- tile_t=lat2tile(map.edge_t+yoffset);
- tile_b=lat2tile(map.edge_b+yoffset);
+ tile_l=lon2tile(map.edge_l-offset_lon);
+ tile_r=lon2tile(map.edge_r-offset_lon);
+ tile_t=lat2tile(map.edge_t-offset_lat);
+ tile_b=lat2tile(map.edge_b-offset_lat);
for (var tx:int=tile_l; tx<=tile_r; tx++) {
for (var ty:int=tile_t; ty<=tile_b; ty++) {
if (!tiles[map.scale+','+tx+','+ty]) { addRequest(tx,ty); }
}
+ // Update offset
+
+ public function nudgeHandler(event:MapEvent):void {
+ if (!baseurl) { return; }
+ this.x+=event.params.x; this.y+=event.params.y;
+ offset_lat=map.centre_lat-map.coord2lat(map.lat2coord(map.centre_lat)-this.y);
+ offset_lon=map.centre_lon-map.coord2lon(map.lon2coord(map.centre_lon)-this.x);
+ update();
+ }
+
// ------------------------------------------------------------------
// Co-ordinate conversion functions
<mx:Object label="OSM - Osmarender" data="http://tah.openstreetmap.org/Tiles/tile/$z/$x/$y.png" />
<mx:Object label="OSM - Maplint (errors)" data="http://tah.openstreetmap.org/Tiles/maplint/$z/$x/$y.png" />
<mx:Object label="OpenCycleMap" data="http://andy.sandbox.cloudmade.com/tiles/cycle/$z/$x/$y.png" />
+ <mx:Object label="UK: OS StreetView" data="http://os.openstreetmap.org/sv/$z/$x/$y.png" />
<mx:Object label="UK historic: 1:25k" data="http://ooc.openstreetmap.org/os1/$z/$x/$y.png" />
<mx:Object label="UK historic: 7th" data="http://ooc.openstreetmap.org/os7/$z/$x/$y.png" />
<mx:Object label="UK historic: NPE" data="http://ooc.openstreetmap.org/npe/$z/$x/$y.png" />
public var state:ControllerState;
private var _connection:Connection;
+ private var keys:Object={};
public function EditController(map:Map, tagViewer:TagViewer, toolbox:Toolbox) {
this._map = map;
map.parent.addEventListener(MouseEvent.MOUSE_UP, mapMouseEvent);
map.parent.addEventListener(MouseEvent.MOUSE_DOWN, mapMouseEvent);
map.parent.addEventListener(MouseEvent.CLICK, mapMouseEvent);
+ map.parent.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
map.parent.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
}
toolbox.setEntity(entity);
}
+ private function keyDownHandler(event:KeyboardEvent):void {
+ keys[event.keyCode]=true;
+ }
+
private function keyUpHandler(event:KeyboardEvent):void {
trace("key code "+event.keyCode);
+ if (keys[event.keyCode]) { delete keys[event.keyCode]; }
var newState:ControllerState = state.processKeyboardEvent(event);
setState(newState);
}
+ public function keyDown(key:Number):Boolean {
+ return Boolean(keys[key]);
+ }
+
private function mapMouseEvent(event:MouseEvent):void {
map.stage.focus = map.parent;
private static const token:String="f0a.sejV34HnhgIbNSmVHmndXFpijgGeun0fSIMG9428hW_ifF3pYKwbV6r9iaXojl1lU_dakekR";
private static const MAXZOOM:int=17;
+ private var _lat:Number;
+ private var _lon:Number;
+ private var _scale:Number;
+ private var offset_lat:Number=0;
+ private var offset_lon:Number=0;
+
public function Yahoo(w:Number, h:Number, map:Map) {
super();
this.init(token, w, h);
public function show():void {
this.visible=true;
- this.zoomLevel = 18-map.scale;
- this.centerLatLon = new LatLon(map.centre_lat, map.centre_lon);
+ moveto(map.centre_lat, map.centre_lon, map.scale);
this.addEventListener(YahooMapEvent.MAP_INITIALIZE, initHandler);
map.addEventListener(MapEvent.MOVE, moveHandler);
map.addEventListener(MapEvent.RESIZE, resizeHandler);
+ map.addEventListener(MapEvent.NUDGE_BACKGROUND, nudgeHandler);
}
public function hide():void {
this.removeEventListener(YahooMapEvent.MAP_INITIALIZE, initHandler);
map.removeEventListener(MapEvent.MOVE, moveHandler);
map.removeEventListener(MapEvent.RESIZE, resizeHandler);
+ map.removeEventListener(MapEvent.NUDGE_BACKGROUND, nudgeHandler);
}
private function initHandler(event:YahooMapEvent):void {
private function moveto(lat:Number,lon:Number,scale:uint):void {
if (scale>MAXZOOM) { this.visible=false; return; }
+ _lat=lat; _lon=lon; _scale=scale;
+
this.visible=true;
this.zoomLevel=18-scale;
- this.centerLatLon=new LatLon(lat, lon);
+ this.centerLatLon=new LatLon(lat+offset_lat, lon+offset_lon);
}
private function resizeHandler(event:MapEvent):void {
this.setSize(event.params.width, event.params.height);
}
+
+ private function nudgeHandler(event:MapEvent):void {
+ var cx:Number=map.lon2coord(map.centre_lon);
+ var cy:Number=map.lat2coord(map.centre_lat);
+ offset_lon+=map.coord2lon(cx-event.params.x)-map.centre_lon;
+ offset_lat+=map.coord2lat(cy-event.params.y)-map.centre_lat;
+ moveto(_lat,_lon,_scale);
+ }
}
-}
\ No newline at end of file
+}
protected function sharedKeyboardEvents(event:KeyboardEvent):ControllerState {
switch (event.keyCode) {
- case 90: MainUndoStack.getGlobalStack().undo(); return null; // Z
+ case 68: controller.map.paint.alpha=1.3-controller.map.paint.alpha; return null; // D
+ case 90: MainUndoStack.getGlobalStack().undo(); return null; // Z
}
return null;
}
} else if ( entity is Node && focus is Way ) {
// select way node
return new DragWayNode(focus as Way, getNodeIndex(focus as Way,entity as Node), event, false);
+ } else if ( controller.keyDown(32) ) {
+ // drag map
+ return new DragBackground(event);
}
} else if ( event.type == MouseEvent.MOUSE_UP && focus == null && map.dragstate!=map.DRAGGING ) {
return new NoSelection();
--- /dev/null
+package net.systemeD.potlatch2.controller {
+ import flash.events.*;
+ import net.systemeD.potlatch2.EditController;
+ import net.systemeD.halcyon.connection.*;
+ import net.systemeD.halcyon.MapEvent;
+ import net.systemeD.halcyon.Globals;
+
+ public class DragBackground extends ControllerState {
+
+ private var downX:Number;
+ private var downY:Number;
+
+ public function DragBackground(event:MouseEvent) {
+ trace ("starting DragBackground");
+ downX = event.localX;
+ downY = event.localY;
+ }
+
+ override public function processMouseEvent(event:MouseEvent, entity:Entity):ControllerState {
+
+ if (event.type==MouseEvent.MOUSE_UP) {
+ return previousState;
+
+ } else if ( event.type == MouseEvent.MOUSE_MOVE) {
+ // dragging
+ controller.map.nudgeBackground(event.localX-downX, event.localY-downY);
+ downX = event.localX;
+ downY = event.localY;
+ return this;
+
+ } else {
+ // event not handled
+ return this;
+ }
+ }
+
+ override public function enterState():void {
+ controller.map.draggable=false;
+ Globals.vars.root.addDebug("**** -> "+this);
+ }
+ override public function exitState():void {
+ controller.map.draggable=true;
+ Globals.vars.root.addDebug("**** <- "+this);
+ }
+ override public function toString():String {
+ return "DragBackground";
+ }
+ }
+}