Merge pull request #143 from Xelio/patch-map-resonator-bug-1-rebased

Add resonator re-render logic
This commit is contained in:
Stefan Breunig
2013-02-12 19:15:19 -08:00

View File

@ -227,7 +227,7 @@ window.renderPortal = function(ent) {
u = u || oo.level !== portalLevel; u = u || oo.level !== portalLevel;
// nothing for the portal changed, so dont update. Let resonators // nothing for the portal changed, so dont update. Let resonators
// manage themselves if they want to be updated. // manage themselves if they want to be updated.
if(!u) return renderResonators(ent); if(!u) return renderResonators(ent, old);
// there were changes, remove old portal // there were changes, remove old portal
removeByGuid(ent[0]); removeByGuid(ent[0]);
} }
@ -237,7 +237,6 @@ window.renderPortal = function(ent) {
// pre-loads player names for high zoom levels // pre-loads player names for high zoom levels
loadPlayerNamesForPortal(ent[2]); loadPlayerNamesForPortal(ent[2]);
var lvWeight = Math.max(2, portalLevel / 1.5); var lvWeight = Math.max(2, portalLevel / 1.5);
var lvRadius = Math.max(portalLevel + 3, 5); var lvRadius = Math.max(portalLevel + 3, 5);
@ -261,7 +260,7 @@ window.renderPortal = function(ent) {
// all resonators have already removed by zooming // all resonators have already removed by zooming
if(isResonatorsShow()) { if(isResonatorsShow()) {
for(var i = 0; i <= 7; i++) for(var i = 0; i <= 7; i++)
removeByGuid(portalResonatorGuid(portalGuid,i)); removeByGuid(portalResonatorGuid(portalGuid, i));
} }
delete window.portals[portalGuid]; delete window.portals[portalGuid];
if(window.selectedPortal === portalGuid) { if(window.selectedPortal === portalGuid) {
@ -287,7 +286,7 @@ window.renderPortal = function(ent) {
window.map.setView(latlng, 17); window.map.setView(latlng, 17);
}); });
window.renderResonators(ent); window.renderResonators(ent, null);
window.runHooks('portalAdded', {portal: p}); window.runHooks('portalAdded', {portal: p});
@ -295,18 +294,28 @@ window.renderPortal = function(ent) {
p.addTo(layerGroup); p.addTo(layerGroup);
} }
window.renderResonators = function(ent) { window.renderResonators = function(ent, portalLayer) {
if(!isResonatorsShow()) return;
var portalLevel = getPortalLevel(ent[2]); var portalLevel = getPortalLevel(ent[2]);
if(portalLevel < getMinPortalLevel() && ent[0] != selectedPortal) return; if(portalLevel < getMinPortalLevel() && ent[0] != selectedPortal) return;
if(!isResonatorsShow()) return; var layerGroup = portalsLayers[parseInt(portalLevel)];
var reRendered = false;
for(var i=0; i < ent[2].resonatorArray.resonators.length; i++) { for(var i = 0; i < ent[2].resonatorArray.resonators.length; i++) {
var rdata = ent[2].resonatorArray.resonators[i]; var rdata = ent[2].resonatorArray.resonators[i];
if(rdata == null) continue; // skip if resonator didn't change
if(portalLayer) {
var oldRes = findEntityInLeaflet(layerGroup, window.resonators, portalResonatorGuid(ent[0], i));
if(oldRes && isSameResonator(oldRes.options.details, rdata)) continue;
}
if(window.resonators[portalResonatorGuid(ent[0],i)]) continue; // skip and remove old resonator if no new resonator
if(rdata === null) {
if(oldRes) removeByGuid(oldRes.options.guid);
continue;
}
// offset in meters // offset in meters
var dn = rdata.distanceToPortal*SLOT_TO_LAT[rdata.slot]; var dn = rdata.distanceToPortal*SLOT_TO_LAT[rdata.slot];
@ -332,13 +341,16 @@ window.renderResonators = function(ent) {
level: rdata.level, level: rdata.level,
details: rdata, details: rdata,
pDetails: ent[2], pDetails: ent[2],
guid: portalResonatorGuid(ent[0],i) }); guid: portalResonatorGuid(ent[0], i) });
r.on('remove', function() { delete window.resonators[this.options.guid]; }); r.on('remove', function() { delete window.resonators[this.options.guid]; });
r.on('add', function() { window.resonators[this.options.guid] = this; }); r.on('add', function() { window.resonators[this.options.guid] = this; });
r.addTo(portalsLayers[parseInt(portalLevel)]); r.addTo(portalsLayers[parseInt(portalLevel)]);
reRendered = true;
} }
// if there is any resonator re-rendered, bring portal to front
if(reRendered && portalLayer) portalLayer.bringToFront();
} }
// append portal guid with -resonator-[slot] to get guid for resonators // append portal guid with -resonator-[slot] to get guid for resonators
@ -350,6 +362,15 @@ window.isResonatorsShow = function() {
return map.getZoom() >= RESONATOR_DISPLAY_ZOOM_LEVEL; return map.getZoom() >= RESONATOR_DISPLAY_ZOOM_LEVEL;
} }
window.isSameResonator = function(oldRes, newRes) {
if(!oldRes && !newRes) return true;
if(typeof oldRes !== typeof newRes) return false;
if(oldRes.level !== newRes.level) return false;
if(oldRes.energyTotal !== newRes.energyTotal) return false;
if(oldRes.distanceToPortal !== newRes.distanceToPortal) return false;
return true;
}
window.portalResetColor = function(portal) { window.portalResetColor = function(portal) {
portal.setStyle({color: portal.options.fillColor}); portal.setStyle({color: portal.options.fillColor});
} }