diff --git a/src/gui/html/js/events.js b/src/gui/html/js/events.js index a5b0d8e3..87378a27 100644 --- a/src/gui/html/js/events.js +++ b/src/gui/html/js/events.js @@ -478,17 +478,18 @@ function onCloseSettingsDialog(evt) { loot.query(request).then(function(result){ try { - loot.installedGames = JSON.parse(result); + setInstalledGames(JSON.parse(result)); } catch (e) { console.log(e); console.log('getInstalledGames response: ' + results[1]); } loot.settings = settings; + updateSettingsUI(); }).catch(processCefError); } else { /* Re-apply the existing settings to the settings dialog elements. */ - loot.updateSettingsUI(); + updateSettingsUI(); } evt.target.parentElement.close(); } diff --git a/src/gui/html/js/helpers.js b/src/gui/html/js/helpers.js index 37a0118a..bea6e87b 100644 --- a/src/gui/html/js/helpers.js +++ b/src/gui/html/js/helpers.js @@ -1,3 +1,4 @@ +'use strict'; function processCefError(err) { /* Error.stack seems to be Chromium-specific. It gives a lot more useful info than just the error message. Also, this can be used to catch any @@ -157,3 +158,73 @@ function updateSelectedGame(gameFolder) { } } } + +/* Call whenever installedGames is changed or game menu is rewritten. */ +function updateEnabledGames(installedGames) { + /* Update the disabled games in the game menu. */ + var gameMenuItems = document.getElementById('gameMenu').children; + for (var i = 0; i < gameMenuItems.length; ++i) { + if (installedGames.indexOf(gameMenuItems[i].getAttribute('value')) == -1) { + gameMenuItems[i].setAttribute('disabled', true); + gameMenuItems[i].removeEventListener('click', onChangeGame, false); + } else { + gameMenuItems[i].removeAttribute('disabled'); + gameMenuItems[i].addEventListener('click', onChangeGame, false); + } + } +} +function setInstalledGames(installedGames) { + loot.installedGames = installedGames; + updateEnabledGames(installedGames); +} +/* Call whenever settings are changed. */ +function updateSettingsUI() { + var gameSelect = document.getElementById('defaultGameSelect'); + var gameMenu = document.getElementById('gameMenu'); + 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', onChangeGame, false); + gameMenu.removeChild(gameMenu.firstElementChild); + } + gameTable.clear(); + + /* Now fill with new values. */ + loot.settings.games.forEach(function(game){ + var menuItem = document.createElement('paper-item'); + menuItem.setAttribute('value', game.folder); + menuItem.setAttribute('noink', ''); + menuItem.textContent = game.name; + gameMenu.appendChild(menuItem); + gameSelect.appendChild(menuItem.cloneNode(true)); + + var row = gameTable.addRow(game); + gameTable.setReadOnly(row, ['name','folder','type']); + }); + + gameSelect.value = loot.settings.game; + document.getElementById('languageSelect').value = loot.settings.language; + document.getElementById('enableDebugLogging').checked = loot.settings.enableDebugLogging; + document.getElementById('updateMasterlist').checked = loot.settings.updateMasterlist; + + updateEnabledGames(loot.installedGames); + updateSelectedGame(loot.game.folder); +} +/* Returns a cefQuery as a Promise. */ +var loot = loot || {}; +loot.query = function query(request) { + return new Promise(function(resolve, reject) { + window.cefQuery({ + request: request, + persistent: false, + onSuccess: resolve, + onFailure: function(errorCode, errorMessage) { + reject(Error('Error code: ' + errorCode + '; ' + errorMessage)) + } + }); + }); +} diff --git a/src/gui/html/js/init.js b/src/gui/html/js/init.js index e5263c9e..8d02243f 100644 --- a/src/gui/html/js/init.js +++ b/src/gui/html/js/init.js @@ -172,7 +172,7 @@ function initVars() { select.setAttribute('value', select.firstElementChild.getAttribute('value')); try { - loot.installedGames = JSON.parse(results[1]); + setInstalledGames(JSON.parse(results[1])); } catch (e) { console.log(e); console.log('getInstalledGames response: ' + results[1]); @@ -180,6 +180,7 @@ function initVars() { try { loot.settings = JSON.parse(results[2]); + updateSettingsUI(); restoreFilterStates(); } catch (e) { console.log(e); @@ -191,7 +192,7 @@ function initVars() { loot.l10n.load().then(() => { loot.translateStaticText(loot.l10n); /* Also need to update the settings UI. */ - loot.updateSettingsUI(); + updateSettingsUI(); }).catch(processCefError); }).then(function(){ if (result) { @@ -231,10 +232,6 @@ window.addEventListener('polymer-ready', function(e) { /* Set the plugin list's scroll target to its parent. */ document.getElementById('main').lastElementChild.scrollTarget = document.getElementById('main'); - /* Register object observers. */ - Object.observe(loot, loot.observer); - Object.observe(loot.game, loot.gameObserver); - /* Make sure settings are what I want. */ marked.setOptions({ gfm: true, diff --git a/src/gui/html/js/loot.js b/src/gui/html/js/loot.js deleted file mode 100644 index b6aa2df7..00000000 --- a/src/gui/html/js/loot.js +++ /dev/null @@ -1,82 +0,0 @@ -var loot = { - installedGames: [], - settings: {}, - - /* 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').children; - for (var i = 0; i < gameMenuItems.length; ++i) { - if (this.installedGames.indexOf(gameMenuItems[i].getAttribute('value')) == -1) { - gameMenuItems[i].setAttribute('disabled', true); - gameMenuItems[i].removeEventListener('click', onChangeGame, false); - } else { - gameMenuItems[i].removeAttribute('disabled'); - gameMenuItems[i].addEventListener('click', onChangeGame, false); - } - } - }, - - /* Call whenever settings are changed. */ - updateSettingsUI: function() { - var gameSelect = document.getElementById('defaultGameSelect'); - var gameMenu = document.getElementById('gameMenu'); - 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', onChangeGame, false); - gameMenu.removeChild(gameMenu.firstElementChild); - } - gameTable.clear(); - - /* Now fill with new values. */ - this.settings.games.forEach(function(game){ - var menuItem = document.createElement('paper-item'); - menuItem.setAttribute('value', game.folder); - menuItem.setAttribute('noink', ''); - menuItem.textContent = game.name; - gameMenu.appendChild(menuItem); - gameSelect.appendChild(menuItem.cloneNode(true)); - - 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('enableDebugLogging').checked = this.settings.enableDebugLogging; - document.getElementById('updateMasterlist').checked = this.settings.updateMasterlist; - - this.updateEnabledGames(); - updateSelectedGame(this.game.folder); - }, - - /* Observer for loot members. */ - observer: function(changes) { - changes.forEach(function(change){ - if (change.name == 'installedGames') { - change.object.updateEnabledGames(); - } else if (change.name == 'settings') { - change.object.updateSettingsUI(); - } - }); - }, - - /* Returns a cefQuery as a Promise. */ - query: function(request) { - return new Promise(function(resolve, reject) { - window.cefQuery({ - request: request, - persistent: false, - onSuccess: resolve, - onFailure: function(errorCode, errorMessage) { - reject(Error('Error code: ' + errorCode + '; ' + errorMessage)) - } - }); - }); - } -};