0

Readded url hash updating

as a "side-effect", the current coords remain centered when switching
tilesets.  at least in theory.  needs more work
This commit is contained in:
Andrew Chin
2012-02-11 00:29:28 -05:00
parent 2e3bf7330d
commit eb9649e310
2 changed files with 81 additions and 54 deletions

View File

@@ -37,10 +37,20 @@ overviewer.util = {
var coordsdiv = new overviewer.views.CoordboxView({tagName: 'DIV'});
coordsdiv.render();
// Update coords on mousemove
google.maps.event.addListener(overviewer.map, 'mousemove', function (event) {
coordsdiv.updateCoords(event.latLng);
});
google.maps.event.addListener(overviewer.map, 'dragend', function (event) {
overviewer.util.updateHash();
});
google.maps.event.addListener(overviewer.map, 'zoom_changed', function (event) {
overviewer.util.updateHash();
});
google.maps.event.addListener(overviewer.map, 'dblclick', function (event) {
overviewer.util.updateHash();
});
google.maps.event.addListener(overviewer.map, 'maptypeid_changed', function(event) {
// it's handy to keep track of the currently visible tileset. we let
@@ -49,6 +59,17 @@ overviewer.util = {
compass.render();
// re-center on the last viewport
var currentWorldView = overviewer.mapModel.get("currentWorldView");
if (currentWorldView.options.lastViewport) {
var x = currentWorldView.options.lastViewport[0];
var y = currentWorldView.options.lastViewport[1];
var z = currentWorldView.options.lastViewport[2];
var latlngcoords = overviewer.util.fromWorldToLatLng(x, y, z,
overviewer.mapView.options.currentTileSet);
overviewer.map.setCenter(latlngcoords);
}
});
var worldSelector = new overviewer.views.WorldSelectorView({tagName:'DIV'});
@@ -59,6 +80,10 @@ overviewer.util = {
overviewer.mapModel.bind("change:currentWorldView", overviewer.mapView.render, overviewer.mapView);
overviewer.mapView.render();
// Jump to the hash if given
overviewer.util.initHash();
/*
overviewer.util.initializeMapTypes();
@@ -340,93 +365,92 @@ overviewer.util = {
// Clean up the hash.
overviewer.util.updateHash();
// Add a marker indicating the user-supplied position
var coordinates = overviewer.util.fromLatLngToWorld(overviewer.map.getCenter().lat(),
overviewer.map.getCenter().lng(),
overviewerConfig.tilesets[overviewer.currentTilesetId].zoomLevels);
overviewer.collections.markerDatas.push([{
'msg': 'Coordinates ' + Math.floor(coordinates.x) + ', ' + Math.floor(coordinates.y) + ', ' + Math.floor(coordinates.z),
'x': coordinates.x,
'y': coordinates.y,
'z': coordinates.z,
'type': 'querypos'}]);
}
},
'setHash': function(x, y, z, zoom, maptype) {
// remove the div prefix from the maptype (looks better)
if (maptype)
{
maptype = maptype.replace(overviewerConfig.CONST.mapDivId, "");
}
window.location.replace("#/" + Math.floor(x) + "/" + Math.floor(y) + "/" + Math.floor(z) + "/" + zoom + "/" + maptype);
'setHash': function(x, y, z, zoom, w, maptype) {
// save this info is a nice easy to parse format
var currentWorldView = overviewer.mapModel.get("currentWorldView");
currentWorldView.options.lastViewport = [x,y,z,zoom];
window.location.replace("#/" + Math.floor(x) + "/" + Math.floor(y) + "/" + Math.floor(z) + "/" + zoom + "/" + w + "/" + maptype);
},
'updateHash': function() {
var currTileset = overviewer.mapView.options.currentTileSet;
if (currTileset == null) {return;}
var coordinates = overviewer.util.fromLatLngToWorld(overviewer.map.getCenter().lat(),
overviewer.map.getCenter().lng(),
overviewerConfig.tilesets[overviewer.currentTilesetId].zoomLevels);
currTileset);
var zoom = overviewer.map.getZoom();
var maptype = overviewer.map.getMapTypeId();
if (zoom == overviewerConfig.tilesets[overviewer.currentTilesetId].maxZoom) {
// convert mapType into a index
var currentWorldView = overviewer.mapModel.get("currentWorldView");
var maptypeId = -1;
for (id in currentWorldView.options.mapTypeIds) {
if (currentWorldView.options.mapTypeIds[id] == maptype) {
maptypeId = id;
}
}
var worldId = -1;
for (id in overviewer.collections.worldViews) {
if (overviewer.collections.worldViews[id] == currentWorldView) {
worldId = id;
}
}
if (zoom == currTileset.get('maxZoom')) {
zoom = 'max';
} else if (zoom == overviewerConfig.tilesets[overviewer.currentTilesetId].minZoom) {
} else if (zoom == currTileset.get('minZoom')) {
zoom = 'min';
} else {
// default to (map-update friendly) negative zooms
zoom -= overviewerConfig.tilesets[overviewer.currentTilesetId].maxZoom;
zoom -= currTileset.get('maxZoom');
}
overviewer.util.setHash(coordinates.x, coordinates.y, coordinates.z, zoom, maptype);
overviewer.util.setHash(coordinates.x, coordinates.y, coordinates.z, zoom, worldId, maptypeId);
},
'goToHash': function() {
// Note: the actual data begins at coords[1], coords[0] is empty.
var coords = window.location.hash.split("/");
var latlngcoords = overviewer.util.fromWorldToLatLng(parseInt(coords[1]),
parseInt(coords[2]),
parseInt(coords[3]),
overviewerConfig.tilesets[overviewer.currentTilesetId].zoomLevels);
var zoom;
var maptype = '';
var worldid = -1;
var maptyped = -1;
// The if-statements try to prevent unexpected behaviour when using incomplete hashes, e.g. older links
if (coords.length > 4) {
zoom = coords[4];
}
if (coords.length > 5) {
maptype = coords[5];
if (coords.length > 6) {
worldid = coords[5];
maptypeid = coords[6];
}
var worldView = overviewer.collections.worldViews[worldid];
overviewer.mapModel.set({currentWorldView: worldView});
var maptype = worldView.options.mapTypeIds[maptypeid];
overviewer.map.setMapTypeId(maptype);
var tsetModel = worldView.model.get("tileSets").at(maptypeid);
var latlngcoords = overviewer.util.fromWorldToLatLng(parseInt(coords[1]),
parseInt(coords[2]),
parseInt(coords[3]),
tsetModel);
if (zoom == 'max') {
zoom = overviewerConfig.tilesets[overviewer.currentTilesetId].maxZoom;
zoom = tsetModel.get('maxZoom');
} else if (zoom == 'min') {
zoom = overviewerConfig.tilesets[overviewer.currentTilesetId].minZoom;
zoom = tsetModel.get('minZoom');
} else {
zoom = parseInt(zoom);
if (zoom < 0 && zoom + overviewerConfig.tilesets[overviewer.currentTilesetId].maxZoom >= 0) {
if (zoom < 0 && zoom + tsetModel.get('maxZoom') >= 0) {
// if zoom is negative, treat it as a "zoom out from max"
zoom += overviewerConfig.tilesets[overviewer.currentTilesetId].maxZoom;
zoom += tsetModel.get('maxZoom');
} else {
// fall back to default zoom
zoom = overviewerConfig.tilesets[overviewer.currentTilesetId].defaultZoom;
zoom = tsetModel.get('defaultZoom');
}
}
// If the maptype isn't set, set the default one.
if (maptype == '') {
// We can now set the map to use the 'coordinate' map type
overviewer.map.setMapTypeId(overviewer.util.getDefaultMapTypeId());
} else {
// normalize the map type (this supports old-style,
// 'mcmapLabel' style map types, converts them to 'shortname'
if (maptype.lastIndexOf(overviewerConfig.CONST.mapDivId, 0) === 0) {
maptype = maptype.replace(overviewerConfig.CONST.mapDivId, "");
for (i in overviewer.collections.mapTypes) {
var type = overviewer.collections.mapTypes[i];
if (type.name == maptype) {
maptype = type.shortname;
break;
}
}
}
overviewer.map.setMapTypeId(overviewerConfig.CONST.mapDivId + maptype);
}
overviewer.map.setCenter(latlngcoords);
overviewer.map.setZoom(zoom);

View File

@@ -209,6 +209,9 @@ overviewer.views.GoogleMapView = Backbone.View.extend({
}
}
// for this world, remember our current viewport (as worldcoords, not LatLng)
//
}
});