Fix flicker portal in portal render limit handler

Change:
Extract portal handle process from "handleDataResponse" to "handlePortalData"
Add "action" property to object returned by $.ajax() to identity type of request
Delay low level portal render until no active request of map data.
This commit is contained in:
Xelio
2013-02-28 14:40:35 +08:00
parent 49dafaa3d4
commit c75caa91dd
3 changed files with 113 additions and 17 deletions

View File

@ -49,7 +49,7 @@ window.requestData = function() {
$.each(tiles, function(ind, tls) {
data = { minLevelOfDetail: -1 };
data.boundsParamsList = tls;
window.requests.add(window.postAjax('getThinnedEntitiesV2', data, window.handleDataResponse));
window.requests.add(window.postAjax('getThinnedEntitiesV2', data, window.handleDataResponse, portalRenderLimit.handleFailRequest));
});
}
@ -59,11 +59,10 @@ window.handleDataResponse = function(data, textStatus, jqXHR) {
if(!data || !data.result) {
window.failedRequestCount++;
console.warn(data);
portalRenderLimit.handleFailRequest();
return;
}
var portalUpdateAvailable = false;
var portalInUrlAvailable = false;
var m = data.result.map;
// defer rendering of portals because there is no z-index in SVG.
// this means that whats rendered last ends up on top. While the
@ -72,8 +71,6 @@ window.handleDataResponse = function(data, textStatus, jqXHR) {
// https://github.com/Leaflet/Leaflet/issues/185
var ppp = [];
var p2f = {};
// Reset new portals count of Portal Render Limit handler
portalRenderLimit.resetCounting();
$.each(m, function(qk, val) {
$.each(val.deletedGameEntityGuids, function(ind, guid) {
if(getTypeByGuid(guid) === TYPE_FIELD && window.fields[guid] !== undefined) {
@ -92,8 +89,6 @@ window.handleDataResponse = function(data, textStatus, jqXHR) {
// format for portals: { controllingTeam, turret }
if(ent[2].turret !== undefined) {
if(selectedPortal === ent[0]) portalUpdateAvailable = true;
if(urlPortal && ent[0] == urlPortal) portalInUrlAvailable = true;
var latlng = [ent[2].locationE6.latE6/1E6, ent[2].locationE6.lngE6/1E6];
if(!window.getPaddedBounds().contains(latlng)
@ -102,7 +97,7 @@ window.handleDataResponse = function(data, textStatus, jqXHR) {
) return;
portalRenderLimit.pushPortal(ent);
ppp.push(ent); // delay portal render
} else if(ent[2].edge !== undefined) {
renderLink(ent);
@ -118,7 +113,7 @@ window.handleDataResponse = function(data, textStatus, jqXHR) {
}
});
});
$.each(ppp, function(ind, portal) {
if(portal[2].portalV2['linkedFields'] === undefined) {
portal[2].portalV2['linkedFields'] = [];
@ -128,12 +123,28 @@ window.handleDataResponse = function(data, textStatus, jqXHR) {
portal[2].portalV2['linkedFields'] = uniqueArray(p2f[portal[0]]);
}
});
// Process the portals with portal render limit handler first
ppp = portalRenderLimit.processPortals(ppp);
handlePortalData(ppp);
resolvePlayerNames();
renderUpdateStatus();
}
window.handlePortalData = function(ppp) {
var portalUpdateAvailable = false;
var portalInUrlAvailable = false;
// Preserve and restore "selectedPortal" between portal re-render
if(portalUpdateAvailable) var oldSelectedPortal = selectedPortal;
runHooks('portalDataLoaded', {portals : ppp});
$.each(ppp, function(ind, portal) { renderPortal(portal); });
$.each(ppp, function(ind, portal) {
if(selectedPortal === portal[0]) portalUpdateAvailable = true;
if(urlPortal && portal[0] == urlPortal) portalInUrlAvailable = true;
renderPortal(portal);
});
var selectedPortalLayer = portals[oldSelectedPortal];
if(portalUpdateAvailable && selectedPortalLayer) selectedPortal = oldSelectedPortal;
@ -150,8 +161,6 @@ window.handleDataResponse = function(data, textStatus, jqXHR) {
}
if(portalUpdateAvailable) renderPortalDetails(selectedPortal);
resolvePlayerNames();
renderUpdateStatus();
}
// removes entities that are still handled by Leaflet, although they