diff --git a/code/hooks.js b/code/hooks.js index 92840b7c..8bef1098 100644 --- a/code/hooks.js +++ b/code/hooks.js @@ -43,13 +43,16 @@ // redrawn. It is called early on in the // code/map_data.js#renderPortal as long as there was an // old portal for the guid. - +// checkRenderLimit: callback is passed the argument of +// {reached : false} to indicate that the renderlimit is reached +// set reached to true. window._hooks = {} window.VALID_HOOKS = ['portalAdded', 'portalDetailsUpdated', - 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender']; + 'publicChatDataAvailable', 'portalDataLoaded', 'beforePortalReRender', + 'checkRenderLimit']; window.runHooks = function(event, data) { if(VALID_HOOKS.indexOf(event) === -1) throw('Unknown event type: ' + event); diff --git a/code/utils_misc.js b/code/utils_misc.js index 48704d0c..6638955f 100644 --- a/code/utils_misc.js +++ b/code/utils_misc.js @@ -128,7 +128,9 @@ window.renderLimitReached = function() { if(Object.keys(portals).length >= MAX_DRAWN_PORTALS) return true; if(Object.keys(links).length >= MAX_DRAWN_LINKS) return true; if(Object.keys(fields).length >= MAX_DRAWN_FIELDS) return true; - return false; + var param = { 'reached': falseĀ }; + window.runHooks('checkRenderLimit', param); + return param.reached; } window.getMinPortalLevel = function() { diff --git a/plugins/max-links.user.js b/plugins/max-links.user.js index b1cd801f..5a7d2476 100644 --- a/plugins/max-links.user.js +++ b/plugins/max-links.user.js @@ -20,9 +20,10 @@ function wrapper() { // use own namespace for plugin window.plugin.maxLinks = function() {}; - + + window.plugin.maxLinks.MAX_DRAWN_LINKS = 400; var MAX_LINK_COLOR = '#FF0000'; - + var Triangle = function (a, b, c) { this.a = a; this.b = b; @@ -203,7 +204,8 @@ function wrapper() { window.plugin.maxLinks.layer = null; - var updating = false; + var updating = false; + var renderLimitReached = false; window.plugin.maxLinks.updateLayer = function() { if (updating || window.plugin.maxLinks.layer === null || !window.map.hasLayer(window.plugin.maxLinks.layer)) return; @@ -230,14 +232,28 @@ function wrapper() { }); var triangles = window.plugin.maxLinks.triangulate(locations); + var drawnLinks = 0; + renderLimitReached = false; $.each(triangles, function(idx, triangle) { - triangle.draw(window.plugin.maxLinks.layer, minX, minY) + if (drawnLinks <= window.plugin.maxLinks.MAX_DRAWN_LINKS) { + triangle.draw(window.plugin.maxLinks.layer, minX, minY); + drawnLinks += 3; + } else { + renderLimitReached = true; + } }); updating = false; + window.renderUpdateStatus(); } var setup = function() { window.plugin.maxLinks.layer = L.layerGroup([]); + + window.addHook('checkRenderLimit', function(e) { + if (window.map.hasLayer(window.plugin.maxLinks.layer) && renderLimitReached) + e.reached = true; + }); + window.map.on('layeradd', function(e) { if (e.layer === window.plugin.maxLinks.layer) window.plugin.maxLinks.updateLayer();