From 7dc2dfacad862f8aa52874ec1b55502f7b1ed834 Mon Sep 17 00:00:00 2001 From: fkloft Date: Fri, 29 Aug 2014 17:48:25 +0200 Subject: [PATCH] [uniques] show visited/capture state in portals-list --- plugins/uniques.css | 6 +++ plugins/uniques.user.js | 98 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/plugins/uniques.css b/plugins/uniques.css index 0015af4a..73ab1fdc 100644 --- a/plugins/uniques.css +++ b/plugins/uniques.css @@ -11,3 +11,9 @@ vertical-align: middle; } +.portal-list-uniques input[type='checkbox'] { + padding: 0; + height: auto; + margin-top: -5px; + margin-bottom: -5px; +} diff --git a/plugins/uniques.user.js b/plugins/uniques.user.js index 6afd588b..9383283f 100644 --- a/plugins/uniques.user.js +++ b/plugins/uniques.user.js @@ -159,6 +159,8 @@ window.plugin.uniques.onPublicChatDataAvailable = function(data) { } window.plugin.uniques.updateCheckedAndHighlight = function(guid) { + runHooks('pluginUniquesUpdateUniques', { guid: guid }); + if (guid == window.selectedPortal) { var uniqueInfo = plugin.uniques.uniques[guid]; @@ -207,8 +209,9 @@ window.plugin.uniques.setPortalCaptured = function(guid) { plugin.uniques.sync(guid); } -window.plugin.uniques.updateVisited = function(visited) { - var guid = window.selectedPortal; +window.plugin.uniques.updateVisited = function(visited, guid) { + if(guid == undefined) guid = window.selectedPortal; + var uniqueInfo = plugin.uniques.uniques[guid]; if (!uniqueInfo) { plugin.uniques.uniques[guid] = uniqueInfo = { @@ -228,8 +231,9 @@ window.plugin.uniques.updateVisited = function(visited) { plugin.uniques.sync(guid); } -window.plugin.uniques.updateCaptured = function(captured) { - var guid = window.selectedPortal; +window.plugin.uniques.updateCaptured = function(captured, guid) { + if(guid == undefined) guid = window.selectedPortal; + var uniqueInfo = plugin.uniques.uniques[guid]; if (!uniqueInfo) { plugin.uniques.uniques[guid] = uniqueInfo = { @@ -401,6 +405,83 @@ window.plugin.uniques.setupContent = function() { plugin.uniques.disabledMessage = '
Plugin Uniques disabled
'; } +window.plugin.uniques.setupPortalsList = function() { + if(!window.plugin.portalslist) return; + + window.addHook('pluginUniquesUpdateUniques', function(data) { + var info = plugin.uniques.uniques[data.guid]; + if(!info) info = { visited: false, captured: false }; + + $('[data-list-uniques="'+data.guid+'"].visited').prop('checked', !!info.visited); + $('[data-list-uniques="'+data.guid+'"].captured').prop('checked', !!info.captured); + }); + + window.addHook('pluginUniquesRefreshAll', function() { + $('[data-list-uniques]').each(function(i, element) { + var guid = element.getAttribute("data-list-uniques"); + + var info = plugin.uniques.uniques[guid]; + if(!info) info = { visited: false, captured: false }; + + var e = $(element); + if(e.hasClass('visited')) e.prop('checked', !!info.visited); + if(e.hasClass('captured')) e.prop('checked', !!info.captured); + }); + }); + + function uniqueValue(guid) { + var info = plugin.uniques.uniques[guid]; + if(!info) return 0; + + if(info.visited && info.captured) return 2; + if(info.visited) return 1; + } + + window.plugin.portalslist.fields.push({ + title: "Visit", + value: function(portal) { return portal.options.guid; }, // we store the guid, but implement a custom comparator so the list does sort properly without closing and reopening the dialog + sort: function(guidA, guidB) { + return uniqueValue(guidA) - uniqueValue(guidB); + }, + format: function(cell, portal, guid) { + var info = plugin.uniques.uniques[guid]; + if(!info) info = { visited: false, captured: false }; + + $(cell).addClass("portal-list-uniques"); + + // for some reason, jQuery removes event listeners when the list is sorted. Therefore we use DOM's addEventListener + $('') + .prop({ + type: "checkbox", + className: "visited", + title: "Portal visited?", + checked: !!info.visited, + }) + .attr("data-list-uniques", guid) + .appendTo(cell) + [0].addEventListener("change", function(ev) { + window.plugin.uniques.updateVisited(this.checked, guid); + ev.preventDefault(); + return false; + }, false); + $('') + .prop({ + type: "checkbox", + className: "captured", + title: "Portal captured?", + checked: !!info.captured, + }) + .attr("data-list-uniques", guid) + .appendTo(cell) + [0].addEventListener("change", function(ev) { + window.plugin.uniques.updateCaptured(this.checked, guid); + ev.preventDefault(); + return false; + }, false); + }, + }); +} + var setup = function() { if($.inArray('pluginUniquesUpdateUniques', window.VALID_HOOKS) < 0) window.VALID_HOOKS.push('pluginUniquesUpdateUniques'); @@ -413,6 +494,15 @@ var setup = function() { window.addHook('publicChatDataAvailable', window.plugin.uniques.onPublicChatDataAvailable); window.addHook('iitcLoaded', window.plugin.uniques.registerFieldForSyncing); window.addPortalHighlighter('Uniques', window.plugin.uniques.highlighter); + + if(window.plugin.portalslist) { + window.plugin.uniques.setupPortalsList(); + } else { + setTimeout(function() { + if(window.plugin.portalslist) + window.plugin.uniques.setupPortalsList(); + }, 500); + } } //PLUGIN END //////////////////////////////////////////////////////////