Implemented observers for loot.game, loot.settings.

For #247.
This commit is contained in:
WrinklyNinja
2014-08-25 14:18:59 +01:00
parent d68d773e17
commit e7579b10e9
+119 -104
View File
@@ -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]);