diff --git a/src/gui/html/js/dom.js b/src/gui/html/js/dom.js
index 3df6fbd5..291c3b10 100644
--- a/src/gui/html/js/dom.js
+++ b/src/gui/html/js/dom.js
@@ -52,27 +52,40 @@
}
},
- updateSettingsDialog(settings, installedGames, gameFolder) {
- const gameSelect = document.getElementById('defaultGameSelect');
+ createGameItem(game) {
+ const menuItem = document.createElement('paper-item');
+ menuItem.setAttribute('value', game.folder);
+ menuItem.textContent = game.name;
+
+ return menuItem;
+ },
+
+ setGameMenuItems(games) {
const gameMenu = document.getElementById('gameMenu');
+
+ /* First make sure game listing elements don't have any existing entries. */
+ while (gameMenu.firstElementChild) {
+ gameMenu.removeChild(gameMenu.firstElementChild);
+ }
+
+ games.forEach((game) => {
+ gameMenu.appendChild(this.createGameItem(game));
+ });
+ },
+
+ updateSettingsDialog(settings) {
+ const gameSelect = document.getElementById('defaultGameSelect');
const 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.removeChild(gameMenu.firstElementChild);
- }
gameTable.clear();
/* Now fill with new values. */
settings.games.forEach((game) => {
- const menuItem = document.createElement('paper-item');
- menuItem.setAttribute('value', game.folder);
- menuItem.textContent = game.name;
- gameMenu.appendChild(menuItem);
- gameSelect.appendChild(menuItem.cloneNode(true));
+ gameSelect.appendChild(this.createGameItem(game));
const row = gameTable.addRow(game);
gameTable.setReadOnly(row, ['name', 'folder', 'type']);
@@ -82,9 +95,6 @@
document.getElementById('languageSelect').value = settings.language;
document.getElementById('enableDebugLogging').checked = settings.enableDebugLogging;
document.getElementById('updateMasterlist').checked = settings.updateMasterlist;
-
- this.updateEnabledGames(installedGames);
- this.updateSelectedGame(gameFolder);
},
};
}));
diff --git a/src/gui/html/js/events.js b/src/gui/html/js/events.js
index 808ec37c..3cab21aa 100644
--- a/src/gui/html/js/events.js
+++ b/src/gui/html/js/events.js
@@ -365,36 +365,45 @@ function onSidebarClick(evt) {
function areSettingsValid() {
return document.getElementById('gameTable').validate();
}
-function onCloseSettingsDialog(evt) {
- if (evt.target.classList.contains('accept')) {
- if (!areSettingsValid()) {
- return;
- }
-
- /* Update the JS variable values. */
- const settings = {
- enableDebugLogging: document.getElementById('enableDebugLogging').checked,
- game: document.getElementById('defaultGameSelect').value,
- games: document.getElementById('gameTable').getRowsData(false),
- 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. */
- loot.query('closeSettings', settings).then(JSON.parse).then((installedGames) => {
- loot.installedGames = installedGames;
- loot.dom.updateEnabledGames(installedGames);
- }).catch(handlePromiseError).then(() => {
- loot.settings = settings;
- loot.dom.updateSettingsDialog(loot.settings, loot.installedGames, loot.game.folder);
- }).catch(handlePromiseError);
- } else {
- /* Re-apply the existing settings to the settings dialog elements. */
- loot.dom.updateSettingsDialog(loot.settings, loot.installedGames, loot.game.folder);
+function onApplySettings(evt) {
+ if (!areSettingsValid()) {
+ evt.stopPropagation();
}
- evt.target.parentElement.parentElement.close();
+}
+function onCloseSettingsDialog(evt) {
+ if (evt.target.id !== 'settingsDialog') {
+ /* The event can be fired by dropdowns in the settings dialog, so ignore
+ any events that don't come from the dialog itself. */
+ return;
+ }
+ if (!evt.detail.confirmed) {
+ /* Re-apply the existing settings to the settings dialog elements. */
+ loot.dom.updateSettingsDialog(loot.settings);
+ return;
+ }
+
+ /* Update the JS variable values. */
+ const settings = {
+ enableDebugLogging: document.getElementById('enableDebugLogging').checked,
+ game: document.getElementById('defaultGameSelect').value,
+ games: document.getElementById('gameTable').getRowsData(false),
+ 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. */
+ loot.query('closeSettings', settings).then(JSON.parse).then((installedGames) => {
+ loot.installedGames = installedGames;
+ loot.dom.updateEnabledGames(installedGames);
+ }).catch(handlePromiseError).then(() => {
+ loot.settings = settings;
+ loot.dom.updateSettingsDialog(loot.settings);
+ loot.dom.setGameMenuItems(loot.settings.games);
+ loot.dom.updateEnabledGames(loot.installedGames);
+ loot.dom.updateSelectedGame(loot.game.folder);
+ }).catch(handlePromiseError);
}
function onShowSettingsDialog() {
document.getElementById('settingsDialog').open();
diff --git a/src/gui/html/js/init.js b/src/gui/html/js/init.js
index 25e9128c..4f72d5a7 100644
--- a/src/gui/html/js/init.js
+++ b/src/gui/html/js/init.js
@@ -82,8 +82,8 @@
/* Set up event handlers for settings dialog. */
const settings = document.getElementById('settingsDialog');
- settings.getElementsByClassName('accept')[0].addEventListener('click', onCloseSettingsDialog);
- settings.getElementsByClassName('cancel')[0].addEventListener('click', onCloseSettingsDialog);
+ settings.addEventListener('iron-overlay-closed', onCloseSettingsDialog);
+ settings.querySelector('[dialog-confirm]').addEventListener('tap', onApplySettings);
/* Set up handler for opening and closing editors. */
document.body.addEventListener('loot-editor-open', onEditorOpen);
@@ -214,7 +214,10 @@
function setSettings(appData) {
return query('getSettings').then(JSON.parse).then((result) => {
appData.settings = result;
- dom.updateSettingsDialog(appData.settings, appData.installedGames, appData.game.folder);
+ dom.updateSettingsDialog(appData.settings);
+ loot.dom.setGameMenuItems(appData.settings.games);
+ loot.dom.updateEnabledGames(appData.installedGames);
+ loot.dom.updateSelectedGame(appData.game.folder);
});
}
@@ -260,7 +263,10 @@
loot.filters = new Filters(loot.l10n);
translateStaticText(loot.l10n);
/* Also need to update the settings UI. */
- dom.updateSettingsDialog(loot.settings, loot.installedGames, loot.game.folder);
+ dom.updateSettingsDialog(loot.settings);
+ loot.dom.setGameMenuItems(loot.settings.games);
+ loot.dom.updateEnabledGames(loot.installedGames);
+ loot.dom.updateSelectedGame(loot.game.folder);
}).then(() => {
return displayInitErrors();
}).then((result) => {