diff --git a/plugins/draw-resonators.user.js b/plugins/draw-resonators.user.js index e7e6fe14..6e7ee025 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.3.0.@@DATETIMEVERSION@@ +// @version 0.4.0.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ @@ -43,7 +43,7 @@ window.plugin.drawResonators.render; window.plugin.drawResonators.Render = function(options) { this.enableZoomLevel = options['enableZoomLevel']; - this.useStyler = options['useStyler']; + this.useStyler = ''; this.stylers = {}; this.resonators = {}; @@ -249,7 +249,9 @@ window.plugin.drawResonators.Render.prototype.changeStyler = function(name) { if (name === this.useStyler) return; for(stylerName in this.stylers) { if(stylerName === name) { + if(this.stylers[this.useStyler]) this.stylers[this.useStyler].onDisableFunc(); this.useStyler = stylerName; + this.stylers[this.useStyler].onEnableFunc(); this.clearAllResonators(); this.drawAllResonators(); return; @@ -257,6 +259,11 @@ window.plugin.drawResonators.Render.prototype.changeStyler = function(name) { } } +window.plugin.drawResonators.Render.prototype.refreshStyler = function() { + this.clearAllResonators(); + this.drawAllResonators(); +} + window.plugin.drawResonators.Render.prototype.isResonatorsShow = function() { return map.getZoom() >= this.enableZoomLevel; } @@ -277,6 +284,8 @@ window.plugin.drawResonators.Styler = function(options) { this.otherOptions = options['otherOptions']; this.getResonatorStyle = options['resonatorStyleFunc'] || this.defaultResonatorStyle; this.getConnectorStyle = options['connectorStyleFunc'] || this.defaultConnectorStyle; + this.onEnableFunc = options['onEnableFunc'] || function() {}; + this.onDisableFunc = options['onDisableFunc'] || function() {}; } window.plugin.drawResonators.Styler.prototype.DEFAULT_OPTIONS_RESONATOR_SELECTED = { @@ -356,6 +365,11 @@ window.plugin.drawResonators.Options.prototype.getOption = function(name) { return this._options[name]; } +window.plugin.drawResonators.Options.prototype.removeOption = function(name) { + delete this._options[name]; + delete this._callbacks[name]; +} + window.plugin.drawResonators.Options.prototype.changeOption = function(name, value) { if(!(name in this._options)) return false; if(value === this._options[name]) return false; @@ -405,8 +419,13 @@ window.plugin.drawResonators.Dialog.prototype.addLink = function() { window.plugin.drawResonators.Dialog.prototype.addEntry = function(name, dialogEntry) { this._dialogEntries[name] = dialogEntry; + this.change(); } +window.plugin.drawResonators.Dialog.prototype.removeEntry = function(name) { + delete this._dialogEntries[name]; + this.change(); +} window.plugin.drawResonators.Dialog.prototype.show = function() { window.dialog({html: this.getDialogHTML(), title: 'Resonators', modal: true, id: 'draw-reso-setting'}); @@ -421,6 +440,10 @@ window.plugin.drawResonators.Dialog.prototype.show = function() { } } +window.plugin.drawResonators.Dialog.prototype.change = function() { + if($('#draw-reso-dialog').length > 0) this.show(); +} + window.plugin.drawResonators.Dialog.prototype.getDialogHTML = function() { var html = '
' for(var name in this._dialogEntries) { @@ -482,6 +505,40 @@ window.plugin.drawResonators.ListDialogEntry.prototype.getSelectId = function() +//////// TextboxDialogEntry + + +window.plugin.drawResonators.TextboxDialogEntry = function(options) { + this._name = options['name']; + this._label = options['label']; + this._valueFunc = options['valueFunc']; + this._onChangeCallback = options['onChangeCallback']; +} + +window.plugin.drawResonators.TextboxDialogEntry.prototype.getHTML = function() { + var curValue = this._valueFunc(); + var html = '' + + ''; + return html; +} + + +window.plugin.drawResonators.TextboxDialogEntry.prototype.getOnEvents = function() { + return [{'event': 'change', + 'id': this.getInputId(), + 'callback': this._onChangeCallback + }]; +} + +window.plugin.drawResonators.TextboxDialogEntry.prototype.getInputId = function() { + return 'draw-reso-option-' + this._name; +} + + + window.plugin.drawResonators.setupStyler = function() { var thisPlugin = window.plugin.drawResonators; @@ -560,19 +617,26 @@ window.plugin.drawResonators.setupStyler = function() { thisPlugin.render.addStyler(new thisPlugin.Styler(l8Reso)); - // Styler for highlighting resonators with less than 10% energy - var lessThanTenPctReso = { - name: 'Highlight <10% resonators', + // Styler for highlighting resonators with less than X% energy + var lessThanXPctReso = { + name: 'Highlight < X% resonators', otherOptions: { - 'highlightedReso' : highlightedReso, - 'normalReso' : normalReso, - 'selectedReso' : selectedReso, - 'highlightedConn' : highlightedConn, - 'normalConn' : normalConn, - 'selectedConn' : selectedConn + 'highlightedReso': highlightedReso, + 'normalReso': normalReso, + 'selectedReso': selectedReso, + 'highlightedConn': highlightedConn, + 'normalConn': normalConn, + 'selectedConn': selectedConn, + 'pct': 15, + 'dialogEntry': new thisPlugin.TextboxDialogEntry({ + name: 'resoLessThanPct-pct', + label: 'Percentage', + valueFunc: function() {return thisPlugin.options.getOption('styler-resoLessThanPct-pct')}, + onChangeCallback: function(event) {thisPlugin.options.changeOption('styler-resoLessThanPct-pct', parseInt(event.target.value));} + }) }, resonatorStyleFunc: function(resoDetail, selected) { - var highlight = (resoDetail.energyTotal * 10) < RESO_NRG[resoDetail.level]; + var highlight = (resoDetail.energyTotal * 100) < (RESO_NRG[resoDetail.level] * this.otherOptions.pct); var resoSharedStyle = highlight ? this.otherOptions.highlightedReso : (selected ? this.otherOptions.selectedReso : this.otherOptions.normalReso); @@ -584,44 +648,114 @@ window.plugin.drawResonators.setupStyler = function() { return resoStyle; }, connectorStyleFunc: function(resoDetail, selected) { - var highlight = (resoDetail.energyTotal * 10) < RESO_NRG[resoDetail.level]; + var highlight = (resoDetail.energyTotal * 100) < (RESO_NRG[resoDetail.level] * this.otherOptions.pct); var connStyle = highlight ? this.otherOptions.highlightedConn : (selected ? this.otherOptions.selectedConn : this.otherOptions.normalConn); return connStyle; + }, + onEnableFunc: function() { + var thisPlugin = window.plugin.drawResonators; + var thisStyler = this; + // Add option + thisPlugin.options.newOption('styler-resoLessThanPct-pct', 15); + thisPlugin.options.addCallback('styler-resoLessThanPct-pct', function(value) { + thisStyler.otherOptions.pct = value; + thisPlugin.render.refreshStyler(); + }); + thisStyler.otherOptions.pct = thisPlugin.options.getOption('styler-resoLessThanPct-pct'); + // Add dialog entry + thisPlugin.dialog.addEntry('resoLessThanPct-pct', this.otherOptions.dialogEntry); + }, + onDisableFunc: function() { + var thisPlugin = window.plugin.drawResonators; + // Remove option + thisPlugin.options.removeOption('styler-resoLessThanPct-pct'); + // Remove dialog entry + thisPlugin.dialog.removeEntry('resoLessThanPct-pct'); } }; - thisPlugin.render.addStyler(new thisPlugin.Styler(lessThanTenPctReso)); + thisPlugin.render.addStyler(new thisPlugin.Styler(lessThanXPctReso)); + // Styler for highlighting resonators deployed by specific player + var resoOfSpecificPlayer = { + name: 'Highlight resonators by player', + otherOptions: { + 'highlightedReso': highlightedReso, + 'normalReso': normalReso, + 'selectedReso': selectedReso, + 'highlightedConn': highlightedConn, + 'normalConn': normalConn, + 'selectedConn': selectedConn, + 'player': '', + 'playerGuid': '', + 'dialogEntry': new thisPlugin.TextboxDialogEntry({ + name: 'resoOfSpecificPlayer-player', + label: 'Player name', + valueFunc: function() {return thisPlugin.options.getOption('styler-resoOfSpecificPlayer-player')}, + onChangeCallback: function(event) {thisPlugin.options.changeOption('styler-resoOfSpecificPlayer-player', event.target.value);} + }) + }, + resonatorStyleFunc: function(resoDetail, selected) { + var highlight = resoDetail.ownerGuid === this.otherOptions.playerGuid; + var resoSharedStyle = highlight + ? this.otherOptions.highlightedReso + : (selected ? this.otherOptions.selectedReso : this.otherOptions.normalReso); + + var resoStyle = $.extend({ + fillColor: COLORS_LVL[resoDetail.level], + fillOpacity: resoDetail.energyTotal/RESO_NRG[resoDetail.level] * (highlight ? 1 : 0.75) + }, resoSharedStyle); + return resoStyle; + }, + connectorStyleFunc: function(resoDetail, selected) { + var highlight = resoDetail.ownerGuid === this.otherOptions.playerGuid; + var connStyle = highlight + ? this.otherOptions.highlightedConn + : (selected ? this.otherOptions.selectedConn : this.otherOptions.normalConn); + return connStyle; + }, + onEnableFunc: function() { + var thisPlugin = window.plugin.drawResonators; + var thisStyler = this; + // Add option + thisPlugin.options.newOption('styler-resoOfSpecificPlayer-player', ''); + thisPlugin.options.addCallback('styler-resoOfSpecificPlayer-player', function(value) { + thisStyler.otherOptions.player = value; + thisStyler.otherOptions.playerGuid = window.playerNameToGuid(value); + thisPlugin.render.refreshStyler(); + }); + thisStyler.otherOptions.player = thisPlugin.options.getOption('styler-resoOfSpecificPlayer-player'); + thisStyler.otherOptions.playerGuid = window.playerNameToGuid(thisStyler.otherOptions.player); + // Add dialog entry + thisPlugin.dialog.addEntry('resoOfSpecificPlayer-player', this.otherOptions.dialogEntry); + }, + onDisableFunc: function() { + var thisPlugin = window.plugin.drawResonators; + // Remove option + thisPlugin.options.removeOption('styler-resoOfSpecificPlayer-player'); + // Remove dialog entry + thisPlugin.dialog.removeEntry('resoOfSpecificPlayer-player'); + } + }; + + thisPlugin.render.addStyler(new thisPlugin.Styler(resoOfSpecificPlayer)); + + thisPlugin.render.changeStyler(thisPlugin.options.getOption('useStyler')); } - -var setup = function() { +window.plugin.drawResonators.setupOptions = function() { var thisPlugin = window.plugin.drawResonators; - // Initialize options thisPlugin.options = new thisPlugin.Options(); thisPlugin.options.newOption('enableZoomLevel', 17); thisPlugin.options.newOption('useStyler', 'Default'); +} - // Initialize render - var renderOptions = { - 'enableZoomLevel': thisPlugin.options.getOption('enableZoomLevel'), - 'useStyler': thisPlugin.options.getOption('useStyler')}; - - thisPlugin.render = new thisPlugin.Render(renderOptions); - thisPlugin.render.registerHook(); - window.addLayerGroup('Resonators', thisPlugin.render.resonatorLayerGroup, true); - - // callback run at option change - thisPlugin.options.addCallback('enableZoomLevel', thisPlugin.render.handleEnableZoomLevelChange); - thisPlugin.options.addCallback('useStyler', thisPlugin.render.changeStyler); - - // Initialize styler - thisPlugin.setupStyler(); - +window.plugin.drawResonators.setupDialog = function() { + var thisPlugin = window.plugin.drawResonators; // Initialize dialog thisPlugin.dialog = new thisPlugin.Dialog(); @@ -648,6 +782,30 @@ var setup = function() { thisPlugin.dialog.addLink(); } +var setup = function() { + var thisPlugin = window.plugin.drawResonators; + + // Initialize options + thisPlugin.setupOptions(); + + // Initialize render + var renderOptions = {'enableZoomLevel': thisPlugin.options.getOption('enableZoomLevel')}; + + thisPlugin.render = new thisPlugin.Render(renderOptions); + + // callback run at option change + thisPlugin.options.addCallback('enableZoomLevel', thisPlugin.render.handleEnableZoomLevelChange); + thisPlugin.options.addCallback('useStyler', thisPlugin.render.changeStyler); + + // Initialize Dialog + thisPlugin.setupDialog(); + // Initialize styler + thisPlugin.setupStyler(); + + thisPlugin.render.registerHook(); + window.addLayerGroup('Resonators', thisPlugin.render.resonatorLayerGroup, true); +} + // PLUGIN END ////////////////////////////////////////////////////////// @@PLUGINEND@@