From 4be01585a0a74a4998bedbf62d4be11781dd4fd7 Mon Sep 17 00:00:00 2001 From: Xelio Date: Mon, 2 Sep 2013 01:53:17 +0800 Subject: [PATCH 1/6] Work in progress: New plugin: Draw resonators --- plugins/draw-resonators.user.js | 229 ++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 plugins/draw-resonators.user.js diff --git a/plugins/draw-resonators.user.js b/plugins/draw-resonators.user.js new file mode 100644 index 00000000..39095930 --- /dev/null +++ b/plugins/draw-resonators.user.js @@ -0,0 +1,229 @@ +// ==UserScript== +// @id iitc-plugin-draw-resonators@xelio +// @name IITC plugin: Draw resonators +// @category Layer +// @version 0.1.0.@@DATETIMEVERSION@@ +// @namespace https://github.com/jonatkins/ingress-intel-total-conversion +// @updateURL @@UPDATEURL@@ +// @downloadURL @@DOWNLOADURL@@ +// @description [@@BUILDNAME@@-@@BUILDDATE@@] Draw resonators on map. +// @include https://www.ingress.com/intel* +// @include http://www.ingress.com/intel* +// @match https://www.ingress.com/intel* +// @match http://www.ingress.com/intel* +// @grant none +// ==/UserScript== + +@@PLUGINSTART@@ + +// PLUGIN START //////////////////////////////////////////////////////// + +// use own namespace for plugin +window.plugin.drawResonators = function() {}; + + +window.plugin.drawResonators.options; +window.plugin.drawResonators.render; + + + +//////// Render for handling render of resonators //////// + + + +window.plugin.drawResonators.Render = function(options) { + this.enableZoomLevel = options['enableZoomLevel']; + this.useStyler = options['useStyler']; + + this.stylers = {}; + this.resonators = {}; + this.resonatorLayerGroup = new L.LayerGroup(); + + this.portalAdded = this.portalAdded.bind(this); + this.createResonatorEntities = this.createResonatorEntities.bind(this); + this.deleteResonatorEntities = this.deleteResonatorEntities.bind(this); + this.clearResonatorEntitiesAfterZoom = this.clearResonatorEntitiesAfterZoom.bind(this); +}; + +window.plugin.drawResonators.Render.prototype.registerHook = function() { + window.addHook('portalAdded', this.portalAdded); + window.map.on('zoomend', this.clearResonatorEntitiesAfterZoom); +} + +window.plugin.drawResonators.Render.prototype.portalAdded = function(data) { + var marker = data.portal; + var render = this; + + marker.on('add', function() { + render.createResonatorEntities(this); // the 'this' in here is the portal. + }); + + marker.on('remove', function() { + render.deleteResonatorEntities(this.options.guid); // the 'this' in here is the portal. + }); +} + +window.plugin.drawResonators.Render.prototype.createResonatorEntities = function(portal) { + // TODO: create all resonators and connectors, add them to a layergroup with portal guid, + // and add to this.resonatorLayerGroup +} + +window.plugin.drawResonators.Render.prototype.deleteResonatorEntities = function(portalGuid) { + if (portalGuid in this.resonators) { + var r = this.resonators[portalGuid]; + this.resonatorLayerGroup.removeLayer(r); + delete this.resonators[portalGuid]; + } +} + +window.plugin.drawResonators.Render.prototype.clearResonatorEntitiesAfterZoom = function() { + if(!this.isResonatorsShow()) { + this.resonatorLayerGroup.clearLayers(); + this.resonators = {}; + } +} + +window.plugin.drawResonators.Render.prototype.addStyler = function(styler) { + this.stylers[styler.name] = styler; +} + +window.plugin.drawResonators.Render.prototype.getStylersList = function() { + return Object.keys(this.stylers); +} + +window.plugin.drawResonators.Render.prototype.changeStyler = function(name) { + // TODO: check whether styler has change, and update style of all resonators +} + +window.plugin.drawResonators.Render.prototype.isResonatorsShow = function() { + return map.getZoom() >= this.enableZoomLevel; +} + + + +//////// Styler for getting resonator and connector style //////// + + + +window.plugin.drawResonators.Styler = function(options) { + this.name = options['name'] || 'default'; + this.getResonatorStyle = options['resonatorStyleFunc'] || this.defaultResonatorStyle; + this.getConnectorStyle = options['connectorStyleFunc'] || this.defaultConnectorStyle; +} + +window.plugin.drawResonators.Styler.prototype.DEFAULT_OPTIONS_RESONATOR_SELECTED = { + color: '#fff', + weight: 2, + radius: 4, + opacity: 1, + clickable: false}; + +window.plugin.drawResonators.Styler.prototype.DEFAULT_OPTIONS_RESONATOR_NON_SELECTED = { + color: '#aaa', + weight: 1, + radius: 3, + opacity: 1, + clickable: false}; + +window.plugin.drawResonators.Styler.prototype.DEFAULT_OPTIONS_RESONATOR_LINE_SELECTED = { + opacity: 0.7, + weight: 3, + color: '#FFA000', + dashArray: '0,10' + (new Array(25).join(',8,4')), + fill: false, + clickable: false}; + +window.plugin.drawResonators.Styler.prototype.DEFAULT_OPTIONS_RESONATOR_LINE_NON_SELECTED = { + opacity: 0.25, + weight: 2, + color: '#FFA000', + dashArray: '0,10' + (new Array(25).join(',8,4')), + fill: false, + clickable: false}; + +window.plugin.drawResonators.Styler.prototype.defaultResonatorStyle = function(resoDetail, selected) { + var resoSharedStyle = selected + ? this.DEFAULT_OPTIONS_RESONATOR_SELECTED + : this.DEFAULT_OPTIONS_RESONATOR_NON_SELECTED; + + var resoStyle = $.extend({ + fillColor: COLORS_LVL[resoDetail.level], + fillOpacity: rdata.energyTotal/RESO_NRG[resoDetail.level], + }, resoSharedStyle); + + return resoStyle; +} + +window.plugin.drawResonators.Styler.prototype.defaultConnectorStyle = function(resoDetail, selected) { + var connStyle = selected + ? this.DEFAULT_OPTIONS_RESONATOR_LINE_SELECTED + : this.DEFAULT_OPTIONS_RESONATOR_LINE_NON_SELECTED; + + return connStyle; +} + + + +//////// Options for storing and loading options //////// + +window.plugin.drawResonators.Options = function() { + this.enableZoomLevel = this.loadLocal(this.STORAGE_ENABLE_ZOOM_LEVEL); + this.useStyler = this.loadLocal(this.STORAGE_USE_STYLER); +} + +window.plugin.drawResonators.Options.prototype.options = {}; + +window.plugin.drawResonators.Options.prototype.options['enableZoomLevel'] = { + key: 'plugin-drawResonators-enableZoomLevel', + defaultValue: 17}; + +window.plugin.drawResonators.Options.prototype.options['useStyler'] = { + key: 'plugin-drawResonators-useStyler', + defaultValue: 'default'}; + +window.plugin.drawResonators.Options.prototype.changeOption = function(name, value) { + if(!name in options) return false; + + this[name] = value; + this.storeLocal(options[name], this[name]); +} + +window.plugin.drawResonators.Options.prototype.loadLocal = function(mapping) { + var objectJSON = localStorage[mapping.key]; + if(!objectJSON) { + return mapping.defaultValue; + } else { + return JSON.parse(objectJSON); + } +} + +window.plugin.drawResonators.Options.prototype.storeLocal = function(mapping, value) { + if(typeof(value) !== 'undefined' && value !== null) { + localStorage[mapping.key] = JSON.stringify(value); + } else { + localStorage.removeItem(mapping.key); + } +} + + + + +var setup = function() { + window.plugin.drawResonators.options = new Options(); + var renderOptions = { + 'enableZoomLevel': options.enableZoomLevel, + 'useStyler': options.useStyler}; + + window.plugin.drawResonators.render = new Render(renderOptions); + window.plugin.drawResonators.render.registerHook(); + window.addLayerGroup('Resonators', window.plugin.drawResonators.render.resonatorLayerGroup, true); + + // TODO: add runHooks('portalSelected', {oldSelectedPortalGuid, newSelectedPortalGuid}); + // to window.selectPortal, and update style of resonators + + // TODO: add options dialog to change options +} + +// PLUGIN END ////////////////////////////////////////////////////////// + +@@PLUGINEND@@ From 19333a32d375aeb55127614cbc41165a285eec4d Mon Sep 17 00:00:00 2001 From: Xelio Date: Mon, 2 Sep 2013 03:30:54 +0800 Subject: [PATCH 2/6] Work in progress: Plugin draw resonators: add resonators and connectors render function --- plugins/draw-resonators.user.js | 97 ++++++++++++++++++++++++++++++++- 1 file changed, 94 insertions(+), 3 deletions(-) diff --git a/plugins/draw-resonators.user.js b/plugins/draw-resonators.user.js index 39095930..6cbb5654 100644 --- a/plugins/draw-resonators.user.js +++ b/plugins/draw-resonators.user.js @@ -29,6 +29,9 @@ window.plugin.drawResonators.render; //////// Render for handling render of resonators //////// +// As long as 'window.Render.prototype.createPortalEntity' delete and recreate portal +// on any change of data, this resonator render should make resonator create and remove +// with portal correctly. window.plugin.drawResonators.Render = function(options) { @@ -64,8 +67,69 @@ window.plugin.drawResonators.Render.prototype.portalAdded = function(data) { } window.plugin.drawResonators.Render.prototype.createResonatorEntities = function(portal) { - // TODO: create all resonators and connectors, add them to a layergroup with portal guid, - // and add to this.resonatorLayerGroup + // No need to check for existing resonators, as old resonators should be removed with the portal marker. + + // No need to check for display status of portalLayer, as this function is only called by + // 'added' event of portal marker. + + if(!isResonatorsShow()) return; + var resonatorsWithConnector = new L.LayerGroup() + var portalLatLng = [portal.details.locationE6.latE6/1E6, portal.details.locationE6.lngE6/1E6]; + var portalSelected = selectedPortal === portal.guid; + + for(var i in portalDetails.resonatorArray.resonators) { + resoData = portalDetails.resonatorArray.resonators[i]; + if(resoData === null) continue; + + var resoLatLng = this.getResonatorLatLng(resoData.distanceToPortal, resoData.slot, portalLatLng); + + var resoMarker = this.createResoMarker(resoData, resoLatLng, portalSelected); + var connMarker = this.createConnMarker(resoData, resoLatLng, portalLatLng, portalSelected); + + resonatorsWithConnector.add(resoMarker); + resonatorsWithConnector.add(connMarker); + } + + resonatorsWithConnector.options = { + details: portalDetails.resonatorArray.resonators, + guid: portal.guid + }; + + this.resonators[portal.guid] = resonatorsWithConnector; + this.resonatorLayerGroup.addLayer(resonatorsWithConnector); + resonatorsWithConnector.bringToBack(); +} + +window.plugin.drawResonators.Render.prototype.createResoMarker = function(resoData, resoLatLng, portalSelected) { + var resoProperty = this.getStyler().getResonatorStyle(resoData, portalSelected); + resoProperty.type = 'resonator'; + resoProperty.slot = resoData.slot; + var reso = L.circleMarker(resoLatLng, resoProperty); + return reso; +} + +window.plugin.drawResonators.Render.prototype.createConnMarker = function(resoData, resoLatLng, portalLatLng, portalSelected) { + var connProperty = this.getStyler().getConnectorStyle(resoData, portalSelected); + connProperty.type = 'connector'; + connProperty.slot = resoData.slot; + var conn = L.polyline([portalLatLng, resoLatLng], connProperty); + return conn; +} + +window.plugin.drawResonators.Render.prototype.getResonatorLatLng = function(dist, slot, portalLatLng) { + // offset in meters + var dn = dist*SLOT_TO_LAT[slot]; + var de = dist*SLOT_TO_LNG[slot]; + + // Coordinate offset in radians + var dLat = dn/EARTH_RADIUS; + var dLon = de/(EARTH_RADIUS*Math.cos(Math.PI/180*portalLatLng[0])); + + // OffsetPosition, decimal degrees + var lat0 = portalLatLng[0] + dLat * 180/Math.PI; + var lon0 = portalLatLng[1] + dLon * 180/Math.PI; + + return [lat0, lon0]; } window.plugin.drawResonators.Render.prototype.deleteResonatorEntities = function(portalGuid) { @@ -83,6 +147,25 @@ window.plugin.drawResonators.Render.prototype.clearResonatorEntitiesAfterZoom = } } +window.plugin.drawResonators.Render.prototype.changeStyle = function(portalGuid) { + if (portalGuid in this.resonators) { + var render = this; + var portalSelected = selectedPortal === portalGuid; + var r = this.resonators[portalGuid]; + + r.eachLayer(function(entity) { + var style + if(entity.type === 'resonator') { + style = render.getStyler().getResonatorStyle(r.details, portalSelected); + } else { + style = render.getStyler().getConnectorStyle(r.details, portalSelected); + } + + entity.setStyle(style); + }); + } +} + window.plugin.drawResonators.Render.prototype.addStyler = function(styler) { this.stylers[styler.name] = styler; } @@ -91,6 +174,11 @@ window.plugin.drawResonators.Render.prototype.getStylersList = function() { return Object.keys(this.stylers); } +window.plugin.drawResonators.Render.prototype.getStyler = function() { + var stylerName = this.useStyler in this.stylers ? this.useStyler : 'default'; + return this.stylers[stylerName]; +} + window.plugin.drawResonators.Render.prototype.changeStyler = function(name) { // TODO: check whether styler has change, and update style of all resonators } @@ -166,6 +254,8 @@ window.plugin.drawResonators.Styler.prototype.defaultConnectorStyle = function(r //////// Options for storing and loading options //////// +// TODO: add callback to notify option changes + window.plugin.drawResonators.Options = function() { this.enableZoomLevel = this.loadLocal(this.STORAGE_ENABLE_ZOOM_LEVEL); this.useStyler = this.loadLocal(this.STORAGE_USE_STYLER); @@ -219,7 +309,8 @@ var setup = function() { window.addLayerGroup('Resonators', window.plugin.drawResonators.render.resonatorLayerGroup, true); // TODO: add runHooks('portalSelected', {oldSelectedPortalGuid, newSelectedPortalGuid}); - // to window.selectPortal, and update style of resonators + // to window.selectPortal, call render.changeStyle to change style of selected and unselected + // resonators. // TODO: add options dialog to change options } From c91dd67359cfd9813845e44950cf7e169f9f6c12 Mon Sep 17 00:00:00 2001 From: Xelio Date: Mon, 2 Sep 2013 23:34:01 +0800 Subject: [PATCH 3/6] Work in progress: Plugin Draw Resonators: bug fix --- plugins/draw-resonators.user.js | 85 +++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/plugins/draw-resonators.user.js b/plugins/draw-resonators.user.js index 6cbb5654..4cc5d53b 100644 --- a/plugins/draw-resonators.user.js +++ b/plugins/draw-resonators.user.js @@ -41,7 +41,8 @@ window.plugin.drawResonators.Render = function(options) { this.stylers = {}; this.resonators = {}; this.resonatorLayerGroup = new L.LayerGroup(); - + this.addStyler(new window.plugin.drawResonators.Styler()); + this.portalAdded = this.portalAdded.bind(this); this.createResonatorEntities = this.createResonatorEntities.bind(this); this.deleteResonatorEntities = this.deleteResonatorEntities.bind(this); @@ -51,6 +52,7 @@ window.plugin.drawResonators.Render = function(options) { window.plugin.drawResonators.Render.prototype.registerHook = function() { window.addHook('portalAdded', this.portalAdded); window.map.on('zoomend', this.clearResonatorEntitiesAfterZoom); + //TODO: zoom in should redraw resonators if needed } window.plugin.drawResonators.Render.prototype.portalAdded = function(data) { @@ -70,12 +72,14 @@ window.plugin.drawResonators.Render.prototype.createResonatorEntities = function // No need to check for existing resonators, as old resonators should be removed with the portal marker. // No need to check for display status of portalLayer, as this function is only called by - // 'added' event of portal marker. + // 'add' event of portal marker. - if(!isResonatorsShow()) return; + if(!this.isResonatorsShow()) return; + var portalDetails = portal.options.details; var resonatorsWithConnector = new L.LayerGroup() - var portalLatLng = [portal.details.locationE6.latE6/1E6, portal.details.locationE6.lngE6/1E6]; - var portalSelected = selectedPortal === portal.guid; + + var portalLatLng = [portalDetails.locationE6.latE6/1E6, portalDetails.locationE6.lngE6/1E6]; + var portalSelected = selectedPortal === portal.options.guid; for(var i in portalDetails.resonatorArray.resonators) { resoData = portalDetails.resonatorArray.resonators[i]; @@ -86,18 +90,22 @@ window.plugin.drawResonators.Render.prototype.createResonatorEntities = function var resoMarker = this.createResoMarker(resoData, resoLatLng, portalSelected); var connMarker = this.createConnMarker(resoData, resoLatLng, portalLatLng, portalSelected); - resonatorsWithConnector.add(resoMarker); - resonatorsWithConnector.add(connMarker); + resonatorsWithConnector.addLayer(resoMarker); + resonatorsWithConnector.addLayer(connMarker); } resonatorsWithConnector.options = { details: portalDetails.resonatorArray.resonators, - guid: portal.guid + guid: portal.options.guid }; - this.resonators[portal.guid] = resonatorsWithConnector; + this.resonators[portal.options.guid] = resonatorsWithConnector; this.resonatorLayerGroup.addLayer(resonatorsWithConnector); - resonatorsWithConnector.bringToBack(); + + // bring portal in front of resonator connector + if(portal.options.guid in window.portals) { + window.portals[portal.options.guid].bringToFront(); + } } window.plugin.drawResonators.Render.prototype.createResoMarker = function(resoData, resoLatLng, portalSelected) { @@ -194,6 +202,7 @@ window.plugin.drawResonators.Render.prototype.isResonatorsShow = function() { window.plugin.drawResonators.Styler = function(options) { + options = options || {}; this.name = options['name'] || 'default'; this.getResonatorStyle = options['resonatorStyleFunc'] || this.defaultResonatorStyle; this.getConnectorStyle = options['connectorStyleFunc'] || this.defaultConnectorStyle; @@ -236,7 +245,7 @@ window.plugin.drawResonators.Styler.prototype.defaultResonatorStyle = function(r var resoStyle = $.extend({ fillColor: COLORS_LVL[resoDetail.level], - fillOpacity: rdata.energyTotal/RESO_NRG[resoDetail.level], + fillOpacity: resoDetail.energyTotal/RESO_NRG[resoDetail.level], }, resoSharedStyle); return resoStyle; @@ -257,41 +266,42 @@ window.plugin.drawResonators.Styler.prototype.defaultConnectorStyle = function(r // TODO: add callback to notify option changes window.plugin.drawResonators.Options = function() { - this.enableZoomLevel = this.loadLocal(this.STORAGE_ENABLE_ZOOM_LEVEL); - this.useStyler = this.loadLocal(this.STORAGE_USE_STYLER); + this._options = {}; } -window.plugin.drawResonators.Options.prototype.options = {}; +window.plugin.drawResonators.Options.prototype.newOption = function(name, defaultValue) { + this._options[name] = this.loadLocal(this.getStorageKey, defaultValue) +} -window.plugin.drawResonators.Options.prototype.options['enableZoomLevel'] = { - key: 'plugin-drawResonators-enableZoomLevel', - defaultValue: 17}; - -window.plugin.drawResonators.Options.prototype.options['useStyler'] = { - key: 'plugin-drawResonators-useStyler', - defaultValue: 'default'}; +window.plugin.drawResonators.Options.prototype.getOption = function(name) { + return this._options[name]; +} window.plugin.drawResonators.Options.prototype.changeOption = function(name, value) { - if(!name in options) return false; + if(!name in this._options) return false; - this[name] = value; - this.storeLocal(options[name], this[name]); + this._options[name] = value; + this.storeLocal(name, this._options[name]); } -window.plugin.drawResonators.Options.prototype.loadLocal = function(mapping) { - var objectJSON = localStorage[mapping.key]; +window.plugin.drawResonators.Options.prototype.getStorageKey = function(name) { + return 'plugin-drawResonators-option-' + name; +} + +window.plugin.drawResonators.Options.prototype.loadLocal = function(key, defaultValue) { + var objectJSON = localStorage[key]; if(!objectJSON) { - return mapping.defaultValue; + return defaultValue; } else { return JSON.parse(objectJSON); } } -window.plugin.drawResonators.Options.prototype.storeLocal = function(mapping, value) { +window.plugin.drawResonators.Options.prototype.storeLocal = function(key, value) { if(typeof(value) !== 'undefined' && value !== null) { - localStorage[mapping.key] = JSON.stringify(value); + localStorage[key] = JSON.stringify(value); } else { - localStorage.removeItem(mapping.key); + localStorage.removeItem(key); } } @@ -299,15 +309,18 @@ window.plugin.drawResonators.Options.prototype.storeLocal = function(mapping, va var setup = function() { - window.plugin.drawResonators.options = new Options(); - var renderOptions = { - 'enableZoomLevel': options.enableZoomLevel, - 'useStyler': options.useStyler}; + window.plugin.drawResonators.options = new window.plugin.drawResonators.Options(); + window.plugin.drawResonators.options.newOption('enableZoomLevel', 17); + window.plugin.drawResonators.options.newOption('useStyler', 'default'); - window.plugin.drawResonators.render = new Render(renderOptions); + var renderOptions = { + 'enableZoomLevel': window.plugin.drawResonators.options.getOption('enableZoomLevel'), + 'useStyler': window.plugin.drawResonators.options.getOption('useStyler')}; + + window.plugin.drawResonators.render = new window.plugin.drawResonators.Render(renderOptions); window.plugin.drawResonators.render.registerHook(); window.addLayerGroup('Resonators', window.plugin.drawResonators.render.resonatorLayerGroup, true); - + // TODO: add runHooks('portalSelected', {oldSelectedPortalGuid, newSelectedPortalGuid}); // to window.selectPortal, call render.changeStyle to change style of selected and unselected // resonators. From c2f73bb3d79d9fcdf69e5e0ffd072e0f2a999800 Mon Sep 17 00:00:00 2001 From: Xelio Date: Tue, 3 Sep 2013 00:23:29 +0800 Subject: [PATCH 4/6] Plugin Draw Resonators: Zooming in will redraw all resonators if they was removed by zooming out. --- plugins/draw-resonators.user.js | 34 +++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/plugins/draw-resonators.user.js b/plugins/draw-resonators.user.js index 4cc5d53b..a4aa8291 100644 --- a/plugins/draw-resonators.user.js +++ b/plugins/draw-resonators.user.js @@ -42,17 +42,19 @@ window.plugin.drawResonators.Render = function(options) { this.resonators = {}; this.resonatorLayerGroup = new L.LayerGroup(); this.addStyler(new window.plugin.drawResonators.Styler()); + this.beforeZoomLevel = map.getZoom(); this.portalAdded = this.portalAdded.bind(this); this.createResonatorEntities = this.createResonatorEntities.bind(this); this.deleteResonatorEntities = this.deleteResonatorEntities.bind(this); - this.clearResonatorEntitiesAfterZoom = this.clearResonatorEntitiesAfterZoom.bind(this); + this.handleResonatorEntitiesBeforeZoom = this.handleResonatorEntitiesBeforeZoom.bind(this); + this.handleResonatorEntitiesAfterZoom = this.handleResonatorEntitiesAfterZoom.bind(this); }; window.plugin.drawResonators.Render.prototype.registerHook = function() { window.addHook('portalAdded', this.portalAdded); - window.map.on('zoomend', this.clearResonatorEntitiesAfterZoom); - //TODO: zoom in should redraw resonators if needed + window.map.on('zoomstart', this.handleResonatorEntitiesBeforeZoom); + window.map.on('zoomend', this.handleResonatorEntitiesAfterZoom); } window.plugin.drawResonators.Render.prototype.portalAdded = function(data) { @@ -71,16 +73,13 @@ window.plugin.drawResonators.Render.prototype.portalAdded = function(data) { window.plugin.drawResonators.Render.prototype.createResonatorEntities = function(portal) { // No need to check for existing resonators, as old resonators should be removed with the portal marker. - // No need to check for display status of portalLayer, as this function is only called by - // 'add' event of portal marker. - if(!this.isResonatorsShow()) return; var portalDetails = portal.options.details; var resonatorsWithConnector = new L.LayerGroup() var portalLatLng = [portalDetails.locationE6.latE6/1E6, portalDetails.locationE6.lngE6/1E6]; var portalSelected = selectedPortal === portal.options.guid; - + for(var i in portalDetails.resonatorArray.resonators) { resoData = portalDetails.resonatorArray.resonators[i]; if(resoData === null) continue; @@ -148,10 +147,25 @@ window.plugin.drawResonators.Render.prototype.deleteResonatorEntities = function } } -window.plugin.drawResonators.Render.prototype.clearResonatorEntitiesAfterZoom = function() { +// Save zoom level before zoom, use to determine redraw of resonator +window.plugin.drawResonators.Render.prototype.handleResonatorEntitiesBeforeZoom = function() { + this.beforeZoomLevel = map.getZoom(); +} + +window.plugin.drawResonators.Render.prototype.handleResonatorEntitiesAfterZoom = function() { if(!this.isResonatorsShow()) { this.resonatorLayerGroup.clearLayers(); this.resonators = {}; + } else { + // Redraw all resonators if they were deleted + if(!this.isResonatorsShowBeforeZoom()) { + for(var guid in window.portals) { + // Need this checking? + if(! guid in this.resonators) { + this.createResonatorEntities(window.portals[guid]); + } + } + } } } @@ -195,6 +209,10 @@ window.plugin.drawResonators.Render.prototype.isResonatorsShow = function() { return map.getZoom() >= this.enableZoomLevel; } +window.plugin.drawResonators.Render.prototype.isResonatorsShowBeforeZoom = function() { + return this.beforeZoomLevel >= this.enableZoomLevel; +} + //////// Styler for getting resonator and connector style //////// From 745e78170b110f2604a7734da0a04c24a3fd1716 Mon Sep 17 00:00:00 2001 From: Xelio Date: Tue, 3 Sep 2013 00:34:16 +0800 Subject: [PATCH 5/6] Plugin Draw Resonators: add comment for Render and change an ambiguous function name --- plugins/draw-resonators.user.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/plugins/draw-resonators.user.js b/plugins/draw-resonators.user.js index a4aa8291..f7f73b25 100644 --- a/plugins/draw-resonators.user.js +++ b/plugins/draw-resonators.user.js @@ -32,7 +32,14 @@ window.plugin.drawResonators.render; // As long as 'window.Render.prototype.createPortalEntity' delete and recreate portal // on any change of data, this resonator render should make resonator create and remove // with portal correctly. - +// +// Resonators will create when +// 1.Portal added to map +// 2.Zooming in to enable zoom level +// +// Resonators will remove when +// 1.Portal removed from map +// 2.Zooming out beyond enable zoom level window.plugin.drawResonators.Render = function(options) { this.enableZoomLevel = options['enableZoomLevel']; @@ -160,16 +167,13 @@ window.plugin.drawResonators.Render.prototype.handleResonatorEntitiesAfterZoom = // Redraw all resonators if they were deleted if(!this.isResonatorsShowBeforeZoom()) { for(var guid in window.portals) { - // Need this checking? - if(! guid in this.resonators) { - this.createResonatorEntities(window.portals[guid]); - } + this.createResonatorEntities(window.portals[guid]); } } } } -window.plugin.drawResonators.Render.prototype.changeStyle = function(portalGuid) { +window.plugin.drawResonators.Render.prototype.toggleSelectedStyle = function(portalGuid) { if (portalGuid in this.resonators) { var render = this; var portalSelected = selectedPortal === portalGuid; @@ -340,7 +344,7 @@ var setup = function() { window.addLayerGroup('Resonators', window.plugin.drawResonators.render.resonatorLayerGroup, true); // TODO: add runHooks('portalSelected', {oldSelectedPortalGuid, newSelectedPortalGuid}); - // to window.selectPortal, call render.changeStyle to change style of selected and unselected + // to window.selectPortal, call render.toggleSelectedStyle to change style of selected and unselected // resonators. // TODO: add options dialog to change options From 12fd84decb3b2fd8f73125706b7ff8ebcb1b8a6f Mon Sep 17 00:00:00 2001 From: Xelio Date: Tue, 3 Sep 2013 21:27:21 +0800 Subject: [PATCH 6/6] Plugin Draw Resonators: Only run the redraw logic on zooming in when the level of portal is shown on map. --- plugins/draw-resonators.user.js | 68 ++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/plugins/draw-resonators.user.js b/plugins/draw-resonators.user.js index f7f73b25..77008ac4 100644 --- a/plugins/draw-resonators.user.js +++ b/plugins/draw-resonators.user.js @@ -2,7 +2,7 @@ // @id iitc-plugin-draw-resonators@xelio // @name IITC plugin: Draw resonators // @category Layer -// @version 0.1.0.@@DATETIMEVERSION@@ +// @version 0.1.1.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ @@ -109,9 +109,7 @@ window.plugin.drawResonators.Render.prototype.createResonatorEntities = function this.resonatorLayerGroup.addLayer(resonatorsWithConnector); // bring portal in front of resonator connector - if(portal.options.guid in window.portals) { - window.portals[portal.options.guid].bringToFront(); - } + portal.bringToFront(); } window.plugin.drawResonators.Render.prototype.createResoMarker = function(resoData, resoLatLng, portalSelected) { @@ -147,11 +145,11 @@ window.plugin.drawResonators.Render.prototype.getResonatorLatLng = function(dist } window.plugin.drawResonators.Render.prototype.deleteResonatorEntities = function(portalGuid) { - if (portalGuid in this.resonators) { - var r = this.resonators[portalGuid]; - this.resonatorLayerGroup.removeLayer(r); - delete this.resonators[portalGuid]; - } + if (!(portalGuid in this.resonators)) return; + + var r = this.resonators[portalGuid]; + this.resonatorLayerGroup.removeLayer(r); + delete this.resonators[portalGuid]; } // Save zoom level before zoom, use to determine redraw of resonator @@ -165,31 +163,39 @@ window.plugin.drawResonators.Render.prototype.handleResonatorEntitiesAfterZoom = this.resonators = {}; } else { // Redraw all resonators if they were deleted - if(!this.isResonatorsShowBeforeZoom()) { - for(var guid in window.portals) { - this.createResonatorEntities(window.portals[guid]); - } + if(this.isResonatorsShowBeforeZoom()) return; + + var render = this; + + // loop through level of portals, only redraw if the level is shown on map + for(var level in window.portalsLayers) { + var portalsLayer = window.portalsLayers[level]; + + if(!map.hasLayer(portalsLayer)) continue; + portalsLayer.eachLayer(function(portal) { + render.createResonatorEntities(portal); + }); } } } window.plugin.drawResonators.Render.prototype.toggleSelectedStyle = function(portalGuid) { - if (portalGuid in this.resonators) { - var render = this; - var portalSelected = selectedPortal === portalGuid; - var r = this.resonators[portalGuid]; + if (!(portalGuid in this.resonators)) return; - r.eachLayer(function(entity) { - var style - if(entity.type === 'resonator') { - style = render.getStyler().getResonatorStyle(r.details, portalSelected); - } else { - style = render.getStyler().getConnectorStyle(r.details, portalSelected); - } + var render = this; + var portalSelected = selectedPortal === portalGuid; + var r = this.resonators[portalGuid]; - entity.setStyle(style); - }); - } + r.eachLayer(function(entity) { + var style + if(entity.type === 'resonator') { + style = render.getStyler().getResonatorStyle(r.details, portalSelected); + } else { + style = render.getStyler().getConnectorStyle(r.details, portalSelected); + } + + entity.setStyle(style); + }); } window.plugin.drawResonators.Render.prototype.addStyler = function(styler) { @@ -300,7 +306,7 @@ window.plugin.drawResonators.Options.prototype.getOption = function(name) { } window.plugin.drawResonators.Options.prototype.changeOption = function(name, value) { - if(!name in this._options) return false; + if(!(name in this._options)) return false; this._options[name] = value; this.storeLocal(name, this._options[name]); @@ -312,10 +318,10 @@ window.plugin.drawResonators.Options.prototype.getStorageKey = function(name) { window.plugin.drawResonators.Options.prototype.loadLocal = function(key, defaultValue) { var objectJSON = localStorage[key]; - if(!objectJSON) { - return defaultValue; - } else { + if(objectJSON) { return JSON.parse(objectJSON); + } else { + return defaultValue; } }