0

Initial reimplementation of url hash updating

This commit is contained in:
Andrew Chin
2016-07-11 21:01:30 -04:00
parent 0731ea65cd
commit ad85b3ff6a

View File

@@ -56,6 +56,7 @@ overviewer.util = {
console.log(ev.target.value); console.log(ev.target.value);
var selected_world = ev.target.value; var selected_world = ev.target.value;
// save current view for the current_world // save current view for the current_world
overviewer.collections.centers[overviewer.current_world][0] = overviewer.map.getCenter(); overviewer.collections.centers[overviewer.current_world][0] = overviewer.map.getCenter();
overviewer.collections.centers[overviewer.current_world][1] = overviewer.map.getZoom(); overviewer.collections.centers[overviewer.current_world][1] = overviewer.map.getZoom();
@@ -91,8 +92,12 @@ overviewer.util = {
overviewer.current_world = selected_world; overviewer.current_world = selected_world;
if (overviewer.collections.mapTypes[selected_world]) if (overviewer.collections.mapTypes[selected_world] && overviewer.current_layer[selected_world]) {
overviewer.map.addLayer(overviewer.collections.mapTypes[selected_world][overviewer.current_layer[selected_world]]); overviewer.map.addLayer(overviewer.collections.mapTypes[selected_world][overviewer.current_layer[selected_world].tileSetConfig.name]);
} else {
var tset_name = Object.keys(overviewer.collections.mapTypes[selected_world])[0]
overviewer.map.addLayer(overviewer.collections.mapTypes[selected_world][tset_name]);
}
}, },
onAdd: function() { onAdd: function() {
console.log("onAdd mycontrol"); console.log("onAdd mycontrol");
@@ -108,7 +113,7 @@ overviewer.util = {
minZoom: 0}); minZoom: 0});
overviewer.map.on('baselayerchange', function(ev) { overviewer.map.on('baselayerchange', function(ev) {
overviewer.current_layer[overviewer.current_world] = ev.name; overviewer.current_layer[overviewer.current_world] = ev.layer;
var ovconf = ev.layer.tileSetConfig; var ovconf = ev.layer.tileSetConfig;
// Set the background colour // Set the background colour
@@ -133,6 +138,11 @@ overviewer.util = {
} else { } else {
overviewer.collections.spawnMarker = null; overviewer.collections.spawnMarker = null;
} }
overviewer.util.updateHash();
});
overviewer.map.on('moveend', function(ev) {
overviewer.util.updateHash();
}); });
var tset = overviewerConfig.tilesets[0]; var tset = overviewerConfig.tilesets[0];
@@ -194,6 +204,10 @@ overviewer.util = {
//myLayer.addTo(overviewer.map); //myLayer.addTo(overviewer.map);
overviewer.map.setView(overviewer.util.fromWorldToLatLng(tset.spawn[0], tset.spawn[1], tset.spawn[2], tset), 1); overviewer.map.setView(overviewer.util.fromWorldToLatLng(tset.spawn[0], tset.spawn[1], tset.spawn[2], tset), 1);
if (!overviewer.util.initHash()) {
overviewer.worldCtrl.onChange({target: {value: overviewer.current_world}});
}
}, },
@@ -503,52 +517,42 @@ overviewer.util = {
overviewer.util.goToHash(); overviewer.util.goToHash();
// Clean up the hash. // Clean up the hash.
overviewer.util.updateHash(); overviewer.util.updateHash();
return true;
} else {
return false; // signal to caller that we didn't goto any hash
} }
} }
}, },
'setHash': function(x, y, z, zoom, w, maptype) { 'setHash': function(x, y, z, zoom, w, maptype) {
// save this info is a nice easy to parse format // save this info is a nice easy to parse format
var currentWorldView = overviewer.mapModel.get("currentWorldView"); var newHash = "#/" + Math.floor(x) + "/" + Math.floor(y) + "/" + Math.floor(z) + "/" + zoom + "/" + encodeURI(w) + "/" + encodeURI(maptype);
currentWorldView.options.lastViewport = [x,y,z,zoom];
var newHash = "#/" + Math.floor(x) + "/" + Math.floor(y) + "/" + Math.floor(z) + "/" + zoom + "/" + w + "/" + maptype;
overviewer.util.lastHash = newHash; // this should not trigger initHash overviewer.util.lastHash = newHash; // this should not trigger initHash
window.location.replace(newHash); window.location.replace(newHash);
}, },
'updateHash': function() { 'updateHash': function() {
var currTileset = overviewer.mapView.options.currentTileSet; // name of current world
var currWorld = overviewer.current_world;
if (currWorld == null) {return;}
var currTileset = overviewer.current_layer[currWorld];
if (currTileset == null) {return;} if (currTileset == null) {return;}
var coordinates = overviewer.util.fromLatLngToWorld(overviewer.map.getCenter().lat(),
overviewer.map.getCenter().lng(), var ovconf = currTileset.tileSetConfig;
currTileset);
var coordinates = overviewer.util.fromLatLngToWorld(overviewer.map.getCenter().lat,
overviewer.map.getCenter().lng,
ovconf);
var zoom = overviewer.map.getZoom(); var zoom = overviewer.map.getZoom();
var maptype = overviewer.map.getMapTypeId();
// convert mapType into a index if (zoom >= ovconf.maxZoom) {
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'; zoom = 'max';
} else if (zoom <= currTileset.get('minZoom')) { } else if (zoom <= ovconf.minZoom) {
zoom = 'min'; zoom = 'min';
} else { } else {
// default to (map-update friendly) negative zooms // default to (map-update friendly) negative zooms
zoom -= currTileset.get('maxZoom'); zoom -= ovconf.maxZoom;
} }
overviewer.util.setHash(coordinates.x, coordinates.y, coordinates.z, zoom, worldId, maptypeId); overviewer.util.setHash(coordinates.x, coordinates.y, coordinates.z, zoom, currWorld, ovconf.name);
}, },
'goToHash': function() { 'goToHash': function() {
// Note: the actual data begins at coords[1], coords[0] is empty. // Note: the actual data begins at coords[1], coords[0] is empty.
@@ -556,53 +560,59 @@ overviewer.util = {
var zoom; var zoom;
var worldid = -1; var world_name = null;
var maptyped = -1; var tileset_name = null;
// The if-statements try to prevent unexpected behaviour when using incomplete hashes, e.g. older links // The if-statements try to prevent unexpected behaviour when using incomplete hashes, e.g. older links
if (coords.length > 4) { if (coords.length > 4) {
zoom = coords[4]; zoom = coords[4];
} }
if (coords.length > 6) { if (coords.length > 6) {
worldid = coords[5]; world_name = decodeURI(coords[5]);
maptypeid = coords[6]; tileset_name = decodeURI(coords[6]);
} }
var worldView = overviewer.collections.worldViews[worldid];
overviewer.mapModel.set({currentWorldView: worldView});
var maptype = worldView.options.mapTypeIds[maptypeid]; var target_layer = overviewer.collections.mapTypes[world_name][tileset_name];
overviewer.map.setMapTypeId(maptype); var ovconf = target_layer.tileSetConfig;
var tsetModel = worldView.model.get("tileSets").at(maptypeid);
var latlngcoords = overviewer.util.fromWorldToLatLng(parseInt(coords[1]), var latlngcoords = overviewer.util.fromWorldToLatLng(parseInt(coords[1]),
parseInt(coords[2]), parseInt(coords[2]),
parseInt(coords[3]), parseInt(coords[3]),
tsetModel); ovconf);
if (zoom == 'max') { if (zoom == 'max') {
zoom = tsetModel.get('maxZoom'); zoom = ovconf.maxZoom;
} else if (zoom == 'min') { } else if (zoom == 'min') {
zoom = tsetModel.get('minZoom'); zoom = ovconf.minZoom;
} else { } else {
zoom = parseInt(zoom); zoom = parseInt(zoom);
if (zoom < 0) { if (zoom < 0) {
// if zoom is negative, treat it as a "zoom out from max" // if zoom is negative, treat it as a "zoom out from max"
zoom += tsetModel.get('maxZoom'); zoom += ovconf.maxZoom;
} else { } else {
// fall back to default zoom // fall back to default zoom
zoom = tsetModel.get('defaultZoom'); zoom = ovconf.defaultZoom;
} }
} }
// clip zoom // clip zoom
if (zoom > tsetModel.get('maxZoom')) if (zoom > ovconf.maxZoom)
zoom = tsetModel.get('maxZoom'); zoom = ovconf.maxZoom;
if (zoom < tsetModel.get('minZoom')) if (zoom < ovconf.minZoom)
zoom = tsetModel.get('minZoom'); zoom = ovconf.minZoom;
overviewer.map.setCenter(latlngcoords); // build a fake event for the world switcher control
overviewer.map.setZoom(zoom); overviewer.worldCtrl.onChange({target: {value: world_name}});
var locationmarker = new overviewer.views.LocationIconView(); overviewer.worldCtrl.select.value = world_name;
locationmarker.render(); if (!overviewer.map.hasLayer(target_layer)) {
overviewer.map.addLayer(target_layer);
}
overviewer.map.setView(latlngcoords, zoom);
// TODO re-add this
//var locationmarker = new overviewer.views.LocationIconView();
//locationmarker.render();
}, },
/** /**
* Generate a function to get the path to a tile at a particular location * Generate a function to get the path to a tile at a particular location