Started to refactor and flesh out filters.

New filter code goes in filters.js. Added messageless plugin filter, and
wrote message filters (but they're not implemented yet).
This commit is contained in:
Oliver Hamlet
2014-11-15 11:26:40 +00:00
parent c3376cd60d
commit f52442d0a2
2 changed files with 135 additions and 75 deletions
+124
View File
@@ -0,0 +1,124 @@
var filters = {
/* Filter functions return true if the given plugin passes the filter and
should be displayed, otherwise false. */
searchFilter: function(plugin, needle) {
if (needle.length == 0) {
return true;
}
if (plugin.name.toLowerCase().indexOf(needle) != -1
|| plugin.getCrcString().toLowerCase().indexOf(needle) != -1
|| plugin.version.toLowerCase().indexOf(needle) != -1) {
return true;
}
var tags = plugin.getTagStrings();
if (tags.added.toLowerCase().indexOf(needle) != -1
|| tags.removed.toLowerCase().indexOf(needle) != -1) {
return true;
}
for (var i = 0; i < plugin.messages.length; ++i) {
if (plugin.messages[i].content[0].str.toLowerCase().indexOf(needle) != -1) {
return true;
}
}
},
messagelessFilter: function(plugin) {
if (document.getElementById('hideMessagelessPlugins').checked) {
/* If any messages exist, check if they are hidden or not. Note
that the messages may not be present as elements, so the check
is actually if they would be hidden according to the message
filters. */
if (this.allMessageFilter()) {
for (var i = 0; i < plugin.messages.length; ++i) {
if (this.noteFilter(plugin.messages[i])
&& this.doNotCleanFilter(plugin.messages[i])) {
return true;
}
}
}
return false;
} else {
return true;
}
},
applyPluginFilters: function(plugins) {
var search = document.getElementById('searchBox').value.toLowerCase();
var hiddenPluginNo = 0;
var filteredPlugins = [];
plugins.forEach(function(plugin){
if (this.messagelessFilter(plugin)
&& this.searchFilter(plugin, search)) {
filteredPlugins.push(plugin);
return;
}
++hiddenPluginNo;
}, this);
document.getElementById('hiddenPluginNo').textContent = hiddenPluginNo;
return filteredPlugins;
},
/* Message filter functions are run from within plugin cards, when the card's
messages are to be added as elements. Each filter should return true if the
message is to be displayed. */
noteFilter: function(message) {
if (document.getElementById('hideNotes').checked) {
return message.type != 'say';
} else {
return true;
}
},
doNotCleanFilter: function(message) {
if (document.getElementById('hideDoNotCleanMessages').checked) {
return message.content[0].str.indexOf(l10n.jed.translate("Do not clean").fetch()) == -1;
} else {
return true;
}
},
allMessageFilter: function() {
return !document.getElementById('hideAllPluginMessages').checked;
},
applyMessageFilters: function(messages) {
var hiddenMessageNo = 0;
var filteredMessages = [];
if (this.allMessageFilter()) {
messages.forEach(function(message){
if (this.noteFilter(message)
&& this.doNotCleanFilter(message)) {
filteredMessages.push(message);
return;
}
++hiddenMessageNo;
}, this);
}
document.getElementById('hiddenMessageNo').textContent = hiddenMessageNo;
return filteredMessages;
},
};
function setFilteredUIData(evt) {
var filtered = filters.applyPluginFilters(loot.game.plugins);
document.getElementById('cardsNav').lastElementChild.data = filtered;
document.getElementById('main').lastElementChild.data = filtered;
}
+11 -75
View File
@@ -431,7 +431,6 @@ function applyFilters(evt) {
getConflictingPluginsFromFilter().then(function(conflicts) {
for (var i = 0; i < cards.length; ++i) {
var isConflictingPlugin = false;
var isMessageless = true;
var hasInactivePluginMessages = false;
var messages = cards[i].getElementsByTagName('ul')[0].getElementsByTagName('li');
if (cards[i].getAttribute('data-active') == 'false') {
@@ -441,33 +440,14 @@ function applyFilters(evt) {
isConflictingPlugin = true;
}
for (var j = 0; j < messages.length; ++j) {
var hasPluginMessages = false;
var hasNotes = false;
var hasDoNotCleanMessages = false;
if (messages[j].parentElement.parentElement.id != 'generalMessages') {
hasPluginMessages = true;
}
if (messages[j].className.indexOf('say') != -1) {
hasNotes = true;
}
if (messages[j].textContent.indexOf(l10n.jed.translate("Do not clean.").fetch()) != -1) {
hasDoNotCleanMessages = true;
}
if ((document.getElementById('hideAllPluginMessages').checked && hasPluginMessages)
|| (document.getElementById('hideNotes').checked && hasNotes)
|| (document.getElementById('hideDoNotCleanMessages').checked && hasDoNotCleanMessages)
|| (document.getElementById('hideInactivePluginMessages').checked && hasInactivePluginMessages)) {
if (document.getElementById('hideInactivePluginMessages').checked && hasInactivePluginMessages) {
hideElement(messages[j]);
++hiddenMessageNo;
} else {
showElement(messages[j]);
}
if (messages[j].className.indexOf('hidden') == -1) {
isMessageless = false;
}
}
if ((document.getElementById('hideMessagelessPlugins').checked && isMessageless)
|| conflicts.length > 0 && !isConflictingPlugin) {
if (conflicts.length > 0 && !isConflictingPlugin) {
hideElement(cards[i]);
hideElement(entries[i]);
++hiddenPluginNo;
@@ -481,45 +461,6 @@ function applyFilters(evt) {
});
}
function searchFilter(plugins) {
var search = document.getElementById('searchBox').value.toLowerCase();
if (search.length > 0) {
var hiddenPluginNo = 0;
var hiddenMessageNo = 0;
var filteredPlugins = [];
/* Check each plugin entry to see if the current search string exists in
its name, version, crc, Bash Tag or message strings. */
plugins.forEach(function(plugin){
if (plugin.name.toLowerCase().indexOf(search) != -1
|| plugin.getCrcString().toLowerCase().indexOf(search) != -1
|| plugin.version.toLowerCase().indexOf(search) != -1) {
filteredPlugins.push(plugin);
return;
}
var tags = plugin.getTagStrings();
if (tags.added.toLowerCase().indexOf(search) != -1
|| tags.removed.toLowerCase().indexOf(search) != -1) {
filteredPlugins.push(plugin);
return;
}
for (var i = 0; i < plugin.messages.length; ++i) {
if (plugin.messages[i].content[0].str.toLowerCase().indexOf(search) != -1) {
filteredPlugins.push(plugin);
return;
}
}
});
return filteredPlugins;
} else {
return plugins;
}
}
function showMessageDialog(title, text, yesNo, closeCallback) {
var dialog = document.createElement('loot-message-dialog');
if (yesNo) {
@@ -580,8 +521,7 @@ function changeGame(evt) {
document.getElementById('main').lastElementChild.scrollToItem(0);
/* Now update virtual lists. */
document.getElementById('cardsNav').lastElementChild.data = loot.game.plugins;
document.getElementById('main').lastElementChild.data = loot.game.plugins;
setFilteredUIData();
/* Update the list sizes to take into account data changes. */
document.getElementById('cardsNav').lastElementChild.updateSize();
@@ -920,6 +860,9 @@ function areSettingsValid() {
}
function switchSidebarTab(evt) {
evt.target.nextElementSibling.selected = evt.target.selected;
if (evt.target.selected == 0) {
document.getElementById('cardsNav').lastElementChild.updateSize();
}
}
function showAboutDialog(evt) {
@@ -979,12 +922,6 @@ function closeSettingsDialog(evt) {
function showSettingsDialog(evt) {
document.getElementById('settingsDialog').showModal();
}
function handleSearch(evt) {
var filtered = searchFilter(loot.game.plugins);
document.getElementById('cardsNav').lastElementChild.data = filtered;
document.getElementById('main').lastElementChild.data = filtered;
}
function focusSearch(evt) {
if (evt.ctrlKey && evt.keyCode == 70) { //'f'
document.getElementById('searchBox').focus();
@@ -1172,11 +1109,11 @@ function setupEventHandlers() {
document.getElementById('hideDoNotCleanMessages').addEventListener('change', applyFilters, false);
document.getElementById('hideInactivePluginMessages').addEventListener('change', applyFilters, false);
document.getElementById('hideAllPluginMessages').addEventListener('change', applyFilters, false);
document.getElementById('hideMessagelessPlugins').addEventListener('change', applyFilters, false);
document.getElementById('hideMessagelessPlugins').addEventListener('change', setFilteredUIData, false);
document.body.addEventListener('loot-filter-conflicts', handleConflictsFilter, false);
/* Set up event handlers for content filter. */
document.getElementById('searchBox').addEventListener('change', handleSearch, false);
document.getElementById('searchBox').addEventListener('change', setFilteredUIData, false);
window.addEventListener('keyup', focusSearch, false);
/* Set up handlers for buttons. */
@@ -1338,10 +1275,9 @@ function initVars() {
loot.game.masterlist = game.masterlist;
loot.game.globalMessages = game.globalMessages;
loot.game.plugins = game.plugins;
document.getElementById('cardsNav').querySelector('core-list').data = loot.game.plugins;
document.getElementById('main').querySelector('core-list').data = loot.game.plugins;
document.getElementById('cardsNav').lastElementChild.data = loot.game.plugins;
document.getElementById('main').lastElementChild.data = loot.game.plugins;
applySavedFilters();
closeProgressDialog();
return '';
}).catch(processCefError);
@@ -1439,7 +1375,7 @@ window.addEventListener('polymer-ready', function(e) {
/* Set the plugin list's scroll target to its parent. */
document.getElementById('main').querySelector('core-list').scrollTarget = document.getElementById('main');
require(['bower_components/marked/lib/marked', 'js/l10n', 'js/plugin'], function(markedResponse, l10nResponse) {
require(['bower_components/marked/lib/marked', 'js/l10n', 'js/plugin', 'js/filters'], function(markedResponse, l10nResponse) {
marked = markedResponse;
l10n = l10nResponse;
/* Make sure settings are what I want. */