diff --git a/src/gui/html/js/events.js b/src/gui/html/js/events.js
index 6f8f25a4..c5d8a5e6 100644
--- a/src/gui/html/js/events.js
+++ b/src/gui/html/js/events.js
@@ -49,17 +49,14 @@ function onGameMasterlistChange(evt) {
function onGameFolderChange(evt) {
loot.dom.updateSelectedGame(evt.detail.folder);
/* Enable/disable the redate plugins option. */
- let index = undefined;
+ let gameSettings = undefined;
if (loot.settings && loot.settings.games) {
- for (let i = 0; i < loot.settings.games.length; ++i) {
- if (loot.settings.games[i].folder === evt.detail.folder) {
- index = i;
- break;
- }
- }
+ gameSettings = loot.settings.games.find((game) => {
+ return game.folder === evt.detail.folder;
+ });
}
const redateButton = document.getElementById('redatePluginsButton');
- if (index && loot.settings.games[index].type === 'Skyrim') {
+ if (gameSettings && gameSettings.type === 'Skyrim') {
redateButton.removeAttribute('disabled');
} else {
redateButton.setAttribute('disabled', true);
@@ -82,6 +79,7 @@ function saveFilterState(evt) {
loot.query('saveFilterState', evt.target.id, evt.target.checked).catch(handlePromiseError);
}
function onToggleDisplayCSS(evt) {
+ saveFilterState(evt);
const attr = 'data-hide-' + evt.target.getAttribute('data-class');
if (evt.target.checked) {
document.getElementById('main').setAttribute(attr, true);
@@ -89,20 +87,14 @@ function onToggleDisplayCSS(evt) {
document.getElementById('main').removeAttribute(attr);
}
- if (evt.target.id !== 'hideBashTags') {
- /* Now perform search again. If there is no current search, this won't
- do anything. */
- document.getElementById('searchBar').search();
+ if (evt.target.id === 'hideBashTags') {
+ document.getElementById('main').lastElementChild.updateSize();
}
-}
-function onToggleBashTags(evt) {
- onToggleDisplayCSS(evt);
- document.getElementById('main').lastElementChild.updateSize();
/* Now perform search again. If there is no current search, this won't
do anything. */
document.getElementById('searchBar').search();
}
-function onOpenLogLocation(evt) {
+function onOpenLogLocation() {
loot.query('openLogLocation').catch(handlePromiseError);
}
function onChangeGame(evt) {
@@ -129,10 +121,7 @@ function onChangeGame(evt) {
/* Parse the data sent from C++. */
const gameInfo = JSON.parse(result, loot.Plugin.fromJson);
- loot.game.folder = gameInfo.folder;
- loot.game.masterlist = gameInfo.masterlist;
- loot.game.globalMessages = gameInfo.globalMessages;
- loot.game.plugins = gameInfo.plugins;
+ loot.game = new loot.Game(gameInfo, loot.l10n);
/* Reset virtual list positions. */
document.getElementById('cardsNav').scrollToItem(0);
@@ -144,7 +133,7 @@ function onChangeGame(evt) {
loot.Dialog.closeProgress();
}).catch(handlePromiseError);
}
-function onOpenReadme(evt) {
+function onOpenReadme() {
loot.query('openReadme').catch(handlePromiseError);
}
/* Masterlist update process, minus progress dialog. */
@@ -155,17 +144,17 @@ function updateMasterlistNoProgress() {
loot.game.masterlist = result.masterlist;
loot.game.globalMessages = result.globalMessages;
- result.plugins.forEach((plugin) => {
- for (let i = 0; i < loot.game.plugins.length; ++i) {
- if (loot.game.plugins[i].name === plugin.name) {
- loot.game.plugins[i].isDirty = plugin.isDirty;
- loot.game.plugins[i].isPriorityGlobal = plugin.isPriorityGlobal;
- loot.game.plugins[i].masterlist = plugin.masterlist;
- loot.game.plugins[i].messages = plugin.messages;
- loot.game.plugins[i].priority = plugin.priority;
- loot.game.plugins[i].tags = plugin.tags;
- break;
- }
+ result.plugins.forEach((resultPlugin) => {
+ const existingPlugin = loot.game.plugins.find((plugin) => {
+ return plugin.name === resultPlugin.name;
+ });
+ if (existingPlugin) {
+ existingPlugin.isDirty = resultPlugin.isDirty;
+ existingPlugin.isPriorityGlobal = resultPlugin.isPriorityGlobal;
+ existingPlugin.masterlist = resultPlugin.masterlist;
+ existingPlugin.messages = resultPlugin.messages;
+ existingPlugin.priority = resultPlugin.priority;
+ existingPlugin.tags = resultPlugin.tags;
}
});
/* Hack to stop cards overlapping. */
@@ -186,9 +175,9 @@ function onUpdateMasterlist() {
function onSortPlugins() {
if (document.body.hasAttribute('data-conflicts')) {
/* Deactivate any existing plugin conflict filter. */
- for (let i = 0; i < loot.game.plugins.length; ++i) {
- loot.game.plugins[i].isConflictFilterChecked = false;
- }
+ loot.game.plugins.forEach((plugin) => {
+ plugin.isConflictFilterChecked = false;
+ });
/* Un-highlight any existing filter plugin. */
const cards = document.getElementById('main').getElementsByTagName('loot-plugin-card');
for (let i = 0; i < cards.length; ++i) {
@@ -197,9 +186,9 @@ function onSortPlugins() {
document.body.removeAttribute('data-conflicts');
}
- let promise = Promise.resolve('');
+ let promise = Promise.resolve();
if (loot.settings.updateMasterlist) {
- promise = promise.then(updateMasterlistNoProgress());
+ promise = promise.then(updateMasterlistNoProgress);
}
promise.then(() => {
loot.Dialog.showProgress(loot.l10n.translate('Sorting plugins...'));
@@ -211,26 +200,20 @@ function onSortPlugins() {
loot.game.oldLoadOrder = loot.game.plugins;
loot.game.loadOrder = [];
result.forEach((plugin) => {
- let found = false;
- for (let i = 0; i < loot.game.plugins.length; ++i) {
- if (loot.game.plugins[i].name === plugin.name) {
- loot.game.plugins[i].crc = plugin.crc;
- loot.game.plugins[i].isEmpty = plugin.isEmpty;
+ let existingPlugin = loot.game.plugins.find((item) => {
+ return item.name === plugin.name;
+ });
+ if (existingPlugin) {
+ existingPlugin.crc = plugin.crc;
+ existingPlugin.isEmpty = plugin.isEmpty;
- loot.game.plugins[i].messages = plugin.messages;
- loot.game.plugins[i].tags = plugin.tags;
- loot.game.plugins[i].isDirty = plugin.isDirty;
-
- loot.game.loadOrder.push(loot.game.plugins[i]);
-
- found = true;
- break;
- }
- }
- if (!found) {
- loot.game.plugins.push(new loot.Plugin(plugin));
- loot.game.loadOrder.push(loot.game.plugins[loot.game.plugins.length - 1]);
+ existingPlugin.messages = plugin.messages;
+ existingPlugin.tags = plugin.tags;
+ existingPlugin.isDirty = plugin.isDirty;
+ } else {
+ existingPlugin = new loot.Plugin(plugin);
}
+ loot.game.loadOrder.push(existingPlugin);
});
/* Now update the UI for the new order. */
@@ -250,11 +233,10 @@ function onSortPlugins() {
}).catch(handlePromiseError);
}
function onApplySort() {
- const loadOrder = [];
- loot.game.plugins.forEach((plugin) => {
- loadOrder.push(plugin.name);
+ const loadOrder = loot.game.plugins.map((plugin) => {
+ return plugin.name;
});
- return loot.query('applySort', loadOrder).then((result) => {
+ return loot.query('applySort', loadOrder).then(() => {
/* Remove old load order storage. */
delete loot.game.loadOrder;
delete loot.game.oldLoadOrder;
@@ -270,7 +252,7 @@ function onApplySort() {
document.getElementById('gameMenu').removeAttribute('disabled');
}).catch(handlePromiseError);
}
-function onCancelSort(evt) {
+function onCancelSort() {
return loot.query('cancelSort').then(() => {
/* Sort UI elements again according to stored old load order. */
loot.game.plugins = loot.game.oldLoadOrder;
@@ -313,19 +295,18 @@ function onClearAllMetadata() {
}
/* Need to empty the UI-side user metadata. */
plugins.forEach((plugin) => {
- for (let i = 0; i < loot.game.plugins.length; ++i) {
- if (loot.game.plugins[i].name === plugin.name) {
- loot.game.plugins[i].userlist = undefined;
- loot.game.plugins[i].editor = undefined;
+ const existingPlugin = loot.game.plugins.find((item) => {
+ return item.name === plugin.name;
+ });
+ if (existingPlugin) {
+ existingPlugin.userlist = undefined;
+ existingPlugin.editor = undefined;
- loot.game.plugins[i].priority = plugin.priority;
- loot.game.plugins[i].isPriorityGlobal = plugin.isPriorityGlobal;
- loot.game.plugins[i].messages = plugin.messages;
- loot.game.plugins[i].tags = plugin.tags;
- loot.game.plugins[i].isDirty = plugin.isDirty;
-
- break;
- }
+ existingPlugin.priority = plugin.priority;
+ existingPlugin.isPriorityGlobal = plugin.isPriorityGlobal;
+ existingPlugin.messages = plugin.messages;
+ existingPlugin.tags = plugin.tags;
+ existingPlugin.isDirty = plugin.isDirty;
}
});
@@ -334,21 +315,21 @@ function onClearAllMetadata() {
});
}
function onCopyContent() {
- const messages = [];
- const plugins = [];
+ let messages = [];
+ let plugins = [];
if (loot.game) {
if (loot.game.globalMessages) {
- loot.game.globalMessages.forEach((message) => {
- messages.push({
+ messages = loot.game.globalMessages.map((message) => {
+ return {
type: message.type,
content: message.content[0].str,
- });
+ };
});
}
if (loot.game.plugins) {
- loot.game.plugins.forEach((plugin) => {
- plugins.push({
+ plugins = loot.game.plugins.map((plugin) => {
+ return {
name: plugin.name,
crc: plugin.crc,
version: plugin.version,
@@ -361,7 +342,7 @@ function onCopyContent() {
messages: plugin.messages,
tags: plugin.tags,
isDirty: plugin.isDirty,
- });
+ };
});
}
} else {
@@ -375,21 +356,19 @@ function onCopyContent() {
}
loot.query('copyContent', {
- messages: messages,
- plugins: plugins,
+ messages,
+ plugins,
}).then(() => {
loot.Dialog.showNotification(loot.l10n.translate("LOOT's content has been copied to the clipboard."));
}).catch(handlePromiseError);
}
function onCopyLoadOrder() {
- const plugins = [];
+ let plugins = [];
- if (loot.game) {
- if (loot.game.plugins) {
- loot.game.plugins.forEach((plugin) =>{
- plugins.push(plugin.name);
- });
- }
+ if (loot.game && loot.game.plugins) {
+ plugins = loot.game.plugins.map((plugin) => {
+ return plugin.name;
+ });
}
loot.query('copyLoadOrder', plugins).then(() => {
@@ -557,11 +536,11 @@ function onEditorClose(evt) {
}
function onConflictsFilter(evt) {
/* Deactivate any existing plugin conflict filter. */
- for (let i = 0; i < loot.game.plugins.length; ++i) {
- if (loot.game.plugins[i].id !== evt.target.id) {
- loot.game.plugins[i].isConflictFilterChecked = false;
+ loot.game.plugins.forEach((plugin) => {
+ if (plugin.id !== evt.target.id) {
+ plugin.isConflictFilterChecked = false;
}
- }
+ });
/* Un-highlight any existing filter plugin. */
const cards = document.getElementById('main').getElementsByTagName('loot-plugin-card');
for (let i = 0; i < cards.length; ++i) {
@@ -591,19 +570,18 @@ function onClearMetadata(evt) {
return;
}
/* Need to empty the UI-side user metadata. */
- for (let i = 0; i < loot.game.plugins.length; ++i) {
- if (loot.game.plugins[i].id === evt.target.id) {
- loot.game.plugins[i].userlist = undefined;
- loot.game.plugins[i].editor = undefined;
+ const existingPlugin = loot.game.plugins.find((item) => {
+ return item.id === evt.target.id;
+ });
+ if (existingPlugin) {
+ existingPlugin.userlist = undefined;
+ existingPlugin.editor = undefined;
- loot.game.plugins[i].priority = plugin.priority;
- loot.game.plugins[i].isPriorityGlobal = plugin.isPriorityGlobal;
- loot.game.plugins[i].messages = plugin.messages;
- loot.game.plugins[i].tags = plugin.tags;
- loot.game.plugins[i].isDirty = plugin.isDirty;
-
- break;
- }
+ existingPlugin.priority = plugin.priority;
+ existingPlugin.isPriorityGlobal = plugin.isPriorityGlobal;
+ existingPlugin.messages = plugin.messages;
+ existingPlugin.tags = plugin.tags;
+ existingPlugin.isDirty = plugin.isDirty;
}
loot.Dialog.showNotification(loot.l10n.translate('The user-added metadata for "%s" has been cleared.', evt.target.getName()));
/* Now perform search again. If there is no current search, this won't
@@ -645,7 +623,7 @@ function handleUnappliedChangesClose(change) {
}).catch(handlePromiseError);
});
}
-function onQuit(evt) {
+function onQuit() {
if (!document.getElementById('applySortButton').classList.contains('hidden')) {
handleUnappliedChangesClose(loot.l10n.translate('sorted load order'));
} else if (document.body.hasAttribute('data-editors')) {
@@ -661,57 +639,10 @@ function onJumpToGeneralInfo() {
function onContentRefresh() {
/* Send a query for updated load order and plugin header info. */
loot.Dialog.showProgress(loot.l10n.translate('Refreshing data...'));
- loot.query('getGameData').then(JSON.parse).then((result) => {
+ loot.query('getGameData').then((result) => {
/* Parse the data sent from C++. */
- /* We don't want the plugin info creating cards, so don't convert
- to plugin objects. */
- const gameInfo = result;
-
- /* Now overwrite plugin data with the newly sent data. Also update
- card and li vars as they were unset when the game was switched
- from before. */
- const pluginNames = [];
- gameInfo.plugins.forEach((plugin) => {
- let foundPlugin = false;
- for (let i = 0; i < loot.game.plugins.length; ++i) {
- if (loot.game.plugins[i].name === plugin.name) {
- loot.game.plugins[i].isActive = plugin.isActive;
- loot.game.plugins[i].isEmpty = plugin.isEmpty;
- loot.game.plugins[i].loadsArchive = plugin.loadsArchive;
- loot.game.plugins[i].crc = plugin.crc;
- loot.game.plugins[i].version = plugin.version;
-
- loot.game.plugins[i].priority = plugin.priority;
- loot.game.plugins[i].isPriorityGlobal = plugin.isPriorityGlobal;
- loot.game.plugins[i].messages = plugin.messages;
- loot.game.plugins[i].tags = plugin.tags;
- loot.game.plugins[i].isDirty = plugin.isDirty;
-
- foundPlugin = true;
- break;
- }
- }
- if (!foundPlugin) {
- /* A new plugin. */
- loot.game.plugins.push(new loot.Plugin(plugin));
- }
- pluginNames.push(plugin.name);
- });
- for (let i = 0; i < loot.game.plugins.length;) {
- let foundPlugin = false;
- for (let j = 0; j < pluginNames.length; ++j) {
- if (loot.game.plugins[i].name === pluginNames[j]) {
- foundPlugin = true;
- break;
- }
- }
- if (!foundPlugin) {
- /* Remove plugin. */
- loot.game.plugins.splice(i, 1);
- } else {
- ++i;
- }
- }
+ const game = JSON.parse(result, loot.Plugin.fromJson);
+ loot.game = new loot.Game(game, loot.l10n);
/* Reapply filters. */
filterPluginData(loot.game.plugins, loot.filters);
diff --git a/src/gui/html/js/init.js b/src/gui/html/js/init.js
index c0640f46..8e152a1e 100644
--- a/src/gui/html/js/init.js
+++ b/src/gui/html/js/init.js
@@ -42,11 +42,8 @@
function setupEventHandlers() {
/* Set up handlers for filters. */
document.getElementById('hideVersionNumbers').addEventListener('change', onToggleDisplayCSS);
- document.getElementById('hideVersionNumbers').addEventListener('change', saveFilterState);
document.getElementById('hideCRCs').addEventListener('change', onToggleDisplayCSS);
- document.getElementById('hideCRCs').addEventListener('change', saveFilterState);
- document.getElementById('hideBashTags').addEventListener('change', onToggleBashTags);
- document.getElementById('hideBashTags').addEventListener('change', saveFilterState);
+ document.getElementById('hideBashTags').addEventListener('change', onToggleDisplayCSS);
document.getElementById('hideNotes').addEventListener('change', onSidebarFilterToggle);
document.getElementById('hideDoNotCleanMessages').addEventListener('change', onSidebarFilterToggle);
document.getElementById('hideInactivePlugins').addEventListener('change', onSidebarFilterToggle);