diff --git a/resources/report/js/script.js b/resources/report/js/script.js index 9df94e20..b7ba1b36 100644 --- a/resources/report/js/script.js +++ b/resources/report/js/script.js @@ -33,20 +33,120 @@ var loot = { plugins: [] }, + /* Call whenever installedGames is changed or game menu is rewritten. */ + updateEnabledGames: function() { + /* Update the disabled games in the game menu. */ + var gameMenuItems = document.getElementById('gameMenu').firstElementChild.children; + for (var i = 0; i < gameMenuItems.length; ++i) { + if (this.installedGames.indexOf(gameMenuItems[i].getAttribute('data-folder')) == -1) { + gameMenuItems[i].classList.toggle('disabled', true); + gameMenuItems[i].removeEventListener('click', changeGame, false); + } else { + gameMenuItems[i].classList.toggle('disabled', false); + gameMenuItems[i].addEventListener('click', changeGame, false); + } + } + }, + + /* Call whenever game is changed or game menu / game table are rewritten. */ + updateSelectedGame: function() { + /* Highlight game in menu. Could use fa-chevron-right instead. */ + var gameMenuItems = document.getElementById('gameMenu').children[0].children; + for (var i = 0; i < gameMenuItems.length; ++i) { + if (gameMenuItems[i].getAttribute('data-folder') == this.game.folder) { + gameMenuItems[i].getElementsByClassName('fa')[0].classList.toggle('fa-angle-double-right', true); + } else { + gameMenuItems[i].getElementsByClassName('fa')[0].classList.toggle('fa-angle-double-right', false); + } + } + + /* Also disable deletion of the game's row in the settings dialog. */ + var rows = document.getElementById('gameTable').getElementsByTagName('tbody')[0].getElementsByTagName('tr'); + for (var i = 0; i < rows.length; ++i) { + if (rows[i].getElementsByClassName('folder').length > 0) { + if (rows[i].getElementsByClassName('folder')[0].value == this.game.folder) { + document.getElementById('gameTable').setReadOnly(rows[i], ['fa-trash-o']); + } else { + document.getElementById('gameTable').setReadOnly(rows[i], ['fa-trash-o'], false); + } + } + } + }, + + /* Call whenever game is changed. */ + updateRedatePluginsButtonState: function() { + /* Also enable/disable the redate plugins option. */ + var index = undefined; + for (var i = 0; i < this.settings.games.length; ++i) { + if (this.settings.games[i].folder == this.game.folder) { + index = i; + break; + } + } + if (index != undefined && this.settings.games[index].type == 'Skyrim') { + document.getElementById('redatePluginsButton').classList.toggle('disabled', false); + } else { + document.getElementById('redatePluginsButton').classList.toggle('disabled', true); + } + }, + + /* Call whenever settings are changed. */ + updateSettingsUI: function() { + var gameSelect = document.getElementById('defaultGameSelect'); + var gameMenu = document.getElementById('gameMenu').firstElementChild; + var gameTable = document.getElementById('gameTable'); + + /* First make sure game listing elements don't have any existing entries. */ + while (gameSelect.children.length > 1) { + gameSelect.removeChild(gameSelect.lastElementChild); + } + while (gameMenu.firstElementChild) { + gameMenu.firstElementChild.removeEventListener('click', changeGame, false); + gameMenu.removeChild(gameMenu.firstElementChild); + } + gameTable.clear(); + + /* Now fill with new values. */ + this.settings.games.forEach(function(game){ + var option = document.createElement('option'); + option.value = game.folder; + option.textContent = game.name; + gameSelect.appendChild(option); + + var li = document.createElement('li'); + li.setAttribute('data-folder', game.folder); + + var icon = document.createElement('span'); + icon.className = 'fa fa-fw'; + li.appendChild(icon); + + var text = document.createElement('span'); + text.textContent = game.name; + li.appendChild(text); + + gameMenu.appendChild(li); + + var row = gameTable.addRow(game); + gameTable.setReadOnly(row, ['name','folder','type']); + }); + + gameSelect.value = this.settings.game; + document.getElementById('languageSelect').value = this.settings.language; + document.getElementById('debugVerbositySelect').value = this.settings.debugVerbosity; + document.getElementById('updateMasterlist').checked = this.settings.updateMasterlist; + }, + observer: function(changes) { changes.forEach(function(change){ if (change.name == 'installedGames') { - /* Update the disabled games in the game menu. */ - var gameMenuItems = document.getElementById('gameMenu').firstElementChild.children; - for (var i = 0; i < gameMenuItems.length; ++i) { - if (change.object[change.name].indexOf(gameMenuItems[i].getAttribute('data-folder')) == -1) { - gameMenuItems[i].classList.toggle('disabled', true); - gameMenuItems[i].removeEventListener('click', changeGame, false); - } else { - gameMenuItems[i].classList.toggle('disabled', false); - gameMenuItems[i].addEventListener('click', changeGame, false); - } - } + change.object.updateEnabledGames(); + } else if (change.name == 'settings') { + change.object.updateSettingsUI(); + change.object.updateEnabledGames(); + change.object.updateSelectedGame(); + } else if (change.name == 'game') { + change.object.updateSelectedGame(); + change.object.updateRedatePluginsButtonState(); } }); } @@ -76,9 +176,14 @@ function processCefError(err) { var marked; function saveFilterState(evt) { if (evt.currentTarget.checked) { + if (!loot.setttings.filters) { + loot.settings.filters = {}; + } loot.settings.filters[evt.currentTarget.id] = true; } else { - delete loot.settings.filters[evt.currentTarget.id]; + if (loot.setttings.filters) { + delete loot.settings.filters[evt.currentTarget.id]; + } } var request = JSON.stringify({ @@ -244,42 +349,6 @@ function showMessageBox(type, title, text) { function openLogLocation(evt) { loot.query('openLogLocation').catch(processCefError); } -function updateSelectedGame() { - /* Highlight game in menu. Could use fa-chevron-right instead. */ - var gameMenuItems = document.getElementById('gameMenu').children[0].children; - for (var i = 0; i < gameMenuItems.length; ++i) { - if (loot.game && gameMenuItems[i].getAttribute('data-folder') == loot.game.folder) { - gameMenuItems[i].getElementsByClassName('fa')[0].classList.toggle('fa-angle-double-right', true); - } else { - gameMenuItems[i].getElementsByClassName('fa')[0].classList.toggle('fa-angle-double-right', false); - } - } - - /* Also enable/disable the redate plugins option. */ - var index = undefined; - for (var i = 0; i < loot.settings.games.length; ++i) { - if (loot.game && loot.settings.games[i].folder == loot.game.folder) { - index = i; - } - } - if (index != undefined && loot.settings.games[index].type == 'Skyrim') { - document.getElementById('redatePluginsButton').classList.toggle('disabled', false); - } else { - document.getElementById('redatePluginsButton').classList.toggle('disabled', true); - } - - /* Also disable deletion of the game's row in the settings dialog. */ - var rows = document.getElementById('gameTable').getElementsByTagName('tbody')[0].getElementsByTagName('tr'); - for (var i = 0; i < rows.length; ++i) { - if (rows[i].getElementsByClassName('folder').length > 0) { - if (loot.game && rows[i].getElementsByClassName('folder')[0].value == loot.game.folder) { - document.getElementById('gameTable').setReadOnly(rows[i], ['fa-trash-o']); - } else { - document.getElementById('gameTable').setReadOnly(rows[i], ['fa-trash-o'], false); - } - } - } -} function changeGame(evt) { /* First store current game info in loot.games object. This object may not exist, so initialise it if not. */ @@ -408,9 +477,6 @@ function changeGame(evt) { /* Now update interface for new data. */ updateInterfaceWithGameInfo(); - /* Now update game menu to highlight the newly selected game. */ - updateSelectedGame(); - /* Reapply previously active filters. */ activeFilters.forEach(function(filter){ filter.click(); @@ -760,53 +826,6 @@ function closeAboutDialog(evt) { function showAboutDialog(evt) { document.getElementById('about').showModal(); } -function updateSettingsUI() { - var gameSelect = document.getElementById('defaultGameSelect'); - var gameMenu = document.getElementById('gameMenu').firstElementChild; - var gameTable = document.getElementById('gameTable'); - - /* First make sure game listing elements don't have any existing entries. */ - while (gameSelect.children.length > 1) { - gameSelect.removeChild(gameSelect.lastElementChild); - } - while (gameMenu.firstElementChild) { - gameMenu.firstElementChild.removeEventListener('click', changeGame, false); - gameMenu.removeChild(gameMenu.firstElementChild); - } - gameTable.clear(); - - /* Now fill with new values. */ - for (var i = 0; i < loot.settings.games.length; ++i) { - var option = document.createElement('option'); - option.value = loot.settings.games[i].folder; - option.textContent = loot.settings.games[i].name; - gameSelect.appendChild(option); - - var li = document.createElement('li'); - li.setAttribute('data-folder', loot.settings.games[i].folder); - - var icon = document.createElement('span'); - icon.className = 'fa fa-fw'; - li.appendChild(icon); - - var text = document.createElement('span'); - text.textContent = loot.settings.games[i].name; - li.appendChild(text); - - gameMenu.appendChild(li); - - var row = gameTable.addRow(loot.settings.games[i]); - gameTable.setReadOnly(row, ['name','folder','type']); - } - - /* Highlight game in menu. */ - updateSelectedGame(); - - gameSelect.value = loot.settings.game; - document.getElementById('languageSelect').value = loot.settings.language; - document.getElementById('debugVerbositySelect').value = loot.settings.debugVerbosity; - document.getElementById('updateMasterlist').checked = loot.settings.updateMasterlist; -} function closeSettingsDialog(evt) { if (!areSettingsValid()) { return; @@ -822,6 +841,7 @@ function closeSettingsDialog(evt) { language: document.getElementById('languageSelect').value, lastGame: loot.settings.lastGame, updateMasterlist: document.getElementById('updateMasterlist').checked, + filters: loot.settings.filters, }; /* Send the settings back to the C++ side. */ @@ -841,11 +861,10 @@ function closeSettingsDialog(evt) { } loot.settings = settings; - updateSettingsUI(); }).catch(processCefError); } else { /* Re-apply the existing settings to the settings dialog elements. */ - updateSettingsUI(); + loot.updateSettingsUI(); } dialog.close(); } @@ -1076,11 +1095,7 @@ function initVars() { try { loot.settings = JSON.parse(results[2]); - if (loot.settings.filters == undefined) { - loot.settings.filters = {}; - } applySavedFilters(); - updateSettingsUI(); } catch (e) { console.log(e); console.log('getSettings response: ' + results[2]);